<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網易首頁 > 網易號 > 正文 申請入駐

      基于強化學習的量化交易框架 TensorTrade

      0
      分享至

      打開交易圖表,堆上十個技術指標,然后對著屏幕發呆不知道下一步怎么操作——這場景對交易員來說太熟悉了。如果把歷史數據丟給計算機,告訴它“去試錯”。賺了有獎勵,虧了有懲罰。讓它在不斷的嘗試和失敗中學習,最終迭代出一個不說完美、但至少能邏輯自洽的交易策略。

      這就是TensorTrade的核心邏輯。

      TensorTrade 是一個專注于利用強化學習 (Reinforcement Learning, RL)構建和訓練交易算法的開源 Python 框架。



      數據獲取與特征工程

      這里用 yfinance 抓取數據,配合 pandas_ta 計算技術指標。對數收益率 (Log Returns)、RSI 和 MACD 是幾個比較基礎的特征輸入。

      pip install yfinance pandas_ta
      import yfinance as yf
      import pandas_ta as ta
      import pandas as pd
      # Pick your ticker
      TICKER = "TTRD" # TODO: change this to something real, e.g. "AAPL", "BTC-USD"
      TRAIN_START_DATE = "2021-02-09"
      TRAIN_END_DATE = "2021-09-30"
      EVAL_START_DATE = "2021-10-01"
      EVAL_END_DATE = "2021-11-12"
      def build_dataset(ticker, start, end, filename):
      # 1. Download hourly OHLCV data
      df = yf.Ticker(ticker).history(
      start=start,
      end=end,
      interval="60m"
      )
      # 2. Clean up
      df = df.drop(["Dividends", "Stock Splits"], axis=1)
      df["Volume"] = df["Volume"].astype(int)
      # 3. Add some basic features
      df.ta.log_return(append=True, length=16)
      df.ta.rsi(append=True, length=14)
      df.ta.macd(append=True, fast=12, slow=26)
      # 4. Move Datetime from index to column
      df = df.reset_index()
      # 5. Save
      df.to_csv(filename, index=False)
      print(f"Saved {filename} with {len(df)} rows")
      build_dataset(TICKER, TRAIN_START_DATE, TRAIN_END_DATE, "training.csv")
      build_dataset(TICKER, EVAL_START_DATE, EVAL_END_DATE, "evaluation.csv")

      腳本跑完,目錄下會生成 training.csv 和 evaluation.csv。包含了 OHLCV 基礎數據和幾個預處理好的指標。這些就是訓練 RL 模型的數據。

      構建 TensorTrade 交互環境

      強化學習沒法直接使用CSV 文件。所以需要一個標準的交互環境 (Environment):能夠輸出當前狀態 (State),接收智能體的動作 (Action),并反饋獎勵 (Reward)。

      TensorTrade 把這個過程模塊化了:

      • Instrument:定義交易標的(如 USD, TTRD)。
      • Wallet:管理資產余額。
      • Portfolio:錢包組合。
      • Stream / DataFeed:處理特征數據流。
      • reward_scheme / action_scheme:定義怎么操作,以及操作的好壞怎么評分。

      pip install tensortrade

      下面是一個環境工廠函數 (Environment Factory) 的實現,設計得比較輕量,這樣可以方便后續接入 Ray:

      import os
      import pandas as pd
      from tensortrade.feed.core import DataFeed, Stream
      from tensortrade.oms.instruments import Instrument
      from tensortrade.oms.exchanges import Exchange, ExchangeOptions
      from tensortrade.oms.services.execution.simulated import execute_order
      from tensortrade.oms.wallets import Wallet, Portfolio
      import tensortrade.env.default as default
      def create_env(config):
      """
      Build a TensorTrade environment from a CSV.
      config needs:
      - csv_filename
      - window_size
      - reward_window_size
      - max_allowed_loss
      """
      # 1. Read the dataset
      dataset = (
      pd.read_csv(config["csv_filename"], parse_dates=["Datetime"])
      .fillna(method="backfill")
      .fillna(method="ffill")
      )
      # 2. Price stream (we'll trade on Close)
      commission = 0.0035 # 0.35%, tweak this to your broker
      price = Stream.source(
      list(dataset["Close"]), dtype="float"
      ).rename("USD-TTRD")
      options = ExchangeOptions(commission=commission)
      exchange = Exchange("TTSE", service=execute_order, options=options)(price)
      # 3. Instruments and wallets
      USD = Instrument("USD", 2, "US Dollar")
      TTRD = Instrument("TTRD", 2, "TensorTrade Corp") # just a label
      cash_wallet = Wallet(exchange, 1000 * USD) # start with $1000
      asset_wallet = Wallet(exchange, 0 * TTRD) # start with zero TTRD
      portfolio = Portfolio(USD, [cash_wallet, asset_wallet])
      # 4. Renderer feed (optional, useful for plotting later)
      renderer_feed = DataFeed([
      Stream.source(list(dataset["Datetime"])).rename("date"),
      Stream.source(list(dataset["Open"]), dtype="float").rename("open"),
      Stream.source(list(dataset["High"]), dtype="float").rename("high"),
      Stream.source(list(dataset["Low"]), dtype="float").rename("low"),
      Stream.source(list(dataset["Close"]), dtype="float").rename("close"),
      Stream.source(list(dataset["Volume"]), dtype="float").rename("volume"),
      ])
      renderer_feed.compile()
      # 5. Feature feed for the RL agent
      features = []
      # Skip Datetime (first column) and stream everything else
      for col in dataset.columns[1:]:
      s = Stream.source(list(dataset[col]), dtype="float").rename(col)
      features.append(s)
      feed = DataFeed(features)
      feed.compile()
      # 6. Reward and action scheme
      reward_scheme = default.rewards.SimpleProfit(
      window_size=config["reward_window_size"]
      )
      action_scheme = default.actions.BSH(
      cash=cash_wallet,
      asset=asset_wallet
      )
      # 7. Put everything together in an environment
      env = default.create(
      portfolio=portfolio,
      action_scheme=action_scheme,
      reward_scheme=reward_scheme,
      feed=feed,
      renderer=[],
      renderer_feed=renderer_feed,
      window_size=config["window_size"],
      max_allowed_loss=config["max_allowed_loss"]
      )
      return env

      這樣“游戲”規則就已經定好了:觀察最近 N 根 K 線和指標(State),決定買賣持(Action),目標是讓一段時間內的利潤最大化(Reward)。

      基于 Ray RLlib 與 PPO 算法的模型訓練

      底層環境搭好,接下來讓Ray RLlib介入處理 RL 的核心邏輯。

      選用PPO (Proximal Policy Optimization)算法,這在連續控制和離散動作空間都有不錯的表現。為了找到更優解,順手做一個簡單的超參數網格搜索:網絡架構、學習率、Minibatch 大小,都跑一遍試試。

      pip install "ray[rllib]"

      訓練腳本如下:

      import os
      import ray
      from ray import tune
      from ray.tune.registry import register_env
      from your_module import create_env # wherever you defined create_env
      # Some hyperparameter grids to try
      FC_SIZE = tune.grid_search([
      [256, 256],
      [1024],
      [128, 64, 32],
      ])
      LEARNING_RATE = tune.grid_search([
      0.001,
      0.0005,
      0.00001,
      ])
      MINIBATCH_SIZE = tune.grid_search([
      5,
      10,
      20,
      ])
      cwd = os.getcwd()
      # Register our custom environment with RLlib
      register_env("MyTrainingEnv", lambda cfg: create_env(cfg))
      env_config_training = {
      "window_size": 14,
      "reward_window_size": 7,
      "max_allowed_loss": 0.10, # cut episodes early if loss > 10%
      "csv_filename": os.path.join(cwd, "training.csv"),
      }
      env_config_evaluation = {
      "max_allowed_loss": 1.00,
      "csv_filename": os.path.join(cwd, "evaluation.csv"),
      }
      ray.init(ignore_reinit_error=True)
      analysis = tune.run(
      run_or_experiment="PPO",
      name="MyExperiment1",
      metric="episode_reward_mean",
      mode="max",
      stop={
      "training_iteration": 5, # small for demo, increase in real runs
      },
      config={
      "env": "MyTrainingEnv",
      "env_config": env_config_training,
      "log_level": "WARNING",
      "framework": "torch", # or "tf"
      "ignore_worker_failures": True,
      "num_workers": 1,
      "num_envs_per_worker": 1,
      "num_gpus": 0,
      "clip_rewards": True,
      "lr": LEARNING_RATE,
      "gamma": 0.50, # discount factor
      "observation_filter": "MeanStdFilter",
      "model": {
      "fcnet_hiddens": FC_SIZE,
      },
      "sgd_minibatch_size": MINIBATCH_SIZE,
      "evaluation_interval": 1,
      "evaluation_config": {
      "env_config": env_config_evaluation,
      "explore": False, # no exploration during evaluation
      },
      },
      num_samples=1,
      keep_checkpoints_num=10,
      checkpoint_freq=1,
      )

      這段代碼本質上是在運行一場“交易機器人錦標賽”。Ray 會根據定義的參數組合并行訓練多個 PPO 智能體,追蹤它們的平均回合獎勵,并保存下表現最好的 Checkpoint 供后續調用。

      自定義獎勵機制 (PBR)

      默認的 SimpleProfit 獎勵邏輯很簡單,但實戰中往往過于粗糙。我們有時需要根據具體的交易邏輯來重塑獎勵函數。比如說基于持倉的獎勵方案PBR (Position-Based Reward)

      • 維護當前持倉狀態(多頭或空頭)。
      • 監控價格變動。
      • 獎勵計算= 價格變動 × 持倉方向。

      價格漲了你做多,給正反饋;價格跌了你做空,也給正反饋。反之則是懲罰。

      from tensortrade.env.default.rewards import RewardScheme
      from tensortrade.feed.core import DataFeed, Stream
      class PBR(RewardScheme):
      """
      Position-Based Reward (PBR)
      Rewards the agent based on price changes and its current position.
      """
      registered_name = "pbr"
      def __init__(self, price: Stream):
      super().__init__()
      self.position = -1 # start flat/short
      # Price differences
      r = Stream.sensor(price, lambda p: p.value, dtype="float").diff()
      # Position stream
      position = Stream.sensor(self, lambda rs: rs.position, dtype="float")
      # Reward = price_change * position
      reward = (r * position).fillna(0).rename("reward")
      self.feed = DataFeed([reward])
      self.feed.compile()
      def on_action(self, action: int):
      # Simple mapping: action 0 = long, everything else = short
      self.position = 1 if action == 0 else -1
      def get_reward(self, portfolio):
      return self.feed.next()["reward"]
      def reset(self):
      self.position = -1
      self.feed.reset()

      接入也很簡單,在 create_env 函數里替換掉原來的 reward_scheme 即可:

      reward_scheme = PBR(price)

      這樣改的好處是反饋更密集。智能體不需要等到最后平倉才知道賺沒賺,每一個 step 都能收到關于“是否站對了隊”的信號。



      后續優化方向與建議

      這套流程跑通只是個開始,想要真正可用,還有很多工作要做 比如:

      • 數據置換:代碼里的 TTRD 只是個占位符,換成真實的標的(股票、Crypto、指數)。
      • 特征工程:RSI 和 MACD 只是拋磚引玉,試試 ATR、布林帶,或者引入更長時間周期的特征。
      • 參數調優:gamma(折扣因子)、window_size(觀測窗口)對策略風格影響巨大,值得花時間去掃參。
      • 基準測試:這一步最關鍵。把你訓練出來的 RL 策略和 Buy & Hold(買入持有)比一比,甚至和隨機策略比一比。如果跑不過隨機策略,那就得從頭檢查了。

      最后別忘了,我們只是研究,所以不要直接實盤。模型在訓練集上大殺四方是常態,能通過樣本外測試和模擬盤 (Paper Trading) 的考驗才是真本事。

      https://avoid.overfit.cn/post/8c9e08414e514c73ab3aefd694294f79

      作者CodeBun

      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關推薦
      熱點推薦
      伊朗最大“內鬼”被抓?革命衛隊:勾結以色列,指揮官卡尼被拘!

      伊朗最大“內鬼”被抓?革命衛隊:勾結以色列,指揮官卡尼被拘!

      青青子衿
      2026-03-05 11:57:03
      打瘋了!東契奇首節狂轟22+5三分 生涯30次單節20+升歷史第四

      打瘋了!東契奇首節狂轟22+5三分 生涯30次單節20+升歷史第四

      醉臥浮生
      2026-03-07 12:13:33
      伊拉克庫爾德第一夫人宣言:我們不是任人驅使的炮灰!

      伊拉克庫爾德第一夫人宣言:我們不是任人驅使的炮灰!

      勝研集
      2026-03-06 13:44:23
      廣東一女子不愿上班常年坐街邊,因長得好看被路人投喂:又懶又饞

      廣東一女子不愿上班常年坐街邊,因長得好看被路人投喂:又懶又饞

      明智家庭教育
      2026-03-06 17:19:16
      美以伊軍事沖突最大副作用,是斬斷了俄羅斯的“救命稻草”

      美以伊軍事沖突最大副作用,是斬斷了俄羅斯的“救命稻草”

      廖保平
      2026-03-05 12:08:52
      “不想為以色列賣命”:帝國最后的遮羞布,美式民主終成笑話

      “不想為以色列賣命”:帝國最后的遮羞布,美式民主終成笑話

      怪口歷史的K先生
      2026-03-06 15:22:51
      為何關閉霍爾木茲海峽就能掐全球脖子?因為伊朗原油是全世界最好的

      為何關閉霍爾木茲海峽就能掐全球脖子?因為伊朗原油是全世界最好的

      風向觀察
      2026-03-06 21:31:15
      兩會不到3天,5大好消息傳來!老百姓暗暗叫好:希望國家盡快落實

      兩會不到3天,5大好消息傳來!老百姓暗暗叫好:希望國家盡快落實

      談史論天地
      2026-03-07 06:54:29
      1979年,張國燾凍死在養老院,許世友:除了主席,沒人是他的對手

      1979年,張國燾凍死在養老院,許世友:除了主席,沒人是他的對手

      文史季季紅
      2026-03-05 13:35:03
      寫入教科書的一天:F-35在德黑蘭完成全球首次實戰空對空擊殺

      寫入教科書的一天:F-35在德黑蘭完成全球首次實戰空對空擊殺

      斌聞天下
      2026-03-06 07:30:03
      伊方:因美以襲擊喪生的伊朗人三成為青少年

      伊方:因美以襲擊喪生的伊朗人三成為青少年

      環球網資訊
      2026-03-07 06:39:29
      為什么美國的華人華裔地位那么低 網友從各方面分析 真就那樣

      為什么美國的華人華裔地位那么低 網友從各方面分析 真就那樣

      侃神評故事
      2026-03-06 07:10:03
      我包養過一個女大學生,七年花了一千多萬

      我包養過一個女大學生,七年花了一千多萬

      煙火人間故事匯
      2026-03-06 23:05:03
      性壓抑已經變態至此了?

      性壓抑已經變態至此了?

      黯泉
      2026-03-07 11:28:43
      蘿莉島,是進入核心圈層的投名狀,你猜他們為什么都穿紅皮鞋

      蘿莉島,是進入核心圈層的投名狀,你猜他們為什么都穿紅皮鞋

      百曉生談歷史
      2026-03-05 22:00:08
      一份“煮熟的三文魚”火了,原來低認知的家長,真能搞出人命!

      一份“煮熟的三文魚”火了,原來低認知的家長,真能搞出人命!

      妍妍教育日記
      2026-03-07 08:45:06
      伊朗萬萬沒想到,自家王牌武器遭到破解,美軍多了一張底牌

      伊朗萬萬沒想到,自家王牌武器遭到破解,美軍多了一張底牌

      空天力量
      2026-03-06 13:09:18
      上次被發現還是1911年!上海寶山驚現1只,專家:可能是坐船來的

      上次被發現還是1911年!上海寶山驚現1只,專家:可能是坐船來的

      萬象硬核本尊
      2026-03-06 23:54:22
      女子實名舉報某團外賣:不上大額券就讓我變成“凌晨營業”,你們真黑!

      女子實名舉報某團外賣:不上大額券就讓我變成“凌晨營業”,你們真黑!

      回旋鏢
      2026-03-06 21:13:59
      塔圖姆復出15分12板7助攻凱爾特人大勝獨行俠,布朗24分7板7助

      塔圖姆復出15分12板7助攻凱爾特人大勝獨行俠,布朗24分7板7助

      湖人崛起
      2026-03-07 10:25:09
      2026-03-07 13:43:00
      deephub incentive-icons
      deephub
      CV NLP和數據挖掘知識
      1940文章數 1456關注度
      往期回顧 全部

      科技要聞

      OpenClaw爆火,六位"養蝦人"自述與AI共生

      頭條要聞

      特朗普突然放話"先解決伊朗后解決古巴" 梅西聽懵了

      頭條要聞

      特朗普突然放話"先解決伊朗后解決古巴" 梅西聽懵了

      體育要聞

      塔圖姆歸來:凱爾特人的春之綠

      娛樂要聞

      周杰倫田馥甄的“JH戀” 被扒得底朝天

      財經要聞

      針對"不敢休、不讓休"怪圈 國家出手了

      汽車要聞

      逃離ICU,上汽通用“止血”企穩

      態度原創

      親子
      旅游
      數碼
      家居
      藝術

      親子要聞

      六個月寶寶查出散光,原因竟是父母長期身旁玩手機,媽媽懵了:我一直以為他閉著眼就沒事

      旅游要聞

      文旅部部長:7名外國游客到上海旅游,買了40箱貨;“成為中國人”成了熱詞

      數碼要聞

      蘋果M5 Pro芯片GeekBench跑分曝光:多核破2.8萬

      家居要聞

      暖棕撞色 輕法奶油風

      藝術要聞

      Mark Grantham | 城市街景

      無障礙瀏覽 進入關懷版