金融大數據分析 巨量資料科學 交易策略建構 量化交易系統 動態槓桿控管
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)