pybacktest框架介紹-MA策略回測
pybacktest是一個基於pandas的vectorized回測框架,這個框架可能不太適合更專業的回測需求,但剛好適合我們練習需求,讓我們看看怎麼用pybacktest來回測一個簡單的MA策略。
MA策略
主要的想法是,我們計算兩個移動平均線,一條是長線,用來捕捉長期是,一條是短線,用來捕捉短期趨勢,當短線從下方突破長線則代表短期向上動能強,則我們買進,而短線從上方突破,則我們賣出。
我們的第一步仍然是載入資料庫以及整理資料
#載入套件庫與讀入資料 import pandas as pd import matplotlib.pyplot as plt import sqlite3
db = sqlite3.connect(‘TWStock_2’) tsmc = pd.read_sql(con=db,sql=‘SELECT * FROM “2330”‘)
整理資料
根據官方教學,這邊 pybacktest預設接受pandas.DataFrame格式,然後索引值為時間,columns則為 O,H,L,C,所以我們把格式整理為需要的形式。
#清理資料 #我們需要成交股數、開盤價、最高價、最低價、收盤價的資料 #並使用Date當作我們的索引值
tsmc.index = pd.to_datetime(tsmc[‘Date’]) tsmc = tsmc[[‘開盤價’,‘最高價’,‘最低價’,‘收盤價’]] tsmc.columns = [‘O’,‘H’,‘L’,‘C’] cols = tsmc.columns tsmc[cols] = tsmc[cols].apply(pd.to_numeric, errors=‘coerce’)
接下來我們載入pybacktest
#載入pybacktest
import pybacktest
pybacktest是基於一串交易訊號序列進行回測計算,我們只要把回測訊號算出來就可以進行回測了。
short_ma = 50 long_ma = 200
short_mavg = tsmc[‘C’].rolling(short_ma).mean() long_mavg = tsmc[‘C’].rolling(long_ma).mean()
buy=cover = (short_mavg > long_mavg) & (short_mavg.shift() < long_mavg.shift()) # ma cross up sell= short = (short_mavg < long_mavg) & (short_mavg.shift() > long_mavg.shift()) # ma cross down
在這邊,pybacktest任一個特殊的變數名ohlc當作他的bar價格資料,所以我命名ohlc = tsmc.copy()
ohlc = tsmc.copy()
pybacktest.Backtest的第一個變數填入我們需要用來計算的信號以及價格資料,接受的資料格式是字典或是DataFrame,這邊我們使用loacls()將所有命名過的變數丟進去。
bt = pybacktest.Backtest(locals(), ‘ma_cross’)
pybacktest在呼叫屬性才會進行計算,我們可以呼叫的屬性有下列 [‘dataobj’, ‘default_price’, ‘eqplot’, ‘equity’, ‘name’, ‘ohlc’, ‘plot_equity’, ‘plot_trades’, ‘positions’, ‘prices’, ‘report’, ‘run_time’, ‘signals’, ‘sigplot’, ‘stats’, ‘summary’, ‘trade_price’, ‘trades’, ‘trdplot’]
舉例來說,呼叫trade後的結果

小結
這邊只是簡單介紹如何使用pybacktest來進行回測分析,感覺相較於zipline,pybacktest相對陽春一些,但是整體語法也更為簡單好上手,我們下集會在做更進一步的介紹。