iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
自我挑戰組

金融量化交易系列 第 26

26·交易策略範例

  • 分享至 

  • xImage
  •  

什麼是回測 (Backtesting)?
簡單來說,就是「用歷史資料來測試交易策略,評估其過去的表現」,從而判斷策略是否可能有效。
回測四步驟

  • 取得數據:下載目標股票的歷史 K 線資料。
  • 定義策略:將交易邏輯寫成程式碼 (例如:何時買入、何時賣出)。
  • 執行回測:設定初始資金、手續費等,並運行測試。
  • 分析結果:檢視績效報表與圖表。
    實戰範例:移動平均線交叉策略
  • 策略:當 40 日均線(快線)向上穿越 100 日均線(慢線)時買入;反之則賣出。
  • 標的:蘋果公司 (AAPL),2020-2022 年。
import backtrader as bt
import yfinance as yf

# 1. 定義策略
class MovingAverageCross(bt.Strategy):
    params = (("short_window", 40), ("long_window", 100))

    def __init__(self):
        # 計算快、慢速移動平均線
        short_ma = bt.indicators.SimpleMovingAverage(period=self.p.short_window)
        long_ma = bt.indicators.SimpleMoving-Average(period=self.p.long_window)
        # 監控均線交叉訊號
        self.crossover = bt.indicators.CrossOver(short_ma, long_ma)

    def next(self):
        # 策略的主要邏輯
        if self.crossover > 0:  # 快線向上穿越慢線
            self.buy()
        elif self.crossover < 0: # 快線向下穿越慢線
            self.sell()

# 2. 準備數據與環境
cerebro = bt.Cerebro()
data = bt.feeds.PandasData(dataname=yf.download('AAPL', '2020-01-01', '2022-01-01'))

cerebro.adddata(data)
cerebro.addstrategy(MovingAverageCross)

# 3. 設定初始條件
cerebro.broker.set_cash(100000) # 初始資金 10 萬
cerebro.broker.setcommission(commission=0.001) # 手續費 0.1%

# 4. 執行與出圖
print('初始資產: %.2f' % cerebro.broker.getvalue())
cerebro.run()
print('最終資產: %.2f' % cerebro.broker.getvalue())
cerebro.plot()

如何解讀圖表與分析

  • K 線圖:確認紅綠箭頭(買賣點)是否符合策略邏輯。
  • 資產變化圖:觀察下方資產曲線的增長趨勢,判斷策略整體是賺錢還是賠錢。
    分析重點:
  • 盈利能力:策略最終賺了多少錢?
  • 最大回撤 (Drawdown):策略從資產高點回落,最多虧損了多少?這是衡量風險的關鍵。
  • 過度擬合 (Overfitting):要警惕策略是否只對這段特定歷史資料有效,換個時間段或商品可能就失效了。

上一篇
25. 策略測試最佳化
下一篇
27·績效評估指標
系列文
金融量化交易30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言