登录 注册 返回主站
推荐产品 炒股必读

一个失忆者的自我拯救-量化平台开源(五)

  • 作者:人生过客
  • 2018-12-17 16:48:52
  • 分享:

第六章、更加精准的回测特定技术面特征连续操作

本次源代码更新如下,如何搭建环境请见第一贴

链接: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类绘图结果


可以到,虽然在退出触发条件上更加灵活,但总体收益趋势和上一章是基本一致的。下一章节将以一个新的案例总结“定义并回测技术面特征策略”的通用流程,使得读者能够少造轮子,多用轮子。


温馨提醒:用户在赢家聊吧发表的所有资料、言论等仅代表个人观点,与本网站立场无关,不对您构成任何投资建议。本文中出现任何联系方式与本站无关,谨防个人信息,财产资金安全。
点赞5
发表评论
输入昵称或选择经常@的人
聊吧群聊

添加群

请输入验证信息:

你的加群请求已发送,请等候群主/管理员验证。

本吧详情
吧 主:

江恩笑笑

会 员:

212人关注了该股票

功 能: