54 KiB
54 KiB
In [1]:
from datetime import datetime
from vnpy.trader.optimize import OptimizationSetting
from vnpy_ctastrategy.backtesting import BacktestingEngine
from vnpy_ctastrategy.strategies.atr_rsi_strategy import AtrRsiStrategyIn [2]:
engine = BacktestingEngine()
engine.set_parameters(
vt_symbol="IF888.CFFEX",
interval="1m",
start=datetime(2019, 1, 1),
end=datetime(2019, 4, 30),
rate=0.3/10000,
slippage=0.2,
size=300,
pricetick=0.2,
capital=1_000_000,
)
engine.add_strategy(AtrRsiStrategy, {})In [4]:
engine.load_data()
engine.run_backtesting()
df = engine.calculate_result()
engine.calculate_statistics()
engine.show_chart()2025-06-16 20:52:03.097314 开始加载历史数据 2025-06-16 20:52:03.097314 加载进度:# [0%] 2025-06-16 20:52:05.032964 加载进度:# [9%] 2025-06-16 20:52:05.103266 加载进度:## [18%] 2025-06-16 20:52:05.165507 加载进度:### [28%] 2025-06-16 20:52:05.225147 加载进度:#### [37%] 2025-06-16 20:52:05.293374 加载进度:##### [46%] 2025-06-16 20:52:05.428085 加载进度:###### [55%] 2025-06-16 20:52:05.494678 加载进度:####### [65%] 2025-06-16 20:52:05.561114 加载进度:######## [74%] 2025-06-16 20:52:05.621792 加载进度:######### [83%] 2025-06-16 20:52:05.687958 加载进度:########## [92%] 2025-06-16 20:52:05.751452 历史数据加载完成,数据量:18960 2025-06-16 20:52:05.840570 策略初始化完成 2025-06-16 20:52:05.840570 开始回放历史数据 2025-06-16 20:52:05.909744 回放进度:= [0%] 2025-06-16 20:52:05.979275 回放进度:== [10%] 2025-06-16 20:52:06.047814 回放进度:=== [20%] 2025-06-16 20:52:06.123807 回放进度:==== [30%] 2025-06-16 20:52:06.191131 回放进度:===== [40%] 2025-06-16 20:52:06.267813 回放进度:====== [50%] 2025-06-16 20:52:06.337686 回放进度:======= [60%] 2025-06-16 20:52:06.406952 回放进度:======== [70%] 2025-06-16 20:52:06.460610 回放进度:========= [80%] 2025-06-16 20:52:06.512522 回放进度:========== [90%] 2025-06-16 20:52:06.512522 历史数据回放结束 2025-06-16 20:52:06.513522 开始计算逐日盯市盈亏 2025-06-16 20:52:06.532825 逐日盯市盈亏计算完成 2025-06-16 20:52:06.532825 开始计算策略统计指标 2025-06-16 20:52:06.546318 ------------------------------ 2025-06-16 20:52:06.546318 首个交易日: 2019-01-02 2025-06-16 20:52:06.546318 最后交易日: 2019-04-30 2025-06-16 20:52:06.546318 总交易日: 79 2025-06-16 20:52:06.546318 盈利交易日: 39 2025-06-16 20:52:06.546318 亏损交易日: 40 2025-06-16 20:52:06.546318 起始资金: 1,000,000.00 2025-06-16 20:52:06.546318 结束资金: 1,051,703.36 2025-06-16 20:52:06.546318 总收益率: 5.17% 2025-06-16 20:52:06.546318 年化收益: 15.71% 2025-06-16 20:52:06.546318 最大回撤: -93,714.14 2025-06-16 20:52:06.546318 百分比最大回撤: -8.58% 2025-06-16 20:52:06.546318 最大回撤天数: 30 2025-06-16 20:52:06.546318 总盈亏: 51,703.36 2025-06-16 20:52:06.546318 总手续费: 13,396.64 2025-06-16 20:52:06.546318 总滑点: 29,940.00 2025-06-16 20:52:06.546318 总成交金额: 446,554,620.00 2025-06-16 20:52:06.546318 总成交笔数: 499 2025-06-16 20:52:06.546318 日均盈亏: 654.47 2025-06-16 20:52:06.546318 日均手续费: 169.58 2025-06-16 20:52:06.546318 日均滑点: 378.99 2025-06-16 20:52:06.546318 日均成交金额: 5,652,590.13 2025-06-16 20:52:06.546318 日均成交笔数: 6.3164556962025316 2025-06-16 20:52:06.546318 日均收益率: 0.06% 2025-06-16 20:52:06.546318 收益标准差: 1.48% 2025-06-16 20:52:06.546318 Sharpe Ratio: 0.67 2025-06-16 20:52:06.546318 EWM Sharpe: 0.59 2025-06-16 20:52:06.546318 收益回撤比: 0.60 2025-06-16 20:52:06.547317 策略统计指标计算完成
[Data output - unsupported data type map[string]interface {} for mime type application/vnd.plotly.v1+json]
In [5]:
setting = OptimizationSetting()
setting.set_target("sharpe_ratio")
setting.add_parameter("atr_length", 25, 27, 1)
setting.add_parameter("atr_ma_length", 10, 30, 10)
engine.run_ga_optimization(setting)Out [5]:
2025-06-16 20:52:12.736299 开始执行遗传算法优化
2025-06-16 20:52:12.737296 参数优化空间:9
2025-06-16 20:52:12.737296 每代族群总数:100
2025-06-16 20:52:12.737296 优良筛选个数:80
2025-06-16 20:52:12.737296 迭代次数:30
2025-06-16 20:52:12.737296 交叉概率:95%
2025-06-16 20:52:12.737296 突变概率:5%
2025-06-16 20:52:12.737296 个体突变概率:100%
gen nevals
0 100
1 100
2 100
3 100
4 100
5 100
6 100
7 100
8 100
9 100
10 100
11 100
12 100
13 100
14 100
15 100
16 100
17 100
18 100
19 100
20 100
21 100
22 100
23 100
24 100
25 100
26 100
27 100
28 100
29 100
30 100
2025-06-16 20:52:26.338670 遗传算法优化完成,耗时13秒
2025-06-16 20:52:26.462433 参数:{'atr_length': 25, 'atr_ma_length': 20}, 目标:2.0127186461733073
2025-06-16 20:52:26.463435 参数:{'atr_length': 27, 'atr_ma_length': 20}, 目标:1.972733364131168
2025-06-16 20:52:26.463435 参数:{'atr_length': 26, 'atr_ma_length': 20}, 目标:1.927735865279324
2025-06-16 20:52:26.463435 参数:{'atr_length': 27, 'atr_ma_length': 30}, 目标:1.273993651024933
2025-06-16 20:52:26.463435 参数:{'atr_length': 25, 'atr_ma_length': 30}, 目标:1.220296323588909
2025-06-16 20:52:26.463435 参数:{'atr_length': 26, 'atr_ma_length': 30}, 目标:1.100003635114256
2025-06-16 20:52:26.463435 参数:{'atr_length': 27, 'atr_ma_length': 10}, 目标:0.7261753437654116
2025-06-16 20:52:26.463435 参数:{'atr_length': 26, 'atr_ma_length': 10}, 目标:0.5706887229122534
2025-06-16 20:52:26.463435 参数:{'atr_length': 25, 'atr_ma_length': 10}, 目标:0.46478426808123563
[({'atr_length': 25, 'atr_ma_length': 20},
2.0127186461733073,
{'start_date': datetime.date(2019, 1, 2),
'end_date': datetime.date(2019, 4, 30),
'total_days': 79,
'profit_days': 38,
'loss_days': 41,
'capital': 1000000,
'end_balance': 1157730.3249999983,
'max_drawdown': -56901.58860000118,
'max_ddpercent': -5.230378359138127,
'max_drawdown_duration': 31,
'total_net_pnl': 157730.32499999838,
'daily_net_pnl': 1996.5863924050427,
'total_commission': 12249.674999999997,
'daily_commission': 155.05917721518983,
'total_slippage': 27540.0,
'daily_slippage': 348.60759493670884,
'total_turnover': 408322500.0,
'daily_turnover': 5168639.24050633,
'total_trade_count': 459,
'daily_trade_count': 5.810126582278481,
'total_return': 15.77303249999984,
'annual_return': 47.91807341772103,
'daily_return': 0.1853942684361968,
'return_std': 1.4269831811830316,
'sharpe_ratio': 2.0127186461733073,
'ewm_sharpe': 2.0847989170594987,
'return_drawdown_ratio': 3.015658030253657}),
({'atr_length': 27, 'atr_ma_length': 20},
1.972733364131168,
{'start_date': datetime.date(2019, 1, 2),
'end_date': datetime.date(2019, 4, 30),
'total_days': 79,
'profit_days': 40,
'loss_days': 39,
'capital': 1000000,
'end_balance': 1152267.1455999983,
'max_drawdown': -49582.891800000914,
'max_ddpercent': -4.569238197913546,
'max_drawdown_duration': 31,
'total_net_pnl': 152267.1455999984,
'daily_net_pnl': 1927.4322227847897,
'total_commission': 12372.854399999998,
'daily_commission': 156.61841012658226,
'total_slippage': 27780.0,
'daily_slippage': 351.6455696202532,
'total_turnover': 412428480.0,
'daily_turnover': 5220613.670886076,
'total_trade_count': 463,
'daily_trade_count': 5.860759493670886,
'total_return': 15.22671455999982,
'annual_return': 46.258373346834894,
'daily_return': 0.17940687672394376,
'return_std': 1.4088875027526955,
'sharpe_ratio': 1.972733364131168,
'ewm_sharpe': 2.026542024055209,
'return_drawdown_ratio': 3.332440529572917}),
({'atr_length': 26, 'atr_ma_length': 20},
1.927735865279324,
{'start_date': datetime.date(2019, 1, 2),
'end_date': datetime.date(2019, 4, 30),
'total_days': 79,
'profit_days': 39,
'loss_days': 40,
'capital': 1000000,
'end_balance': 1147643.3271999985,
'max_drawdown': -50666.8596000009,
'max_ddpercent': -4.666033619086949,
'max_drawdown_duration': 31,
'total_net_pnl': 147643.32719999852,
'daily_net_pnl': 1868.9028759493483,
'total_commission': 12316.672799999998,
'daily_commission': 155.90725063291137,
'total_slippage': 27660.0,
'daily_slippage': 350.126582278481,
'total_turnover': 410555760.0,
'daily_turnover': 5196908.354430379,
'total_trade_count': 461,
'daily_trade_count': 5.8354430379746836,
'total_return': 14.764332719999862,
'annual_return': 44.85366902278439,
'daily_return': 0.17431716333002323,
'return_std': 1.4008713178918295,
'sharpe_ratio': 1.927735865279324,
'ewm_sharpe': 1.9723836768576808,
'return_drawdown_ratio': 3.164214818256914}),
({'atr_length': 27, 'atr_ma_length': 30},
1.273993651024933,
{'start_date': datetime.date(2019, 1, 2),
'end_date': datetime.date(2019, 4, 30),
'total_days': 79,
'profit_days': 38,
'loss_days': 41,
'capital': 1000000,
'end_balance': 1094503.6569999983,
'max_drawdown': -77433.63960000011,
'max_ddpercent': -6.607319335654653,
'max_drawdown_duration': 11,
'total_net_pnl': 94503.65699999814,
'daily_net_pnl': 1196.2488227847866,
'total_commission': 12356.342999999999,
'daily_commission': 156.40940506329113,
'total_slippage': 27660.0,
'daily_slippage': 350.126582278481,
'total_turnover': 411878100.0,
'daily_turnover': 5213646.835443038,
'total_trade_count': 461,
'daily_trade_count': 5.8354430379746836,
'total_return': 9.450365699999818,
'annual_return': 28.70997174683489,
'daily_return': 0.11430503699608949,
'return_std': 1.3899645553722253,
'sharpe_ratio': 1.273993651024933,
'ewm_sharpe': 1.1696997763268426,
'return_drawdown_ratio': 1.4302874161088925}),
({'atr_length': 25, 'atr_ma_length': 30},
1.220296323588909,
{'start_date': datetime.date(2019, 1, 2),
'end_date': datetime.date(2019, 4, 30),
'total_days': 79,
'profit_days': 36,
'loss_days': 43,
'capital': 1000000,
'end_balance': 1094928.4857999983,
'max_drawdown': -76113.6000000001,
'max_ddpercent': -6.499646846424227,
'max_drawdown_duration': 11,
'total_net_pnl': 94928.48579999819,
'daily_net_pnl': 1201.6264025316227,
'total_commission': 12291.5142,
'daily_commission': 155.58878734177216,
'total_slippage': 27540.0,
'daily_slippage': 348.60759493670884,
'total_turnover': 409717140.0,
'daily_turnover': 5186292.911392405,
'total_trade_count': 459,
'daily_trade_count': 5.810126582278481,
'total_return': 9.492848579999835,
'annual_return': 28.839033660758993,
'daily_return': 0.11479626754936274,
'return_std': 1.4573641625596836,
'sharpe_ratio': 1.220296323588909,
'ewm_sharpe': 1.153717453838036,
'return_drawdown_ratio': 1.4605175949247635}),
({'atr_length': 26, 'atr_ma_length': 30},
1.100003635114256,
{'start_date': datetime.date(2019, 1, 2),
'end_date': datetime.date(2019, 4, 30),
'total_days': 79,
'profit_days': 37,
'loss_days': 42,
'capital': 1000000,
'end_balance': 1082878.4175999982,
'max_drawdown': -76113.6000000001,
'max_ddpercent': -6.567223832793394,
'max_drawdown_duration': 11,
'total_net_pnl': 82878.4175999981,
'daily_net_pnl': 1049.093893670862,
'total_commission': 12401.5824,
'daily_commission': 156.98205569620254,
'total_slippage': 27780.0,
'daily_slippage': 351.6455696202532,
'total_turnover': 413386080.0,
'daily_turnover': 5232735.189873418,
'total_trade_count': 463,
'daily_trade_count': 5.860759493670886,
'total_return': 8.287841759999814,
'annual_return': 25.1782534481007,
'daily_return': 0.10078822438750101,
'return_std': 1.4194539075539052,
'sharpe_ratio': 1.100003635114256,
'ewm_sharpe': 1.025155295553051,
'return_drawdown_ratio': 1.2620008044517266}),
({'atr_length': 27, 'atr_ma_length': 10},
0.7261753437654116,
{'start_date': datetime.date(2019, 1, 2),
'end_date': datetime.date(2019, 4, 30),
'total_days': 79,
'profit_days': 39,
'loss_days': 40,
'capital': 1000000,
'end_balance': 1057831.2345999987,
'max_drawdown': -90713.4234000009,
'max_ddpercent': -8.259369529539693,
'max_drawdown_duration': 30,
'total_net_pnl': 57831.23459999873,
'daily_net_pnl': 732.0409443037814,
'total_commission': 13388.765399999998,
'daily_commission': 169.47804303797466,
'total_slippage': 29940.0,
'daily_slippage': 378.9873417721519,
'total_turnover': 446292180.0,
'daily_turnover': 5649268.101265823,
'total_trade_count': 499,
'daily_trade_count': 6.3164556962025316,
'total_return': 5.783123459999873,
'annual_return': 17.56898266329075,
'daily_return': 0.07116557860996443,
'return_std': 1.5182178967984687,
'sharpe_ratio': 0.7261753437654116,
'ewm_sharpe': 0.6534432099800027,
'return_drawdown_ratio': 0.7001894562673932}),
({'atr_length': 26, 'atr_ma_length': 10},
0.5706887229122534,
{'start_date': datetime.date(2019, 1, 2),
'end_date': datetime.date(2019, 4, 30),
'total_days': 79,
'profit_days': 39,
'loss_days': 40,
'capital': 1000000,
'end_balance': 1045896.9177999987,
'max_drawdown': -102407.73300000094,
'max_ddpercent': -9.32616310918827,
'max_drawdown_duration': 30,
'total_net_pnl': 45896.91779999864,
'daily_net_pnl': 580.9736430379575,
'total_commission': 13443.082199999999,
'daily_commission': 170.1655974683544,
'total_slippage': 30060.0,
'daily_slippage': 380.50632911392404,
'total_turnover': 448102740.0,
'daily_turnover': 5672186.582278481,
'total_trade_count': 501,
'daily_trade_count': 6.341772151898734,
'total_return': 4.58969177999986,
'annual_return': 13.943367432910968,
'daily_return': 0.05680355928871988,
'return_std': 1.5419911436683065,
'sharpe_ratio': 0.5706887229122534,
'ewm_sharpe': 0.504537957914293,
'return_drawdown_ratio': 0.49213076441672243}),
({'atr_length': 25, 'atr_ma_length': 10},
0.46478426808123563,
{'start_date': datetime.date(2019, 1, 2),
'end_date': datetime.date(2019, 4, 30),
'total_days': 79,
'profit_days': 39,
'loss_days': 40,
'capital': 1000000,
'end_balance': 1037256.6585999986,
'max_drawdown': -110927.99580000085,
'max_ddpercent': -10.103198434300957,
'max_drawdown_duration': 30,
'total_net_pnl': 37256.65859999858,
'daily_net_pnl': 471.6032734177035,
'total_commission': 13443.341399999998,
'daily_commission': 170.16887848101263,
'total_slippage': 30060.0,
'daily_slippage': 380.50632911392404,
'total_turnover': 448111380.0,
'daily_turnover': 5672295.949367088,
'total_trade_count': 501,
'daily_trade_count': 6.341772151898734,
'total_return': 3.7256658599998493,
'annual_return': 11.31847856202486,
'daily_return': 0.046303037575705135,
'return_std': 1.5433473611303774,
'sharpe_ratio': 0.46478426808123563,
'ewm_sharpe': 0.39342110236894756,
'return_drawdown_ratio': 0.36876102990821136})]In [ ]:
engine.run_bf_optimization(setting)In [ ]: