本文是第一部分第四篇,第一部分共六篇文章,目录如下:
- 市场的动量效应
- 动量策略的核心盈利因子
- Hello World: 广为人知的动量策略
- Hello World: 代码编写和调试
- Hello World: 研究与优化
- 骗术大揭秘与第一部分结语
本篇介绍本部分中的Hello World动量策略进行编码实现和调试过程。
前面几篇文章说了进行了很多描述性工作,本篇就直奔主题直接开始吧。不过再次强调一下:

在TBQ3中,程序使用事件驱动系统,具体的内容驱动事件可以参考官方文档中的介绍。首先一个空白的框架在TQB3中创建后,常用的代码框架格式如下:

上图中包含了最常用到的5个事件处理函数。为了Hello World中的简化,我们仅仅使用OnBarClose事件处理程序,这个方法仅在Bar结束的时候调用一次,也就避免了信号闪烁。而OnBar则会在每次有Tick更新数据时都会调用。
注意:TBQ3中这种区分为策略的设计提供了更加细致化处理的可能。这种事件驱动方式可以大幅简化很多历史的策略的实现方式。如果手里有很多以前收集的旧版TB策略,应该考虑使用这种新的事件驱动逻辑去改写。
1.1)逻辑定义和代码实现
首先,我们要实现在前一篇文章中所实现的逻辑,并将其作为信号在图表中显示出来。出于简化目的,我们仅在OnBarClose事件处理函数中进行逻辑编写,以避免不必要的信号闪烁处理。代码实现如下:

1.2)图表目视检查
在完成信号代码书写之后,不应该马上进行转化为策略,首先要做的是在图表上面对信号进行检查,确认信号是否符合逻辑的设计。首先新建一个K线图表,进行策略单元设置,配置好标的和数据参数,在图表上右键添加策略。添加信号策略后,可以看到信号已经显示出来了:

二、信号转换为策略
如果通过目视检查确认,逻辑已经通过信号正确地表达了出来。则可以开始将信号转换为一个完整策略。
2.1)开平仓间隔限制
首先,为避免刚刚平仓后立即开仓,还需要额外添加一个小逻辑检查是否刚刚进行了平仓。通过增加一个封装方法来实现退出交易的Bar间隔数量检查:

这里使用了一个状态函数: BarsSinceExit,该函数返回最近平仓的位置到当前位置的Bar计数是否满足制定间隔nBars。图中红线部分新增。
2.2)增加Buy API调用
增加Buy() API调用的过程比较简单,仅需要将之前的绘图语句:
plt.icon("开仓", low*0.998, "shangjiantou1");
替换为对应的API调用即可。因为逻辑实现在OnBarClose事件处理程序中,所以直接使用当前的Close并不存在偷价(包含滑点后),也避免了信号闪烁。此外为了避免重复信号导致的重复开仓,可以使用平台提供的一个状态函数:` MarketPosition`,持多仓时返回1,空仓返回0,仅在空仓时允许开新仓。

2.3)退出机制
均线类最广为人知的退出机制是:“当价格跌破20均后,就平多仓”。出于演示目的,我们使用这个逻辑作为基础的退出机制。为了避免开仓和退出矛盾,我们还需要在之前的开仓策略中额外增加一句对收盘价是否大于maSlow的检查,同时完成退出持仓:

图中红线部分为新增代码。其中额外使用了另一个状态函数:BarsSinceEntry,来来计算当前是否是新开仓的Bar。这只是一个比较好的编程习惯。对于本处的代码逻辑,从信号条件中逻辑判断:`Close > maSlow` 已经确保了当前Bar不会马上退出持仓。
2.4)Hard TPSL
作为一个很好的编程习惯,我们还应该为每个策略添加一个固定TPSL数值。这样可以保证如果基于策略逻辑的退出机制失效时,我们依然有一个兜底的风控措施。后面其他文章会详细讨论TPSL以及通过Python实现更加精细化和可靠的TPSL。这里所聊的固定TPSL并非策略的一部分,仅仅从编程的角度看是一个最后的保险措施,甚至可能几乎不会被触发。所以此时的TPSL初始数值可以根据经验设定为非常大的数值,后续根据参数优化的结果进行调整(本文后面会提到),代码修改如下:
- 声明止盈止损全局变量:

- Buy调用后设定TPSL数值:

- 添加TPSL逻辑:

2.5)图表目视检查
当完成:”逻辑 => 信号 => 策略”的转换之后,就可以通过图表进一步检查TBQ3展现出的的交易标记。当调用了Buy和Sell等API之后,TBQ3会在自动在装配了策略的图表上面执行回测,并增加交易图标显示,如下所示:

同时,为了方便目视调试,代码中使用注释标记了退出类型,更方便通过图表中目视来检查退出的原因和策略逻辑是否正确。如下所示:

这个目视过程和代码需要不断反复调试,直到通过目视的检查对结果满意。其中也可以使用比较简化的策略报告功能不断查看调试结果。这个过程非常像程序开发过程中的单元测试和调试开发阶段,通过不断地小样本的反复调试使程序达到可以通过冒烟测试的状态。
需要特别注意的,目视检查结合策略报告的调试非常容易导致严重的过拟合!所以需要随机调整数据时间段来避免过拟合,并且使用调试过的时间段来重新测试。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/774063
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!