iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0
AI/ ML & Data

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

Day 6 - 使用MVO和DJIA驗證DRL的績效

  • 分享至 

  • xImage
  •  

參考資料:Stock_NeurIPS2018_3_Backtest.ipynb

Mean Variance Optimization(MVO)

1. MVO 介紹

均值方差優化(Mean Variance Optimization, MVO)是一種經典的投資組合管理方法,由哈里·馬科維茨(Harry Markowitz)於1952年提出,是現代投資組合理論的基石。MVO 的核心目標是在給定風險水平下最大化投資組合的預期回報,或在給定回報目標下最小化風險。具體來說,MVO 通過計算每個資產的預期回報和風險(即回報的平均值和波動性),來決定資金的最佳分配,以達到最佳的資產配置。

2. 如何在投資中應用 MVO
  • 一次性買入並持有:根據 MVO 計算出的最優權重進行一次性買入,並在整個投資期間內保持這些權重不變。
  • 靜態投資組合:不進行頻繁調整,適合中長期投資策略。
  • 計算最終報酬:根據投資期結束時各資產的價格,計算投資組合的總價值。
3. 計算MVO的獲利
  • 計算資產的預期回報和風險:基於歷史價格數據,計算每個資產的平均日收益率和波動性(風險),以及資產間的相關性。

    def StockReturnsComputing(StockPrice, Rows, Columns): 
        StockReturn = np.zeros([Rows-1, Columns]) 
        for j in range(Columns):        # j: 資產
            for i in range(Rows-1):     # i: 每日價格
                StockReturn[i,j] = ((StockPrice[i+1, j] - StockPrice[i,j]) / StockPrice[i,j]) * 100 
        return StockReturn
    
    # 計算收益率
    arReturns = StockReturnsComputing(arStockPrices, Rows, Cols)
    
    # 計算平均收益和方差-協方差矩陣
    meanReturns = np.mean(arReturns, axis=0)
    covReturns = np.cov(arReturns, rowvar=False)
    
  • 優化資產配置:利用 PyPortfolioOpt 庫,根據預期回報和風險,計算出各資產的最優權重,以最大化夏普比率(風險調整後的回報)。

    from pypfopt.efficient_frontier import EfficientFrontier
    
    ef_mean = EfficientFrontier(meanReturns, covReturns, weight_bounds=(0, 0.5))
    raw_weights_mean = ef_mean.max_sharpe()
    cleaned_weights_mean = ef_mean.clean_weights()
    mvo_weights = np.array([1000000 * cleaned_weights_mean[i] for i in range(len(cleaned_weights_mean))])
    
  • 建立初始投資組合:根據計算出的權重和最新的股票價格,確定每個資產的投資金額。

    LastPrice = np.array([1/p for p in StockData.tail(1).to_numpy()[0]])
    Initial_Portfolio = np.multiply(mvo_weights, LastPrice)
    
  • 計算投資組合的總價值變化:使用交易數據計算投資組合在不同日期的總價值。

    Portfolio_Assets = TradeData @ Initial_Portfolio
    MVO_result = pd.DataFrame(Portfolio_Assets, columns=["Mean Var"])
    

在這裡MVO 被用作一個基準,與各種強化學習(DRL)策略(如 A2C、PPO 等)的表現進行比較。MVO 作為傳統的靜態資產配置方法,提供了一個簡單且透明的投資組合基準,幫助投資者理解和評估動態調整策略(如 DRL 模型)的優劣。

MVO_result會在之後作為與DRL比較的基準:

  1. 日期:
    使用 MVO_result.index 來獲取日期,這些日期已設為資料框的索引。
    dates = MVO_result.index
    
  2. 獲利數值:
    使用 MVO_result['Mean Var'] 來獲取對應的獲利數值。
    profits = MVO_result['Mean Var']
    

道瓊工業平均指數(DJIA)

DJIA 是美國最著名的股票市場指數之一,由30家大型美國上市公司組成,涵蓋多個主要產業。它被廣泛視為美國股市整體表現的代表,反映了經濟健康狀況和市場信心。

為什麼要使用 DJIA 指數?
  1. 市場基準:DJIA 作為主要的市場指數,提供了一個標準來比較其他投資策略(如 MVO 和 DRL 模型)的表現。這有助於評估這些策略是否能夠超越市場平均水平。

  2. 代表市場趨勢:DJIA 反映了美國經濟的整體走勢,將投資策略的表現與 DJIA 比較,可以直觀了解策略在不同市場環境下的表現。

  3. 長期穩定性:DJIA 擁有悠久的歷史數據,適合用來進行回測和長期比較,提供穩定的參考點。


將 MVO 和 DJIA 作為基準,與各種 DRL 模型的獲利結果進行比較,主要目的是:

  1. 建立可靠的性能基準:利用 MVO 作為傳統且廣泛認可的投資組合管理方法,提供一個評估 DRL 模型表現的標準。

  2. 全面評估策略優劣:通過與 DJIA 的比較,不僅評估策略相對於傳統方法的優勢,還能了解其在整體市場中的表現。

  3. 驗證 DRL 模型的實用性:確保 DRL 模型在實際應用中具有競爭力,能夠提供超越傳統方法和市場基準的回報,從而為投資者提供實際的價值。

通過這樣的比較分析,教學不僅展示了 MVO 和 DRL 模型的潛力,還提供了實際的績效評估方法,幫助用戶更全面地理解和選擇適合的投資策略。

TRADE_START_DATE = '2020-07-01'
TRADE_END_DATE = '2021-10-29'

df_dji = YahooDownloader(
    start_date=TRADE_START_DATE, end_date=TRADE_END_DATE, ticker_list=["dji"]
).fetch_data()

df_dji = df_dji[["date", "close"]]
fst_day = df_dji["close"][0]
dji = pd.merge(
    df_dji["date"],
    df_dji["close"].div(fst_day).mul(1000000),
    how="outer",
    left_index=True,
    right_index=True,
).set_index("date")

dji會在之後用來與DRL比較獲利

  1. 日期
    dji 資料框的索引已設定為 date,因此可以直接使用 dji.index 來獲取日期。
  2. 獲利數值
    dji['close'] 包含了經過標準化處理後的DJIA收盤價,代表獲利的數值。

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

尚未有邦友留言

立即登入留言