Python實做台股MA交易策略歷史回測

本文章將介紹如何透過長短MA做為趨勢判斷去進行交易策略。

歡迎閱讀這篇部落格文章!在本文中,我們將透過Python程式語言實做台灣股市的移動平均線(MA)交易策略並進行歷史回測。

移動平均線是一種常用的技術指標,透過計算平均價格來分析股價走勢,並應用於制定交易策略。透過歷史回測,我們能夠評估該策略在過去的表現,並從中獲取寶貴的資訊。

本文將介紹本書裡面提供的範例衍伸,範例程式碼載點也在這篇文章中哦。

移動平均線指標

MA交易策略運用

MA交易策略基於移動平均線指標,通常包括多條MA線的組合。

均線交叉 黃金交叉 死亡交叉

常見的策略包括黃金交叉和死亡交叉。黃金交叉發生在短期MA線向上穿越長期MA線時,被視為買入信號;而死亡交叉則相反,發生在短期MA線向下穿越長期MA線時,被視為賣出信號。

均線排列

MA策略也包含多條的均線排列組合,當三條MA同時出現時,短週期的MA>中週期的MA>高週期的MA,則視為均線排列,本處提到的只是最基本的判斷,大家可以自行依照自己的觀察調整邏輯

Python歷史回測

透過歷史回測,我們可以模擬過去的交易環境,以評估MA交易策略的效能。我們可以回測不同參數組合下的策略,並計算回測期間的績效指標。這能夠幫助我們了解該策略在不同市場條件下的表現,並進一步優化交易策略。

本文章將介紹如何透過長短MA做為趨勢判斷去進行交易策略。

首先取得台灣股票的歷史資料,以及計算EMA,如下程式碼(參考6-2.py)。

# 載入必要套件
from Data import getDataYF, getDataFM
from BackTest import ChartTrade, Performance
import pandas as pd
import mplfinance as mpf
from talib.abstract import EMA

# 取得回測資料
prod = "0050"
data = getDataFM(prod, "2007-01-01", "2023-05-")

接著計算技術指標

# 計算指數移動平均線
data["ema_short"] = EMA(data, timeperiod=20)
data["ema_long"] = EMA(data, timeperiod=60)

進行策略判斷

# 初始部位
position = 0
trade = pd.DataFrame()
# 開始回測
for i in range(data.shape[0] - 1):
    # 取得策略會應用到的變數
    c_time = data.index[i]
    c_data = data.loc[c_time]
    # 取下一期資料做為進場資料
    n_time = data.index[i + 1]
    n_data = data.loc[n_time]

    # 進場程序
    if position == 0:
        # 進場邏輯
        if c_data["ema_short"] > c_data["ema_long"]:
            position = 1
            order_i = i
            order_time = n_time
            order_price = n_data["open"]
            order_unit = 1
    # 出場程序
    elif position == 1:
        # 出場邏輯
        if c_data["ema_short"] < c_data["ema_long"]:
            position = 0
            cover_time = n_time
            cover_price = n_data["open"]
            # 交易紀錄
            trade = trade.append(
                pd.Series(
                    [
                        prod,
                        "Buy",
                        order_time,
                        order_price,
                        cover_time,
                        cover_price,
                        order_unit,
                    ]
                ),
                ignore_index=True,
            )

進行績效解析

# 績效分析
Performance(trade, "ETF")
# 結果
總績效 1.3185 
交易次數 28 
平均績效 0.0471 
平均持有天數 135 天
勝率 0.43 
平均獲利 0.1661 
平均虧損 -0.0421 
賺賠比 3.9408 
期望值 1.1175 
獲利平均持有天數 239 天
虧損平均持有天數 57 天
最大連續虧損 -0.0405
最大資金回落 0.1784

查看下單點位

# 繪製副圖
addp = []
addp.append(mpf.make_addplot(data["ema_short"]))
addp.append(mpf.make_addplot(data["ema_long"]))
# 繪製K線圖與交易明細
ChartTrade(data, trade, addp=addp)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *