『正文』
ˇ
大家好,俱乐部里经常有人问如果策略是通过指数数据(000)计算信号,怎么让回测结果更贴近实盘。指数数据是通过各个合约加权计算的,如果是主力合约与次主力成交量差距小,那么指数信号的计算就会失真。
其实方法有两种:
1.直接用主力连续复权数据(888)计算信号回测,这个是最直接有效的方法。
2.叠加两个数据源:1.指数数据2.主连数据
如下图:

指数与主连数据放在同一个单元格下,然后在Rang[0:0]也就是第一个图层里写策略逻辑。这样的话就是指数数据计算信号,然后再下单的时候用data函数调取图层2,也就是使用主力数据的下单函数下单。
//------------------------------------------------------------------------// 简称: index_trade// 名称: index_trade// 类别: 公式应用// 类型: 用户应用// 输出: Void//------------------------------------------------------------------------Params
Vars Series<Numeric> ma1; Series<Numeric> ma2; Global Numeric KG; Series<Bool> cond1; Series<Bool> cond2;
Events //初始化事件函数,策略运行期间,首先运行且只有一次,应用在订阅数据等操作 OnInit() { //与数据源有关 Range[0:DataCount-1] { //=========数据源相关设置============== AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
//AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算 }
}
OnBar(ArrayRef<Integer> indexs) { Range[0:0] { ma1=Average(C,5); ma2=Average(C,10); cond1=CrossOver(ma1,ma2); cond2=CrossUnder(ma1,ma2); if(cond1[1]) { //Buy(1,open); Data1.Buy(1,Data1.open); } if(cond2[1]) { //SellShort(1,open); Data1.SellShort(1,Data1.open); } } }
//------------------------------------------------------------------------// 编译版本 2024/06/11 172813// 版权所有 songshu123// 更改声明 TradeBlazer Software保留对TradeBlazer平台// 每一版本的TradeBlazer公式修改和重写的权利//------------------------------------------------------------------------
绩效比较
同一个策略及参数,我们对比一下回测绩效
指数回测



2.指数信号映射到主力复权连续数据下单



指数回测,亏损:13000
指数映射到主连复权数据下单,亏损19000
简单计算一下,真实信号的绩效与指数信号的绩效他们偏差在30%左右,当然只是一个粗略估计,实盘根据主力和次主力的成交量差距成反比。不是说指数不能交易,换月前后差距比较明显,实盘时要心里有数。OK,评论区欢迎讨论,也可以提出其他研究课题,一起进步。
欢迎加入2024松鼠俱乐部,获得量化需要的策略源码,培训视频,行情数据。
1.原创策略源码,每月至少1期新策略源码。
2.专属数据库(国内商品数据每日更新)
3.个性化工具类-波动率跟踪
4.松鼠分享会(培训视频每月1期)

本策略仅作学习交流使用,实盘交易盈亏投资者个人负责,内容受原创保护,未经授权禁止转发、倒卖策略源码。