CTA:回测快速示例

news/2025/2/15 15:48:11/文章来源:https://www.cnblogs.com/super-zzh/p/18717032

设置工作目录

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%。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/884283.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VNPY体系结构

整体架构每个层次的模块只调用下层功能,并对上层提供接口。接口层负责对接行情和交易API,将行情数据推送到系统,发送交易指令。 引擎层向下对接交易接口、数据库,向上服务于各种上层应用。 应用层主要是面向用户的可视化界面,这一部分的代码主要为引擎功能与界面的连接。功…

【ABP】项目示例(2)——聚合根和实体

聚合根和实体 在上一章节中,已经完成了项目搭建的前置准备,在这一章节中,实现领域层的聚合根和实体 创建名称为General.Backend.Domain的标准类库,分别新建名称为Entities、Services、IRepositories和Specifications的文件夹,用于存放实体和聚合根、领域服务、仓储接口和规…

P1896 [SCOI2005] 互不侵犯(状态压缩)

位运算符好麻烦,没打括号被卡了半天 #include<iostream> #define int long long using namespace std; int f[12][100][1<<11]; int s[1<<11]; int num[1<<11]; signed main(){int n,k;cin>>n>>k;int cnt=0;for(int i=0;i<(1<<…

200N03-ASEMI豆浆机专用MOS管200N03

200N03-ASEMI豆浆机专用MOS管200N03编辑:ll 200N03-ASEMI豆浆机专用MOS管200N03 型号:200N03 品牌:ASEMI 封装:TO-252 批号:最新 最大漏源电流:200A 漏源击穿电压:30V RDS(ON)Max:1.8mΩ 引脚数量:3 芯片个数: 沟道类型:N沟道MOS管、中低压MOS管 漏电流:ua 特性:…

第七章-收益归因:Brinson模型

例子 现有一个投资组合,其基准组合为:70%中证800,20%债券,10%现金,如下:基金经理主动投资,对资产权重进行调整。假设基准组合收益率为\(r\)。若是看好股票,那就多配置一些股票,调整中证800权重为\(w_1^{\prime}\)。则收益调整为(\(w_1^{\prime}-w)(r_1-r)\)。会有两种情…

我用GPT干什么

有几天没有更新文章了,一方面因为感觉GPT出来了,写什么都不香了,非得写点关于GPT的才有资格出来和大家见面;另一方面,确实最近一段时间也在全面拥抱GPT:学习,总结,思考。所以今天就想随心所欲地说说GPT使用感受。其实GPT出来没多长时间,就注册账号,并体验了网页版,更…

金融期权

金融期权品种一览上海证券交易所品种 行权方式 上市日期华夏上证50ETF期权 欧式 2015-02-09华泰沪深300ETF期权 欧式 2019-12-23南方中证500ETF期权 欧式 2022-09-19华夏上证科创板50ETF期权 欧式 2023-06-05易方达上证科创板50ETF期权 欧式 2023-06-05深圳证券交易所品种 行权…

从ClickHouse中流式查询大数据

提示:本篇不适合手机阅读,主要为了提供代码实现。为了减速少大的Excel文件在内存中驻留,使用流的方式,边查询边组装,边下载文件相对来说是一个好的方式,下面是基于ClickHouse数据源的方式,下载100万条记录的处理方式,本地测试,内存只有100多M的使用,下载完后就会释放…

Axure9下载完美汉化及破解

一)Axure9下载 复制链接到浏览器,复制后需删除作者后面的部份才能打开!Windows系统: https://pan.baidu.com/s/1CF-lpmzzaevUX2lCZUmmiAMac新系统(M芯片) https://pan.baidu.com/s/1k73IJBAdlwUL1YPPRWXchA 提取码: 1323 注:M1版本自带破解,仅需汉化即可Mac旧系统(int…

单视图度量(Single View Metrology)总结

前面我们介绍了标定相机,并且我们知道,如果我们能够确定三维点的坐标以及标定相机的参数,就能够确定它在图像平面的位置。那我们现在思考一个问题,如果我们知道图像平面的坐标以及标定相机的参数,我们能够确定这个三维点的位置吗? 答案是否定的。因为一般情况下,三维点可…

简说VS中的.http

在VS17.5中,加入了一个.http文件,应该和你想的一样,就是一个存放请求的文件,关键是他能执行请求,很像curl。不过市面上相似的工具有很多,比如Postman就做的很好了,那为什么VS还要引入呢?我的简单理解,虽然Postman好用,但毕竟和VS中的源码是分离的,即使Postman等工具…

P1119 灾后重建

链接 https://www.luogu.com.cn/problem/P1119 题目知识点floyd算法思路看题解,讲的差不多,本篇就是记录下写过的题。 唯一要注意的就是当遍历k(本代码用cnt代替)时,ij都要从0取到n-1。代码 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm&g…