使用qteasy自定義并回測雙均線交易策略
- 使用qteasy自定義并回測一個雙均線擇時策略
- 策略思想
- 導入qteasy模塊
- 創建一個新的策略
- 回測交易策略,查看結果
使用qteasy自定義并回測一個雙均線擇時策略
我們今天使用qteasy
來回測一個雙均線擇時交易策略,qteasy
是一個功能全面且易用的量化交易策略框架,Github地址在這里。使用它,能輕松地獲取歷史數據,創建交易策略并完成回測和優化,還能實盤運行。項目文檔在這里。
為了繼續本章的內容,您需要安裝qteasy【教程1】,并下載歷史數據到本地【教程2、),詳情可以參考更多教程【教程3】。
建議您先按照前面教程的內容了解qteasy
的使用方法,然后再參考這里的例子創建自己的交易策略。
策略思想
本策略根據交易目標的其日K線數據建立簡單移動平均線的雙均線交易模型,
交易策略如下:
策略包含兩個參數:短周期天數S、長周期天數L
分別以兩個不同的周期計算交易標的日K線收盤價的移動平均線,得到兩根移動均線,以S為周期計算的均線為快均線,以L為周期計算的均線為慢均線,根據快慢均線的交叉情況產生交易信號:
- 當快均線由下向上穿越慢均線時全倉買入交易標的
- 當快均線由上向下穿越短均線時平倉
模擬回測交易:
- 回測數據為:滬深300指數(000300.SH)
- 回測周期為2011年1月1日到2020年12月31日
- 生成交易結果圖表
策略參數優化:
- 同樣使用HS300指數,在2011年至2020年共十年的歷史區間上搜索最佳策略參數
- 并在2020年至2022年的數據上進行驗證
- 輸出30組最佳參數的測試結果
導入qteasy模塊
import qteasy as qt
創建一個新的策略
使用qt.RuleIterator
策略基類,可以創建規則迭代策略,
這種策略可以把相同的規則迭代應用到投資組合中的所有股票上,適合在一個投資組合
中的所有股票上應用同一種擇時規則。
from qteasy import RuleIterator
# 創建雙均線交易策略類
class Cross_SMA_PS(RuleIterator):"""自定義雙均線擇時策略策略,產生的信號類型為交易信號這個均線擇時策略有兩個參數:- FMA 快均線周期- SMA 慢均線周期策略跟蹤上述兩個周期產生的簡單移動平均線,當兩根均線發生交叉時直接產生交易信號。"""def __init__(self):"""初始化交易策略的參數信息和基本信息"""super().__init__(pars=(30, 60), # 策略默認參數是快均線周期30, 慢均線周期60par_count=2, # 策略只有長短周期兩個參數par_types=['int', 'int'], # 策略兩個參數的數據類型均為整型變量par_range=[(10, 100), (10, 200)], # 兩個策略參數的取值范圍name='CROSSLINE', # 策略的名稱description='快慢雙均線擇時策略', # 策略的描述data_types='close', # 策略基于收盤價計算均線,因此數據類型為'close'window_length=200, # 歷史數據窗口長度為200,每一次交易信號都是由它之前前200天的歷史數據決定的)# 策略的具體實現代碼寫在策略的realize()函數中# 這個函數接受多個參數: h代表歷史數據, r為參考數據, t為交易數據,pars代表策略參數# 請參閱doc_string或qteasy文檔獲取更多信息def realize(self, h, r=None, t=None, pars=None):"""策略的具體實現代碼:- f: fast, 短均線計算日期;- s: slow: 長均線計算日期;"""from qteasy.tafuncs import sma# 獲取傳入的策略參數f, s= pars# 計算長短均線的當前值和昨天的值# 由于h是一個M行N列的ndarray,包含多種歷史數據類型# 使用h[:, N]獲取第N種數據類型的全部窗口歷史數據# 由于策略的歷史數據類型為‘close’(收盤價),# 因此h[:, 0]可以獲取股票在窗口內的所有收盤價close = h[:, 0]# 使用qt.sma計算簡單移動平均價s_ma = sma(close, s)f_ma = sma(close, f)# 為了考察兩條均線的交叉, 計算兩根均線昨日和今日的值,以便判斷s_today, s_last = s_ma[-1], s_ma[-2]f_today, f_last = f_ma[-1], f_ma[-2]# 根據觀望模式在不同的點位產生交易信號# 在PS信號類型下,1表示全倉買入,-1表示賣出全部持有股份# 關于不同模式下不同信號的含義和表示方式,請查閱# qteasy的文檔。# 當快均線自下而上穿過上邊界,發出全倉買入信號if (f_last < s_last) and (f_today > s_today): return 1# 當快均線自上而下穿過上邊界,發出全部賣出信號elif (f_last > s_last) and (f_today < s_today): return -1else: # 其余情況不產生任何信號return 0
回測交易策略,查看結果
使用歷史數據回測交易策略,使用歷史數據生成交易信號后進行模擬交易,記錄并分析交易結果
# 定義好策略后,定一個交易員對象,引用剛剛創建的策略,根據策略的規則
# 設定交易員的信號模式為PS
# PS表示比例交易信號,此模式下信號在-1到1之間,1表示全倉買入,-1表示
# 全部賣出,0表示不操作。
op = qt.Operator([Cross_SMA_PS()], signal_type='PS')# 設置op的策略參數
op.set_parameter(0, pars= (20, 60) # 設置快慢均線周期分別為10天、166天)# 設置基本回測參數,開始運行模擬交易回測
res = qt.run(op, mode=1, # 運行模式為回測模式asset_pool='000300.SH', # 投資標的為000300.SH即滬深300指數invest_start='20110101', # 回測開始日期visual=True # 生成交易回測結果分析圖)
交易結果如下;
====================================| || BACK TESTING RESULT || |====================================qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 36.2ms
time consumption for operation back looping: 718.5msinvestment starts on 2011-01-04 00:00:00
ends on 2021-02-01 00:00:00
Total looped periods: 10.1 years.-------------operation summary:------------Sell Cnt Buy Cnt Total Long pct Short pct Empty pct
000300.SH 24 25 49 52.8% 0.0% 47.2% Total operation fee: ¥ 861.65
total investment amount: ¥ 100,000.00
final value: ¥ 117,205.20
Total return: 17.21%
Avg Yearly return: 1.59%
Skewness: -1.11
Kurtosis: 13.19
Benchmark return: 69.85%
Benchmark Yearly return: 5.39%------strategy loop_results indicators------
alpha: -0.044
Beta: 1.001
Sharp ratio: -0.029
Info ratio: -0.020
250 day volatility: 0.153
Max drawdown: 47.88% peak / valley: 2015-06-08 / 2017-06-16recovered on: Not recovered!===========END OF REPORT=============
從上面的交易結果可以看到,十年間買入25次賣出24次,持倉時間為52%,最終收益率只有17.2%。
下面是交易結果的可視化圖表展示
交叉線交易策略的長短周期選擇很重要,可以使用qteasy
來搜索最優的策略參數:
# 策略參數的優化
#
# 設置op的策略參數
op.set_parameter(0, opt_tag=1 # 將op中的策略設置為可優化,如果不這樣設置,將無法優化策略參數)
res = qt.run(op, mode=2, opti_start='20110101', # 優化區間開始日期opti_end='20200101', # 優化區間結束日期test_start='20200101', # 獨立測試開始日期test_end='20220101', # 獨立測試結束日期opti_sample_count=1000 # 一共進行1000次搜索)
策略優化可能會花很長時間,qt會顯示一個進度條:
[########################################]1000/1000-100.0% best performance: 226061.246
Optimization completed, total time consumption: 28"964
[########################################]30/30-100.0% best performance: 226061.246
優化完成,顯示最好的30組參數及其相關信息:
====================================
| |
| OPTIMIZATION RESULT |
| |
====================================qteasy running mode: 2 - Strategy Parameter Optimizationinvestment starts on 2011-01-04 00:00:00
ends on 2021-12-31 00:00:00
Total looped periods: 11.0 years.
total investment amount: ¥ 100,000.00
Reference index type is 000300.SH at IDX
Total Benchmark rtn: 54.89%
Average Yearly Benchmark rtn rate: 4.06%
statistical analysis of optimal strategy messages indicators:
total return: 98.11% ± 8.85%
annual return: 6.41% ± 0.42%
alpha: -inf ± nan
Beta: -inf ± nan
Sharp ratio: -inf ± nan
Info ratio: 0.004 ± 0.002
250 day volatility: 0.150 ± 0.005
other messages indicators are listed in below tableStrategy items Sell-outs Buy-ins ttl-fee FV ROI Benchmark rtn MDD
0 (13, 153) 14.0 14.0 687.05 190,792.39 90.8% 54.9% 32.8%
1 (22, 173) 8.0 8.0 395.88 190,814.17 90.8% 54.9% 31.6%
2 (39, 153) 9.0 9.0 472.15 192,264.81 92.3% 54.9% 32.4%
3 (40, 161) 11.0 11.0 560.40 191,355.89 91.4% 54.9% 31.6%
4 (25, 117) 12.0 13.0 628.58 192,098.97 92.1% 54.9% 31.6%
5 (28, 177) 7.0 7.0 330.99 192,535.14 92.5% 54.9% 31.6%
6 (19, 183) 8.0 8.0 393.19 191,723.19 91.7% 54.9% 31.6%
7 (19, 185) 7.0 7.0 321.65 192,112.23 92.1% 54.9% 31.6%
8 (16, 165) 8.0 8.0 367.36 192,663.11 92.7% 54.9% 31.6%
9 (37, 170) 8.0 8.0 406.04 192,756.35 92.8% 54.9% 31.6%
10 (24, 167) 9.0 9.0 434.69 193,170.89 93.2% 54.9% 31.6%
11 (33, 173) 6.0 6.0 296.75 194,352.40 94.4% 54.9% 31.6%
12 (35, 172) 6.0 6.0 296.42 194,090.45 94.1% 54.9% 31.6%
13 (81, 82) 66.0 67.0 4,074.64 193,209.43 93.2% 54.9% 43.3%
14 (18, 192) 8.0 8.0 375.54 194,179.11 94.2% 54.9% 32.0%
15 (39, 149) 7.0 7.0 330.31 194,549.12 94.5% 54.9% 31.6%
16 (17, 21) 90.0 91.0 5,375.15 195,955.66 96.0% 54.9% 27.9%
17 (27, 168) 8.0 8.0 356.07 194,993.23 95.0% 54.9% 31.6%
18 (59, 70) 27.0 28.0 1,517.79 196,081.66 96.1% 54.9% 41.0%
19 (20, 181) 7.0 7.0 324.45 196,273.52 96.3% 54.9% 31.6%
20 (11, 175) 9.0 9.0 441.25 196,223.57 96.2% 54.9% 31.6%
21 (10, 178) 12.0 12.0 592.85 198,623.15 98.6% 54.9% 31.6%
22 (28, 104) 13.0 14.0 766.09 200,232.97 100.2% 54.9% 31.8%
23 (23, 170) 8.0 8.0 412.78 203,044.62 103.0% 54.9% 31.6%
24 (11, 160) 17.0 17.0 859.76 204,142.24 104.1% 54.9% 31.6%
25 (80, 85) 33.0 34.0 2,102.59 210,103.70 110.1% 54.9% 43.4%
26 (25, 166) 9.0 9.0 450.67 205,575.49 105.6% 54.9% 31.6%
27 (10, 162) 17.0 17.0 1,002.46 214,217.37 114.2% 54.9% 31.6%
28 (61, 66) 42.0 43.0 2,630.56 219,235.18 119.2% 54.9% 36.9%
29 (19, 24) 77.0 78.0 4,899.88 226,061.25 126.1% 54.9% 25.0%===========END OF REPORT=============
這三十組參數會被用于獨立測試,以檢驗它們是否過擬合:
[########################################]30/30-100.0% best performance: 133297.532
====================================
| |
| OPTIMIZATION RESULT |
| |
====================================qteasy running mode: 2 - Strategy Parameter Optimizationinvestment starts on 2020-01-02 00:00:00
ends on 2021-12-31 00:00:00
Total looped periods: 2.0 years.
total investment amount: ¥ 100,000.00
Reference index type is 000300.SH at IDX
Total Benchmark rtn: 18.98%
Average Yearly Benchmark rtn rate: 9.09%
statistical analysis of optimal strategy messages indicators:
total return: 22.91% ± 9.01%
annual return: 10.80% ± 4.25%
alpha: -0.015 ± 0.041
Beta: 1.000 ± 0.000
Sharp ratio: 0.857 ± 0.200
Info ratio: 0.022 ± 0.021
250 day volatility: 0.178 ± 0.007
other messages indicators are listed in below tableStrategy items Sell-outs Buy-ins ttl-fee FV ROI Benchmark rtn MDD
0 (13, 153) 4.0 4.0 182.60 124,409.92 24.4% 19.0% 15.9%
1 (40, 161) 3.0 3.0 138.74 118,359.00 18.4% 19.0% 17.0%
2 (22, 173) 2.0 2.0 93.49 126,071.63 26.1% 19.0% 15.2%
3 (19, 183) 2.0 2.0 93.90 129,292.01 29.3% 19.0% 15.2%
4 (25, 117) 1.0 2.0 81.75 129,142.22 29.1% 19.0% 15.2%
5 (39, 153) 3.0 3.0 143.88 128,106.78 28.1% 19.0% 15.2%
6 (19, 185) 1.0 1.0 42.70 126,797.97 26.8% 19.0% 15.2%
7 (28, 177) 1.0 1.0 42.66 126,448.59 26.4% 19.0% 15.2%
8 (16, 165) 1.0 1.0 42.64 126,241.62 26.2% 19.0% 15.2%
9 (81, 82) 16.0 17.0 621.41 91,210.11 -8.8% 19.0% 20.3%
10 (37, 170) 2.0 2.0 93.28 126,103.26 26.1% 19.0% 15.2%
11 (24, 167) 2.0 2.0 92.94 123,720.72 23.7% 19.0% 15.2%
12 (35, 172) 1.0 1.0 42.86 128,377.96 28.4% 19.0% 15.2%
13 (18, 192) 2.0 2.0 84.91 133,297.53 33.3% 19.0% 15.2%
14 (33, 173) 1.0 1.0 42.97 129,519.55 29.5% 19.0% 15.2%
15 (39, 149) 1.0 1.0 42.53 125,231.92 25.2% 19.0% 15.2%
16 (27, 168) 1.0 1.0 42.78 127,628.65 27.6% 19.0% 15.2%
17 (17, 21) 19.0 20.0 886.06 110,117.03 10.1% 19.0% 16.4%
18 (59, 70) 5.0 6.0 276.46 128,273.29 28.3% 19.0% 20.1%
19 (20, 181) 1.0 1.0 42.78 127,628.65 27.6% 19.0% 15.2%
20 (11, 175) 2.0 2.0 82.10 125,706.51 25.7% 19.0% 15.2%
21 (28, 104) 2.0 3.0 131.99 125,189.61 25.2% 19.0% 15.2%
22 (10, 178) 3.0 3.0 132.35 127,100.60 27.1% 19.0% 15.2%
23 (23, 170) 2.0 2.0 93.52 126,385.21 26.4% 19.0% 15.2%
24 (11, 160) 4.0 4.0 179.66 124,113.04 24.1% 19.0% 15.4%
25 (25, 166) 2.0 2.0 93.23 126,539.86 26.5% 19.0% 15.2%
26 (80, 85) 8.0 9.0 342.77 100,764.28 0.8% 19.0% 18.9%
27 (10, 162) 7.0 7.0 291.80 113,699.46 13.7% 19.0% 16.2%
28 (61, 66) 9.0 10.0 428.25 117,497.81 17.5% 19.0% 22.6%
29 (19, 24) 17.0 18.0 774.83 114,216.87 14.2% 19.0% 15.6%===========END OF REPORT=============
參數優化結果以及各個指標的可視化圖表展示:
優化之后我們可以檢驗一下找到的最佳參數:
# 從優化結果中取出一組參數試驗一下:
op.set_parameter(0, pars= (25, 166) # 修改策略參數,改為短周期25天,長周期166天)# 重復一次測試,除策略參數意外,其他設置不變
res = qt.run(op, mode=1, asset_pool='000300.SH', invest_start='20110101', visual=True )
====================================| || BACK TESTING RESULT || |====================================qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 30.7ms
time consumption for operation back looping: 721.6msinvestment starts on 2011-01-04 00:00:00
ends on 2021-02-01 00:00:00
Total looped periods: 10.1 years.-------------operation summary:------------Sell Cnt Buy Cnt Total Long pct Short pct Empty pct
000300.SH 7 8 15 50.7% 0.0% 49.3% Total operation fee: ¥ 348.02
total investment amount: ¥ 100,000.00
final value: ¥ 217,727.40
Total return: 117.73%
Avg Yearly return: 8.02%
Skewness: -0.98
Kurtosis: 14.70
Benchmark return: 69.85%
Benchmark Yearly return: 5.39%------strategy loop_results indicators------
alpha: -inf
Beta: -inf
Sharp ratio: -inf
Info ratio: 0.005
250 day volatility: 0.143
Max drawdown: 31.58% peak / valley: 2015-06-08 / 2015-07-08recovered on: 2018-01-22===========END OF REPORT=============
優化后總回報率達到了117%,比優化前的參數好很多。
優化后的結果可視化圖表如下: