Files

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 AtrRsiStrategy
In [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 [ ]: