iT邦幫忙

2024 iThome 鐵人賽

DAY 8
0
AI/ ML & Data

自動交易程式探索系列 第 8

Day 8 - 訓練DRL做動態的資產配置 (1/2)

  • 分享至 

  • xImage
  •  

參考資料

FinRL_PortfolioAllocation_NeurIPS_2020.ipynb
FinRL_PortfolioAllocation_NeurIPS_2020.py
FinRL for Quantitative Finance: Tutorial for Portfolio Allocation
-

投資組合配置(Portfolio Allocation) 是 FinRL 入門教程之一,旨在介紹如何使用深度強化學習(DRL)模型來優化投資組合的動態資金配置。該教程通過與傳統方法的比較,展示了 DRL 在投資組合管理中的潛力。

本文將基於道瓊斯工業平均指數(DOW 30)的成分股,使用日線級別的數據進行分析。我們將比較 DRL 方法與傳統的均值-方差優化(MVO)和道瓊斯工業平均指數(DJI)的表現。

比較基準:MVO 和 DJI

  • MVO(均值-方差優化):一種傳統的投資組合優化方法,旨在通過平衡預期回報和風險來確定最優的資產配置。MVO 可以是靜態的(一次性計算並持有)或動態的(定期重新計算和再平衡)。
  • DJI(道瓊斯工業平均指數):作為市場基準,代表了整體市場的表現。

在此教學中使用了每日動態再平衡的 MVO 策略作為比較基準,以更公平地評估 DRL 模型的動態資產配置能力。

這篇教學使用每日動態再平衡的 MVO 策略主要是為了對齊DRL 動態的 Portfolio Allocation的行為。
從結果來看每日動態再平衡的 MVO 策略效果很普通,跟前篇教學使用 MVO 在計算資產分配比例後就持有直至到期日的策略比較起來,獲利差了很多。

使用資料集

  • 資產標的:道瓊斯工業平均指數(DOW30)的成分股
  • 完整資料區間:2008-01-01 至 2021-10-31
  • 訓練資料區間:2009-01-01 至 2020-07-01
  • 回測資料區間:2020-01-01 至 2021-10-31

資料處理重點

  1. 首年數據剔除:由於 StockPortfolioEnv 需要計算一年前的協方差列表(cov_list),因此 2008 年的資料不被使用。
  2. 訓練資料區間回測資料區間重疊:訓練資料與回測資料部分重疊,這是 FinRL 設計的一部分,旨在提高模型在不同市場狀況下的泛化能力。

    之後會測試一下如果不使用重疊的資料績效會掉多少

下載/保存之後使用的資料

以下是資料下載與處理的主要程式碼:

from finrl import config
from finrl import config_tickers
from finrl.meta.data_processors.processor_yahoofinance import YahooFinanceProcessor
from finrl.meta.env_portfolio_allocation.env_portfolio import StockPortfolioEnv
from finrl.meta.preprocessor.preprocessors import FeatureEngineer, data_split
import os
import pandas as pd

# 設定環境
TIME_INTERVAL = '1D'
START_DATE = '2008-01-01'
END_DATE = '2021-10-31'
RAW_DATA_PATH = f'./datasets/DOW30_{TIME_INTERVAL}_{START_DATE}_to_{END_DATE}.csv'

TRAIN_START_DATE = '2009-01-01'
TRAIN_END_DATE = '2020-07-01'
TRADE_START_DATE = '2020-01-01'
    
## Part 3. Download Data
print(config_tickers.DOW_30_TICKER)
if not os.path.exists(RAW_DATA_PATH):
    dp = YahooFinanceProcessor()
    df = dp.download_data(start_date=START_DATE,
                          end_date=END_DATE,
                          ticker_list=config_tickers.DOW_30_TICKER, 
                          time_interval=TIME_INTERVAL)
    df.to_csv(RAW_DATA_PATH)
else:
    df = pd.read_csv(RAW_DATA_PATH)
if 'date' not in df.columns and 'timestamp' in df.columns:
    df = df.rename(columns={'timestamp': 'date'})

使用 FinRL 的 StockPortfolioEnv

