止盈系统的进一步优化

目前的止盈系统的原理是固定了一个止盈参数,这个止盈参数包含了两个值,一个值是止盈收益率,也就是说,在(收盘价*止盈收益率)>成本价的时候,按照(收盘价*止盈收益率)价格卖出,第二个值是止盈比例,是说在卖出的时候卖出多少比例的股份,第二个值现在一般固定为100%。

能卖尽卖

这种方案经常会出现一个问题,就是按照止盈收益率来卖出,因为设置的有点高,很可能卖不出去,所以后来进一步优化,提出了能卖尽卖方案,该方案集中的点在溢价上,因为ETF价格相比IPOV(净值)会有一些溢价,有时候是溢价,有时候是折价,而在确定第二天的卖出价格的时候,尽量使用折价——以保证价格挂的低些,这样更容易卖出去。

另外在买入的时候可能比策略发信号的价格高,这样第二天挂止盈单的时候价格也会偏高,这时候会选择用策略买入价格来算,而不是实际成交价。

总之,思路就是尽可能保证在符合条件的情况下第二天可以挂出止盈单,而且尽可能往低了挂,在这一系列的调整下,回测收益率有小幅的提高。

进一步优化

这段时间创业板50的极端拉胯,导致回撤进一步增大,而且经常出现擦肩而过然后卖不出去的情况,紧接着就是发出卖出信号,导致亏损。

所以这段时间进一步的思考了下止盈系统

其实仔细想想,在第二天挂止盈单的时候,挂在止盈收益率的这个价格上和挂在平盘(前一天收盘价)上,似乎差异并不大,反倒是挂在平盘上更容易卖出去。如果挂的高能卖出去,那么挂的低的价格肯定能卖出去。而挂的低的价格卖出去,挂的高的价格不一定能卖出去。因为系统还有一个设置就是如果第二天收盘价大于成本价,那么就以收盘价卖出去。这一点的设置保证了,不论挂高挂低都是有一个托底。如果挂的高没卖出去,在收盘价盈利的情况下肯定能卖出去,如果收盘价亏损——那可以想象这一天是个啥行情。。所以综合来看还不如挂的低来的靠谱

基于这个思路,可以将上车后的情形分为可以挂止盈单和不能挂止盈单,可以挂止盈单的挂的价格越高,卖出的概率越低,挂的价格越低,卖出的概率越高,这两种情况收益率都很小,其实这是一个数学期望的问题,所以需要找到最合适的一个点。不能挂止盈单的,那就不挂了,很简单。

从代码上梳理逻辑,对应其实就是以下两种情形:

  1. 收盘价大于成本价
  2. 收盘价小于成本价

下面分别论述

收盘价大于成本价

这时候会挂止盈单,那么从成本价起步,挂哪个价格合适呢。

挂的价格越高,卖出的概率越低,挂的价格越低,卖出的概率越高,这两种情况收益率都很小,其实这是一个数学期望的问题:盈利比例X挂单价格的概率

所以可以在代码上设置这样一个变量,来循环遍历看哪个参数最优

挂单价格出现的概率

可以预见的是挂单价格越低出现的概率越高,比如相比收盘价-10%肯定是100%出现,相比收盘价10%肯定是0%出现,而出现在收盘价周围的价格比例应该是最高的,有没有觉得这像数学中的一种分布?对,就是正态分布,中间大,两头小。

而且相比于正态分布来说,这个分布应该还有一个特点,就是曲线可能不是那么平滑,也就是说在两边可能会出现断层,那么我们优化的目标就很简单了,找出中间那部分——概率最高的部分,选择比收盘价高的那个点,就是挂单价格的最优解。这样,挂单价格最高,挂单价格出现概率也高,那么数学期望就高,也就是止盈收益最大。

每一个标的在发出买入信号后,而且当天收盘价大于成本价,第二天的价格概率分布可能是不一样的,所以需要每个标的分别统计,然后最终看看是否有统一性。如果没有,那么需要每个标的单独处理。

收盘价小于等于成本价

这里相比上面那种情况要简单,但是需要考虑的是成本价小于收盘价多少的时候我们需要挂卖出单,而挂卖出单的价格是固定的,就是保本出。至于为什么选择保本出,在文中一开始就论述过了,挂个保本出和挂多零点几其实差异不大,而卖出去和卖不出去差异比较大。

那这里我们只要设置一个变量,循环去跑一遍,找收益最大的那个值就可以了。

根据这个原则,筛选了一遍,貌似还真是现在的止盈参数是最佳的,在各个标的上表现都还可以。

代码

选择价格的代码其实很简单,sell_rate对应收盘价大于成本价的止盈盈利率,change_rate对应收盘价小于等于成本价的差多少卖的差价率

1
2
3
4
5
6
7
8
if close_price > stock_cost_price:
profit_sell_price = max(round((close_price * (100 + sell_rate)) / 100, 3), stock_cost_price + 0.001)
else:
change_price = round((close_price * (100 + change_rate)) / 100, 3)
if change_price < stock_cost_price:
continue
else:
profit_sell_price = stock_cost_price + 0.001

回测

虽然看起来上面两种情况是独立的,但是其实其中有千丝万缕的联系,所以搞了个双重循环,来寻找最佳的参数点。跑了一遍发现,每个标的其实不太一样,但是差的也不多,所以最后那就每个标的挂止盈的时候选择不同的参数吧。

下面是新的止盈策略和之前的收益率的比较图,可以看出来还是有一些不错的提升

image.png

作者

skyrover

发布于

2023-02-22

更新于

2023-02-22

许可协议

评论