设置工作目录
VNPY
程序启动后,会产生一个工作目录,程序运行产生的数据、系统配置都会放在指定的.vntrader
目录当中。
这一设置在vnpy -> utility.py -> _get_trader_dir
函数中可以找到,工作目录由TRADER_DIR, TEMP_DIR
确定。
def _get_trader_dir(temp_name: str) -> Tuple[Path, Path]:"""Get path where trader is running in."""cwd: Path = Path.cwd()temp_path: Path = cwd.joinpath(temp_name)# If .vntrader folder exists in current working directory,# then use it as trader running path.if temp_path.exists():return cwd, temp_path# Otherwise use home path of system.home_path: Path = Path.home()temp_path: Path = home_path.joinpath(temp_name)# Create .vntrader folder under home path if not exist.if not temp_path.exists():temp_path.mkdir()return home_path, temp_pathTRADER_DIR, TEMP_DIR = _get_trader_dir(".vntrader")
sys.path.append(str(TRADER_DIR))
因此,我们可以创建一个名为veighna_trader
的文件夹,并在其下建立一个名为.vntrader
的文件夹作为工作目录。在veighna_trader
下创建run.py
文件或策略文件来使用VNPY
。
.vntrader
目录下会生成配置文件vt_setting.json
,内容如下:
{"font.family": "微软雅黑","font.size": 12,"log.active": true,"log.level": 50,"log.console": true,"log.file": true,"email.server": "smtp.qq.com","email.port": 465,"email.username": "","email.password": "","email.sender": "","email.receiver": "","datafeed.name": "tushare","datafeed.username": "638306","datafeed.password": "f4df7ef0ac85d1d1324379c2e6c0f7fabc8277fc58d1f0a0f24a18f4","database.timezone": "Asia/Shanghai","database.name": "sqlite","database.database": "database.db","database.host": "","database.port": 0,"database.user": "","database.password": ""
}
这里使用的数据库是sqlite
,数据库名称为database.db
,也会在.vntrader
目录下生成。
导入数据
此处采用导入本地CSV文件的方式作为引入。导入PTA主连TA888.CZCE
的日线数据。
from vnpy.trader.utility import get_file_path
from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.constant import Exchange, Interval
from vnpy_datamanager import DataManagerApp
from datetime import datetimedata_event_engine = EventEngine()
data_main_engine = MainEngine(data_event_engine)
dm = data_main_engine.add_app(DataManagerApp)
此处dm
的类型是vnpy_datamanager.engine.ManagerEngine
。
dm.import_data_from_csv(file_path="TA888.csv",symbol="TA888",exchange=Exchange.CZCE,interval=Interval.DAILY,tz_name="UTC",datetime_head="datetime",open_head="open",high_head="high",low_head="low",close_head="close",volume_head="volume",turnover_head="",open_interest_head="",datetime_format="%Y-%m-%d"
)
(datetime.datetime(2006, 12, 18, 0, 0, tzinfo=zoneinfo.ZoneInfo(key='UTC')),
datetime.datetime(2023, 3, 3, 0, 0, tzinfo=zoneinfo.ZoneInf(key='UTC')),3935)
此处symbol
只需要填品种代码,在回测时,会将品种代码与交易所代码合成为TA888.CZCE
。
查看数据整体情况:
dm.get_bar_overview()
[<DbBarOverview: 1>]
现已成功导入了一个日线数据。
运行回测
from datetime import datetimefrom vnpy.trader.optimize import OptimizationSetting
from vnpy_ctastrategy.backtesting import BacktestingEngine
from vnpy_ctastrategy.strategies.atr_rsi_strategy import AtrRsiStrategy
这里调用到了回测引擎BacktestingEngine
,以及写好的CTA策略AtrRsiStrategy
。
engine = BacktestingEngine()
engine.set_parameters(vt_symbol="TA888.CZCE",interval="d",start=datetime(2006, 12, 18),end=datetime(2023, 3, 3),rate=0.3/10000,slippage=0.2,size=300,pricetick=0.2,capital=1_000_000,
)
engine.add_strategy(AtrRsiStrategy, {})
此处设置好了回测参数。
engine.load_data()
engine.run_backtesting()
df = engine.calculate_result()
engine.calculate_statistics()
engine.show_chart()
2024-11-17 23:15:38.304044 ------------------------------
2024-11-17 23:15:38.304044 首个交易日: 2006-12-18
2024-11-17 23:15:38.304044 最后交易日: 2023-03-03
2024-11-17 23:15:38.304044 总交易日: 3928
2024-11-17 23:15:38.304044 盈利交易日: 490
2024-11-17 23:15:38.304044 亏损交易日: 575
2024-11-17 23:15:38.304044 起始资金: 1,000,000.00
2024-11-17 23:15:38.304044 结束资金: 1,399,903.38
2024-11-17 23:15:38.304044 总收益率: 39.99%
2024-11-17 23:15:38.304044 年化收益: 2.44%
2024-11-17 23:15:38.304044 最大回撤: -709,463.06
2024-11-17 23:15:38.304044 百分比最大回撤: -33.63%
2024-11-17 23:15:38.304044 最长回撤天数: 1653
2024-11-17 23:15:38.304044 总盈亏: 399,903.38
2024-11-17 23:15:38.304044 总手续费: 56,036.62
2024-11-17 23:15:38.304044 总滑点: 58,200.00
2024-11-17 23:15:38.304044 总成交金额: 1,867,887,300.00
2024-11-17 23:15:38.304044 总成交笔数: 970
2024-11-17 23:15:38.304044 日均盈亏: 101.81
2024-11-17 23:15:38.304044 日均手续费: 14.27
2024-11-17 23:15:38.304044 日均滑点: 14.82
2024-11-17 23:15:38.304044 日均成交金额: 475,531.39
2024-11-17 23:15:38.304044 日均成交笔数: 0.2469450101832994
2024-11-17 23:15:38.304044 日均收益率: 0.01%
2024-11-17 23:15:38.304044 收益标准差: 0.86%
2024-11-17 23:15:38.304044 Sharpe Ratio: 0.15
2024-11-17 23:15:38.304044 EWM Sharpe: -1.37
2024-11-17 23:15:38.304044 收益回撤比: 1.19
2024-11-17 23:15:38.304044 策略统计指标计算完成
参数优化
采用遗传算法优化策略表现。
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)
({'atr_length': 25, 'atr_ma_length': 30},0.22469073056450065,{'start_date': datetime.date(2006, 12, 18),'end_date': datetime.date(2023, 3, 3),'total_days': 3928,'profit_days': 452,'loss_days': 531,'capital': 1000000,'end_balance': 1652261.8180000023,'max_drawdown': -754209.3275999983,'max_ddpercent': -37.16191649882275,'max_drawdown_duration': 2669,'total_net_pnl': 652261.818000002,'daily_net_pnl': 166.05443431771943,'total_commission': 53098.18199999999,'daily_commission': 13.517867107942973,'total_slippage': 54120.0,'daily_slippage': 13.778004073319755,'total_turnover': 1769939400.0,'daily_turnover': 450595.57026476576,'total_trade_count': 902,'daily_trade_count': 0.22963340122199594,'total_return': 65.22618180000023,'annual_return': 3.9853064236252687,'daily_return': 0.012783735947389196,'return_std': 0.881410573585519,'sharpe_ratio': 0.22469073056450065,'ewm_sharpe': 0.06580140131641106,'return_drawdown_ratio': 1.75518885852043})
优化后总收益从39.99%提升到了65.23%。