人生过客
第六章、更加精准的回测特定技术面特征连续操作
本次源代码更新如下,如何搭建环境请见第一贴
链接:https://pan.baidu.com/s/1soQ0voRFEPyTpmWitGQ4jA
提取码:uc7l
在上一章中,我们基于一些简化假设实现了对macd_n策略的模拟回测,在我来,上一章内容至少还有如下地方可以做的更加灵活,以便于按照更加符合实际的方式模拟交易:
1、 考虑到持有个股100存在整数倍限制,因此加入零头无法再投资的限制;
2、 不必每一次操作皆满仓,可以设置一个0~1之间的投入仓位比例值op_percentage;
3、 退出策略不必非得是持有5日整然后以收盘价退出,可以同时加入若干种退出条件,例如止盈、止损、超时、满足特定技术特征等等,然后根据最先触发的退出条件执行退出操作。
4、 先前操作中,若有多个买入机会发生在同一日,则只选择第一个被搜索到的机会,其他晚被搜索到的机会永远不参与交易。可以将发生在同一日的所有交易机会全部列举出来,在回测时将用随机方式决定。
接下来讲一下基于上一章内容代码基础,实现以上四种特性的总体思路:
1、 首先针对第一条,将可用资金总额除以股价*100,然后用math.floor函数求整,即可计算出最大可买的100整数倍持股数量,剩下的零头数=可用资金总额-持股数*股价;
2、 针对第二条,可用资金总额 = 总资产* percentage即可;
3、 针对第三条,在搜寻到符合macd_n特征案例的同时,加入买入后一段观察时间(这里设置的是15天)内对退出条件的判断,对于止盈退出条件,只需要找到第一次某日最高价/买入价比值大于止盈阀值的日期;对于止损,处理方法类似,需找到第一次最低价/买入价比值小于止损阀值的日期;对于特定的技术面条件(本案例中设置为MACD指标在买入后不再上升),只需要将条件翻译为合适的约束性代码即可,并观察第一次符合退出条件的日期;如果在指定周期内上述任何一种退出条件均未触发,则执行超时退出机制,以15日以后的收盘价强行退出。
4、 对于第四条,将3000多个交易机会以ArrayList格式映射到上证指数有效交易日的每一天,这样每个上证交易日可能对应0个交易机会,1个交易机会,或者多个交易机会。后续在多个交易机会情况下,通过random抛出一个随机数来决策介入哪一只个股。这种随机性同时也意味着,每一次回测过程和结果均会不一样。
接下来是代码实现,主程序中运行:
loadAllStockDataMulti_tdx(false,false);
test_3();
第一张截图(同时建议雪球向一些IT论坛学习,提供发帖时粘贴代码功能QAQ),和上一章类似,先从所有个股历史数据中筛选出全部符合MACD_N特征的个例,然后定义enough_stop_index、lose_stop_index、macd_stop_index三个整数指标,并初始化为15天。随后,以止盈条件为例,检自买入持有15天内,哪一天第一次出现最高价/买入价 >止盈阀值(enough_stop_critere),并将第一次满足的持有天数值赋给enough_stop_index。
第二张截图上半部分,类似于上一章图片做法,询到满足止损和满足特定技术面特征的持有天数,并分别赋值给lose_stop_index、macd_stop_index。
第二张截图下半部分,判断enough_stop_index、lose_stop_index、macd_stop_index三个整数哪个最小,最小则代表自持有以来,最先等到的退出条件,若三者都等于15,则执行else超时退出条件。根据不同情况在S_DATE(卖出日期)、S_PRICE(卖出价格)、S_D_B(卖出价/买入价)、S_D_REASON(卖出因)四个ArrayList寄存器中写入记录。
将3000多个交易机会以ArrayList格式映射到上证指数有效交易日的每一天,这样每个上证交易日可能对应0个交易机会,1个交易机会,或者多个交易机会。后续在某日具备多个交易机会情况下,通过random抛出一个随机数来决策介入哪一只个股。
初始化回测交易的基本息,例如资金总量、持股数量、空仓资金、交易状态、持有状态等等。
这一部分代码阅读需要多消耗些脑细胞,大致思路为:从上证指数有效交易日从前向后轮询,是否某一日存在macd_n特征的交易机会,如有大于等于1个,则通过随机数选择该交易机会,并直接从先前已经分析好并储存好的3000多个交易记录中直接调用其买入价格,卖出日期、卖出价格、卖出因等息。随后执行买入操作,即将可用资金(总资金*设定的参与仓位)除以买入价格算得持股数量(必须为100整数倍),并更新剩余可用资金(空仓资金),同时将持股状态更新至“hold”,并将下一个交易日期nextDate赋值为先前已计算好的卖出日期。
随着上证有效交易日期向后轮询,若轮询到下一个交易日期nextDate且持股状态为“hold”时,则执行卖出操作,将持有股数按照卖出价格转换成现金并乘以税费损耗比率,接下来更新持有状态为free,同时将free_cash、hold_stock_num清空归零。
如此循环操作,将每次操作明细通过println函数打印出来,并通过SIMU_DATE、SIMU_VALUE储存每次交易日期及总资产,用于TimeSeriesChart类实现画图。
下图为TimeSeriesChart类绘图结果
可以到,虽然在退出触发条件上更加灵活,但总体收益趋势和上一章是基本一致的。下一章节将以一个新的案例总结“定义并回测技术面特征策略”的通用流程,使得读者能够少造轮子,多用轮子。
分享:
请输入验证信息:
你的加群请求已发送,请等候群主/管理员验证。
江恩笑笑
赢家江恩三步分析
212人关注了该股票
长期未登录发言
吧主违规操作
色情、反动
其他
*投诉理由
目前CPO概念在涨幅排行榜排名第二 新易盛、铭普光磁涨幅居前
目前覆铜板概念涨幅3.79%,胜宏科技、华正新材等股领涨
通用航空概念走势活跃大幅上涨4.18%,新晨科技、宗申动力等多股涨停
周二IPV6概念早盘低开收出上下影中阳线
人生过客
一个失忆者的自我拯救-量化平台开源(五)
第六章、更加精准的回测特定技术面特征连续操作
本次源代码更新如下,如何搭建环境请见第一贴
链接:https://pan.baidu.com/s/1soQ0voRFEPyTpmWitGQ4jA
提取码:uc7l
在上一章中,我们基于一些简化假设实现了对macd_n策略的模拟回测,在我来,上一章内容至少还有如下地方可以做的更加灵活,以便于按照更加符合实际的方式模拟交易:
1、 考虑到持有个股100存在整数倍限制,因此加入零头无法再投资的限制;
2、 不必每一次操作皆满仓,可以设置一个0~1之间的投入仓位比例值op_percentage;
3、 退出策略不必非得是持有5日整然后以收盘价退出,可以同时加入若干种退出条件,例如止盈、止损、超时、满足特定技术特征等等,然后根据最先触发的退出条件执行退出操作。
4、 先前操作中,若有多个买入机会发生在同一日,则只选择第一个被搜索到的机会,其他晚被搜索到的机会永远不参与交易。可以将发生在同一日的所有交易机会全部列举出来,在回测时将用随机方式决定。
接下来讲一下基于上一章内容代码基础,实现以上四种特性的总体思路:
1、 首先针对第一条,将可用资金总额除以股价*100,然后用math.floor函数求整,即可计算出最大可买的100整数倍持股数量,剩下的零头数=可用资金总额-持股数*股价;
2、 针对第二条,可用资金总额 = 总资产* percentage即可;
3、 针对第三条,在搜寻到符合macd_n特征案例的同时,加入买入后一段观察时间(这里设置的是15天)内对退出条件的判断,对于止盈退出条件,只需要找到第一次某日最高价/买入价比值大于止盈阀值的日期;对于止损,处理方法类似,需找到第一次最低价/买入价比值小于止损阀值的日期;对于特定的技术面条件(本案例中设置为MACD指标在买入后不再上升),只需要将条件翻译为合适的约束性代码即可,并观察第一次符合退出条件的日期;如果在指定周期内上述任何一种退出条件均未触发,则执行超时退出机制,以15日以后的收盘价强行退出。
4、 对于第四条,将3000多个交易机会以ArrayList格式映射到上证指数有效交易日的每一天,这样每个上证交易日可能对应0个交易机会,1个交易机会,或者多个交易机会。后续在多个交易机会情况下,通过random抛出一个随机数来决策介入哪一只个股。这种随机性同时也意味着,每一次回测过程和结果均会不一样。
接下来是代码实现,主程序中运行:
loadAllStockDataMulti_tdx(false,false);
test_3();
第一张截图(同时建议雪球向一些IT论坛学习,提供发帖时粘贴代码功能QAQ),和上一章类似,先从所有个股历史数据中筛选出全部符合MACD_N特征的个例,然后定义enough_stop_index、lose_stop_index、macd_stop_index三个整数指标,并初始化为15天。随后,以止盈条件为例,检自买入持有15天内,哪一天第一次出现最高价/买入价 >止盈阀值(enough_stop_critere),并将第一次满足的持有天数值赋给enough_stop_index。
第二张截图上半部分,类似于上一章图片做法,询到满足止损和满足特定技术面特征的持有天数,并分别赋值给lose_stop_index、macd_stop_index。
第二张截图下半部分,判断enough_stop_index、lose_stop_index、macd_stop_index三个整数哪个最小,最小则代表自持有以来,最先等到的退出条件,若三者都等于15,则执行else超时退出条件。根据不同情况在S_DATE(卖出日期)、S_PRICE(卖出价格)、S_D_B(卖出价/买入价)、S_D_REASON(卖出因)四个ArrayList寄存器中写入记录。
将3000多个交易机会以ArrayList格式映射到上证指数有效交易日的每一天,这样每个上证交易日可能对应0个交易机会,1个交易机会,或者多个交易机会。后续在某日具备多个交易机会情况下,通过random抛出一个随机数来决策介入哪一只个股。
初始化回测交易的基本息,例如资金总量、持股数量、空仓资金、交易状态、持有状态等等。
这一部分代码阅读需要多消耗些脑细胞,大致思路为:从上证指数有效交易日从前向后轮询,是否某一日存在macd_n特征的交易机会,如有大于等于1个,则通过随机数选择该交易机会,并直接从先前已经分析好并储存好的3000多个交易记录中直接调用其买入价格,卖出日期、卖出价格、卖出因等息。随后执行买入操作,即将可用资金(总资金*设定的参与仓位)除以买入价格算得持股数量(必须为100整数倍),并更新剩余可用资金(空仓资金),同时将持股状态更新至“hold”,并将下一个交易日期nextDate赋值为先前已计算好的卖出日期。
随着上证有效交易日期向后轮询,若轮询到下一个交易日期nextDate且持股状态为“hold”时,则执行卖出操作,将持有股数按照卖出价格转换成现金并乘以税费损耗比率,接下来更新持有状态为free,同时将free_cash、hold_stock_num清空归零。
如此循环操作,将每次操作明细通过println函数打印出来,并通过SIMU_DATE、SIMU_VALUE储存每次交易日期及总资产,用于TimeSeriesChart类实现画图。
下图为console交易过程明细截图下图为TimeSeriesChart类绘图结果
可以到,虽然在退出触发条件上更加灵活,但总体收益趋势和上一章是基本一致的。下一章节将以一个新的案例总结“定义并回测技术面特征策略”的通用流程,使得读者能够少造轮子,多用轮子。
分享:
相关帖子