先前的 DRL 自動交易策略範例中使用的是 StockTradingEnv,此處則改用 StockPortfolioEnv 的 GYM 環境來訓練 DRL。以下將比較這兩者的區別及使用原因。

StockPortfolioEnv vs StockTradingEnv 簡要比較

  • StockPortfolioEnv:優化多資產投資組合的權重分配,強調風險管理與回報平衡。
  • StockTradingEnv:進行具體的買賣操作,著重短期交易策略的效益,如日內交易

RL 狀態與動作空間

  • StockPortfolioEnv
    • 狀態:包含協方差矩陣(cov_list)及技術指標。
    • 動作:資產權重分配(連續值)。
  • StockTradingEnv
    • 狀態:持有資產數量、價格及技術指標。
    • 動作:具體買賣數量(離散或連續)。

獎勵設計

  • StockPortfolioEnv:基於整體投資組合回報與風險,如夏普比率。
  • StockTradingEnv:基於單筆或每日交易利潤與損失。

適用場景

選擇 StockPortfolioEnv:當目標是多資產的權重分配與風險管理,適合長期投資調整資金配置與機構需求。
選擇 StockTradingEnv:當目標是優化具體交易行為,適合短期策略開發與個人交易員。

1. 初始化 StockPortfolioEnv

需要透過 "tech_indicator_list" 設定使用時輸入的數據中會有哪些額外的特徵

env_kwargs = {
    "hmax": 100, 
    "initial_amount": 1000000, 
    "transaction_cost_pct": 0.001, 
    "state_space": state_space, 
    "stock_dim": stock_dimension, 
    "tech_indicator_list": config.INDICATORS, 
    "action_space": stock_dimension, 
    "reward_scaling": 1e-4
}

# 初始化環境
e_train_gym = StockPortfolioEnv(df=train, **env_kwargs)

2. 數據前處理

這邊前處理以下兩者必不可少

  • tech_indicator:透過 FeatureEngineerdf 數據中加入初始化時指定的一些額外特徵
  • cov_listStockPortfolioEnv 核心算法需要資產之間的協方差矩陣數據評估各資產的風險,此項數據必不可少
fe = FeatureEngineer(use_technical_indicator=True,
                    use_turbulence=False,
                    user_defined_feature = False)

df = fe.preprocess_data(df)
    
# 計算協方差矩陣
df = calculate_cov_list(df)

為什麼數據必須包含 cov_list

在使用 FinRL 進行自動資金分配(Portfolio Allocation)時,StockPortfolioEnv 環境中使用協方差矩陣(Covariance Matrix) 用於衡量多個資產之間回報的相關性。cov_list 是一系列協方差矩陣的集合,通常基於一段回溯期間(如 252 個交易日,即一年)的資產回報數據計算而來。

StockPortfolioEnv 中的應用

  1. 狀態空間的構建
    self.state = np.append(
        np.array(self.covs),
        [self.data[tech].values.tolist() for tech in self.tech_indicator_list],
        axis=0,
    )
    
    • 整合風險信息cov_list 被整合到環境的狀態空間中,為強化學習模型提供有關資產間相關性的資訊。這有助於模型在進行資金分配時,考量資產之間的風險和回報關係。
  2. 風險管理與資產配置
    • 風險評估:協方差矩陣反映了不同資產回報的共同變動,幫助評估整體投資組合的風險。
    • 最適資產配置:透過分析協方差,模型能夠識別哪些資產應該共同持有或分散投資,以達到風險最小化和回報最大化的目標。
  3. 獎勵函數的設計
    雖然原始碼中的獎勵函數主要基於投資組合的回報,但 cov_list 提供的風險資訊可以用於設計更複雜的獎勵函數,如夏普比率(Sharpe Ratio),即回報與風險的比率,從而促進更穩健的資金分配策略。

3. 訓練 DRL 模型

# 訓練模型
trained_models = train_drl(e_train_gym, models_info)

上一篇
Day 7 - 透過FinRL入門 回測檢驗績效(3/3)
下一篇
Day 9 - 訓練DRL做動態的資產配置 (2/2)
系列文
自動交易程式探索30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言