歡迎你們訂閱《Python實戰-構建基於股票的量化交易系統》小冊子,小冊子會陸續推出與小冊內容相關的專欄文章,對涉及到的知識點進行更全面的擴展介紹,而且會有選擇地收錄至小冊中,更便於廣大讀者查閱知識點。本篇專欄爲小冊子內容的加推篇!!!python
當咱們開發了一個交易策略,須要對策略進行回測。那麼咱們就須要一個回測框架。微信
目前已存在不少成熟的回測框架,也有各類平臺。這些框架或平臺各有優劣,並不能知足每一個人的需求。爲了將以前學習的量化交易的知識點貫穿起來,更好地鞏固學習內容,也爲了從此可以搭建適合本身的框架,本小節咱們一塊兒來搭建一個簡單的回測框架。markdown
完成一個策略的回測整體來講包括如下幾步:app
獲取行情數據。咱們以股票行情數據爲例,至少須要獲取到收盤價、開盤價、最高價、最低價、成交量。一般咱們將數據按時間前後分爲兩份:一份做爲策略訓練集數據;一份做爲策略測試集數據。框架
產生擇時策略信號。咱們以課程中的擇時策略爲例,在訓練集數據上產生包含交易信號的序列。全面一些的策略,是應該在擇時策略中能夠融入止盈止損機制、參數優化措施等等。函數
輸出策略回測報告。首先設置回測初始資金,而後根據交易信號買賣股票。咱們能夠選擇全倉買入/賣出,也可使用倉位管理功能。最後以回測指標來評估策略的效果。回測指標包含資金收益率、與基準收益的對比、資金最大回撤、漲跌幅最大回撤等。固然,在實際交易中是有交易手續費和滑點狀況的,更貼近實際的話是須要考慮這些因素。post
可視化策略回測效果。可視化在各個領域的數據分析過程當中都是很重要的,能夠最爲直觀的展現數據背後的含義,此處咱們能夠可視化收益曲線、最大回撤曲線來更加直觀地評估策略運行狀況。學習
一、獲取股票交易數據接口GetStockDatApi
。測試
接口介紹以下:優化
# 數據獲取接口,可參考《差別化分析經常使用股票交易數據接口》 # 輸入參數 # :param data: code 股票代碼 # :param data: start 起始日期,默認爲2010年1月1日 # :param data: start 起始日期,默認爲2010年1月1日 # 輸出參數 # :return data: df_recon 規整化後的DataFrame格式股票數據 # 注意:該接口爲股票除權數據 複製代碼
接口使用例程以下,調用後會返回收盤價、開盤價、最高價、最低價、成交量:
df_stock = GetStockDatApi("000876.SZ", '20170101', '20200101') """ High Low Open Close Volume trade_date 2017-01-03 8.12 8.07 8.07 8.12 179801.01 2017-01-04 8.16 8.09 8.13 8.15 166242.35 2017-01-05 8.23 8.13 8.15 8.17 222902.53 2017-01-06 8.19 8.12 8.18 8.13 128549.96 2017-01-09 8.15 8.08 8.13 8.13 136700.04 ... ... ... ... ... ... 2019-12-25 18.79 18.44 18.59 18.60 207776.34 2019-12-26 18.76 18.46 18.69 18.60 189935.42 2019-12-27 19.43 18.58 18.74 19.28 504214.70 2019-12-30 19.50 18.92 19.24 19.38 379296.95 2019-12-31 20.31 19.55 19.55 19.95 562873.40 [731 rows x 5 columns] """ 複製代碼
二、擇時策略信號生成接口,此處爲計算N日突破信號CalNdaysSignal
。
接口介紹以下:
# 計算N日突破信號接口,可參考《海龜擇時策略入門量化交易》 # 輸入參數 # :param data: stockdata 個股行情數據 # :param data: N1 策略參數,默認爲15 # :param data: N2 策略參數,默認爲5 # 輸出參數 # :return data: 添加交易信號的DataFrame格式股票數據 複製代碼
接口使用例程以下:
df_stock = CalNdaysSignal(df_stock, N1=15, N2=5) 複製代碼
調用接口後返回的股票數據以下所示:
""" High Low Open Close Volume N1_High N2_Low signal trade_date 2017-01-03 8.12 8.07 8.07 8.12 179801.01 8.12 8.12 1.0 2017-01-04 8.16 8.09 8.13 8.15 166242.35 8.15 8.12 1.0 2017-01-05 8.23 8.13 8.15 8.17 222902.53 8.17 8.12 1.0 2017-01-06 8.19 8.12 8.18 8.13 128549.96 8.17 8.12 1.0 2017-01-09 8.15 8.08 8.13 8.13 136700.04 8.17 8.07 1.0 ... ... ... ... ... ... ... ... ... 2019-12-25 18.79 18.44 18.59 18.60 207776.34 21.53 18.36 0.0 2019-12-26 18.76 18.46 18.69 18.60 189935.42 21.53 18.36 0.0 2019-12-27 19.43 18.58 18.74 19.28 504214.70 21.03 18.36 0.0 2019-12-30 19.50 18.92 19.24 19.38 379296.95 20.71 18.36 0.0 2019-12-31 20.31 19.55 19.55 19.95 562873.40 20.31 18.44 0.0 [731 rows x 8 columns] """ 複製代碼
三、擇時策略融入風險管理因子生成交易信號接口CalNdaysStopSignal
。
接口介紹以下:
# N日突破擇時策略基礎上引入風險管理因子,可參考《擇時策略融入ATR風險管理》 # 輸入參數 # :param data: stockdata 個股行情數據 # :param data: N1 策略參數,默認爲15 # :param data: N2 策略參數,默認爲5 # :param data: n_loss 止損策略參數,默認爲0.8 # :param data: n_win 止盈策略參數,默認爲2 # 輸出參數 # :return data: 規整化後 添加交易信號的DataFrame格式股票數據 # 注意:該接口爲股票除權數據 複製代碼
接口使用例程以下:
df_stock = CalNdaysStopSignal(df_stock, N1=15, N2=5, n_loss=0.8, n_win=2) 複製代碼
調用接口後產生的止盈止損信號以下:
""" 17-03-09 買入價格:8.16 止損賣出價格:8.06 17-03-28 買入價格:8.24 止損賣出價格:8.16 17-06-16 買入價格:8.07 止損賣出價格:7.98 17-07-04 買入價格:8.31 止損賣出價格:8.17 17-11-14 買入價格:7.74 止損賣出價格:7.62 17-11-23 買入價格:7.95 止損賣出價格:7.77 18-02-01 買入價格:8.32 止損賣出價格:8.04 18-05-30 買入價格:7.34 止損賣出價格:7.02 18-07-19 買入價格:6.53 止損賣出價格:6.33 18-11-20 買入價格:6.83 止損賣出價格:6.64 18-12-06 買入價格:7.52 止損賣出價格:7.27 19-01-08 買入價格:7.82 止損賣出價格:7.6 19-02-28 買入價格:11.18 止損賣出價格:10.6 19-03-13 買入價格:14.22 止損賣出價格:12.8 19-04-11 買入價格:14.84 止損賣出價格:14.03 19-05-07 買入價格:17.31 止損賣出價格:16.15 19-06-06 買入價格:20.6 止損賣出價格:18.67 19-07-18 買入價格:20.25 止損賣出價格:19.1 19-09-06 買入價格:19.51 止損賣出價格:18.48 19-10-17 買入價格:18.85 止損賣出價格:18.25 19-10-31 買入價格:23.13 止損賣出價格:22.06 """ 複製代碼
調用接口後返回的股票數據以下所示:
""" High Low Open Close ... N1_High N2_Low atr14 signal trade_date ... 2017-01-03 8.12 8.07 8.07 8.12 ... 8.12 8.12 0.10 0.0 2017-01-04 8.16 8.09 8.13 8.15 ... 8.15 8.12 0.10 0.0 2017-01-05 8.23 8.13 8.15 8.17 ... 8.17 8.12 0.10 0.0 2017-01-06 8.19 8.12 8.18 8.13 ... 8.17 8.12 0.10 0.0 2017-01-09 8.15 8.08 8.13 8.13 ... 8.17 8.12 0.10 0.0 ... ... ... ... ... ... ... ... ... ... 2019-12-25 18.79 18.44 18.59 18.60 ... 21.60 18.36 0.72 0.0 2019-12-26 18.76 18.46 18.69 18.60 ... 21.53 18.36 0.69 0.0 2019-12-27 19.43 18.58 18.74 19.28 ... 21.53 18.36 0.70 0.0 2019-12-30 19.50 18.92 19.24 19.38 ... 21.03 18.36 0.69 0.0 2019-12-31 20.31 19.55 19.55 19.95 ... 20.71 18.36 0.71 0.0 [731 rows x 9 columns] """ 複製代碼
四、輸出策略回測報告接口SimpleBackTest
。
接口介紹以下:
# 執行簡易策略回測接口,可參考《收益與風險維度度量策略效果》 # 輸入參數 # :param data: stockdata 股票數據及交易信號 # :param data: code_name 股票名稱 # :param data: cash_hold 回測資金 # 輸出參數 # :return data: 添加回測結果的DataFrame格式股票數據 複製代碼
接口使用例程以下:
df_stock = SimpleBackTest(df_stock, "新但願", 100000) 複製代碼
調用接口後可打印輸出最終資金、基準收益率、股票買賣記錄等回測結果。
""" 新但願 回測結果 最終資金:132180.0 基準收益率:0.8988989891622865 策略收益率:0.046179711142093044 最大回撤點:trade_date 2019-10-18 0.58 """ """ 17-01-03 買入新但願 12300股 17-01-13 賣出新但願 12300股 17-02-10 買入新但願 12100股 17-03-10 賣出新但願 12100股 17-03-24 買入新但願 11700股 17-03-31 賣出新但願 11700股 17-06-13 買入新但願 11600股 17-07-18 賣出新但願 11600股 17-11-03 買入新但願 12500股 17-12-01 賣出新但願 12500股 18-01-08 買入新但願 12000股 18-02-02 賣出新但願 12000股 18-05-17 買入新但願 13300股 18-05-31 賣出新但願 13300股 18-07-16 買入新但願 14500股 18-08-02 賣出新但願 14500股 18-11-05 買入新但願 14600股 18-11-28 賣出新但願 14600股 18-11-29 買入新但願 14500股 18-12-18 賣出新但願 14500股 19-01-07 買入新但願 13400股 19-03-15 賣出新但願 13400股 19-04-03 買入新但願 11100股 19-04-12 賣出新但願 11100股 19-05-06 買入新但願 9400股 19-05-09 賣出新但願 9400股 19-05-31 買入新但願 7300股 19-06-24 賣出新但願 7300股 19-07-16 買入新但願 6500股 19-07-23 賣出新但願 6500股 19-09-02 買入新但願 6200股 19-09-09 賣出新但願 6200股 19-10-11 買入新但願 6100股 19-10-21 賣出新但願 6100股 19-10-22 買入新但願 6000股 19-11-18 賣出新但願 6000股 """ 複製代碼
另外,接口的返回值在DataFrame格式股票數據的基礎上添加了每一個交易日的動態回測數據。
""" total per_total max_total Close max_close trend_profit benchmark_profit trade_date 2017-01-03 99997.0 1.00 99997.0 8.12 8.12 NaN NaN 2017-01-04 100367.0 1.00 100367.0 8.15 8.15 3.69e-03 3.69e-03 2017-01-05 100613.0 1.00 100613.0 8.17 8.17 2.45e-03 2.45e-03 2017-01-06 100120.0 1.00 100613.0 8.13 8.17 -4.91e-03 -4.91e-03 2017-01-09 100120.0 1.00 100613.0 8.13 8.17 0.00e+00 0.00e+00 ... ... ... ... ... ... ... ... 2019-12-25 146829.0 0.74 198468.0 18.60 23.20 0.00e+00 3.77e-03 2019-12-26 146829.0 0.74 198468.0 18.60 23.20 0.00e+00 0.00e+00 2019-12-27 146829.0 0.74 198468.0 19.28 23.20 0.00e+00 3.59e-02 2019-12-30 146829.0 0.74 198468.0 19.38 23.20 0.00e+00 5.17e-03 2019-12-31 146829.0 0.74 198468.0 19.95 23.20 0.00e+00 2.90e-02 [731 rows x 7 columns] """ 複製代碼
五、策略回測效果可視化接口DrawBackTest
,該接口以圖表形式輸出回測結果。
接口介紹以下:
# 執行簡易策略回測接口,可參考《收益與風險維度度量策略效果》 # 輸入參數 # :param data: df_stockload股票數據/交易信號/回測結果數據 # :param data: code_name 股票名稱 複製代碼
接口使用例程以下:
DrawBackTest(df_stock, "新但願") 複製代碼
調用接口後以圖表形式輸出回測結果。
六、帳戶類ST_Account
,該類中提供了當前帳戶的剩餘資金、持倉股數、總資產、交易操做等接口。
構造函數以下所示:
#可參考《擇時策略融入ATR動態倉位管理》 def __init__( self,init_hold={}, init_cash=1000000, commission_coeff=0, tax_coeff= 0): """ :param [dict] init_hold 初始化時的股票資產 :param [float] init_cash: 初始化資金 :param [float] commission_coeff: 交易佣金 :默認 萬2.5(float類型 0.00025) 此處例程設定爲0 :param [float] tax_coeff: 印花稅 :默認 千1.5(float類型 0.001) 此處例程設定爲0 """ self.hold = init_hold self.cash = init_cash 複製代碼
建立帳戶的實例,以下所示:
account_a = ST_Account(dict(), 100000) # 帳戶A 持股數目和初始資金 account_b = ST_Account(dict(), 100000) # 帳戶B 持股數目和初始資金 複製代碼
七、關於ATR頭寸管理和動態倉位管理接口,分別由draw_graph類和run_add_postion類完成。
draw_graph包含了計算每日帳戶中的交易狀況、繪製帳戶收益曲線等方法。
run_add_postion類繼承了draw_graph,而且添加了動態倉位管理方法。爲了體現ATR頭寸管理和動態倉位管理的效果,咱們在draw_graph類中默認觀察2個資金帳戶,一個帳戶執行全倉買入賣出,另外一個帳戶執行倉位管理。
測試例程以下所示:
#可參考《擇時策略融入ATR動態倉位管理》 test_kind = u"test1" # test1:ATR頭寸 / test2:動態倉位調整 fig = plt.figure(figsize=(16, 8), dpi=100, facecolor="white") # 建立fig對象 if test_kind == u"test1": # ATR頭寸 app_graph_a = draw_graph(fig, df_stock, "600410.SS") app_graph_a.draw_config() else: # 動態倉位調整 app_graph_b = draw_add_postion(fig, df_stock, "600410.SS") app_graph_b.draw_config() plt.show() 複製代碼
好比調用draw_graph的實例以後會以圖表形式輸出回測結果。
好比調用draw_add_postion的實例以後會輸出動態倉位的調整信息。
""" 17-02-10 帳戶A 買入價格:8.13 買入股數:12300 17-02-10 帳戶B 買入價格:8.13 買入股數:11822 17-02-14 帳戶B 加倉價格:8.14 加倉股數:720 17-02-15 帳戶B 減倉價格:8.16 減倉股數:810 17-02-20 帳戶B 減倉價格:8.26 減倉股數:804 17-02-24 帳戶B 加倉價格:8.19 加倉股數:551 17-03-03 帳戶B 加倉價格:8.11 加倉股數:831 17-03-06 帳戶B 加倉價格:8.15 加倉股數:526 17-03-10 帳戶A 賣出價格:8.06 賣出股數:12300 17-03-10 帳戶B 賣出價格:8.06 賣出股數:12836 …… 19-10-11 帳戶B 買入價格:18.62 買入股數:1368 19-10-18 帳戶A 賣出價格:18.06 賣出股數:5267 19-10-18 帳戶B 賣出價格:18.06 賣出股數:1368 19-10-22 帳戶A 買入價格:19.3 買入股數:4929 19-10-22 帳戶B 買入價格:19.3 買入股數:1407 19-11-01 帳戶A 賣出價格:22.09 賣出股數:4929 19-11-01 帳戶B 賣出價格:22.09 賣出股數:1407 """ 複製代碼
以上這些知識點都涵蓋在課程中,此處咱們提供給你們一個「索引」,旨在把知識點和所在課程中的位置相匹配起來。
同窗們能夠結合課程中參考的小節本身調試一番,經過這個過程使你們可以對量化交易的回測方面有更總體的掌握。
只有通過本身親手實踐,纔能有更深入的理解,固然咱們也有提供了整理後的回測框架源碼,有須要對比分析的同窗能夠在羣中私信我。
以上策略及涉及到的股票僅用於教學,不構成任何投資建議!投資需謹慎,入市有風險!!!
更多的量化交易內容歡迎你們訂閱小冊閱讀!!
同時也歡迎你們關注個人微信公衆號【元宵大師帶你用Python量化交易】瞭解更多Python量化交易相關內容