先来说说今天的策略:均线定投策略,我第一次听到这个策略是在B站上,但是后来发现竟然在支付宝已经用上了,细心的同学在支付宝定投的时候应该会看到一个智能定投,对,就是它!
下面开始细说该策略:
首先,人为设置基础定投金额,可以是100、1000 等等,这个根据自己的实际情况来。
之后在每个定投日,根据当前的价格进行定投率的计算,然后通过下面的公式计算在当前定投日的实际投入:
实际投入=基础金额*定投率
定投率可根据偏离均线范围进行设定,例如偏离均线范围 50%及以上,定投率设置为 40%,偏离均线范围 40%-50%,定投率设置为 50%
对应的该B站阿婆主给出了一个参考案例,在A、B、C点根据偏离情况分别计算定投率
上面的数字都是在当前价格超过均线的情况下,也就是在绝对的上涨阶段。对应的,在绝对的下跌阶段,同样可以参考上面的策略计算定投率
类似的参考案例,在D、E、F点根据偏离情况分别计算定投率:
其实说白了,该策略的重点就是计算定投率,而定投率是根据当前价格和近250天的均线的偏离程度计算的。
对应的就有了下图的这个基础策略:
其实这个策略就是我们常说的:大跌大买、小跌小买。
不一样的是,它将跌的程度进行了量化,你买进的份额也就随之可以量化。
这种策略的好处就是你可以在任意位置买进,只要你能坚持跟着策略做定投,最终都会赚钱,而且越到后面赚的越多。
在解释这个原理的时候,该阿婆主用了一个很极端的例子:在最高点的时候买进某数字货币,然后根据策略坚持定投,在经历了下跌和震荡之后,当该货币的趋势趋于平稳并且慢慢开始上涨时,持有的收益已经开始由负转正。
结合下面这张图来看:
在2017年12月末最高点买进,之后坚持策略一直定投,经历了18年整年,直到19年5月的时候,收益开始由负转正。
至于该数字货币后面怎么走,这不是我们今天要关注的内容,你可以看到,即使你在最高点买入,期间经历了 腰斩、膝斩、甚至都斩到脚后跟了,但你跟着策略走,你终究还是会回本。
无非就是 用时间来换金钱
当我在和朋友讨论这个策略的时候,他眼前一亮,告诉我说支付宝有一个智能定投,可以了解一下。
于是我去看了一下支付宝的定投策略,一句话描述一下大概是这样的:
根据参考指数的收盘价和历史均值,动态调整扣款率,高于均线少投,低于均线多投 见下图👇
这不就是我们上面看到的定投策略嘛?再往下看:支付宝将该定投方式命名为均线定投,它的公式如下:
实际定投金额 = 基础定投金额 * 当期扣款率
看到公式的时候我明白了,这就是一个策略,只是设定的定投率和当期扣款率不一样。
为了让大家看的更明白,我从支付宝上直接将均线定投策略的具体扣款率弄了下来:
到这里,这个策略的原理想必大家都已经很清楚了,通过这个策略,你可以去定投基金、场内ETF、大盘指数、甚至是个股。
对了,对于个股我其实不是特别建议用这个策略,毕竟波动性太大,容易受各方面因素的影响。其实个股我有另外的方法,之后也都会分享出来,大家可以订阅 投资理财,用数据说话 这个话题,方便接收最新文章。
最后说一下策略复现
在复现的时候因为主要涉及的参数有两个,一个是需要参考的MA均线,一个是需要设置的定投率
在设置MA均线时,B站阿婆主设置的初始MA均线是250,支付宝策略设置的MA均线是500和10。
在设置定投率时,B站阿婆主是通过网格交易的方式设置的固定比例,支付宝策略设置的趋势比例。
如果你是在国内交易,可以参考支付宝的策略参数,或者你可以根据你想要定投的目标搜索一个更加合适的参数。以下是我复现的支付宝策略的核心代码:
以沪深300为例,代码:399300.SZ
首先是获取到 2019年至2021年9月30日的所有数据,进行相应的数据处理(列重命名、时间序列转换、排序、设计辅助列等)
code = '399300.SZ'
start_date = '20190101'
end_date = '20210930'
df_data = w.wsd(code, "pre_close,high,low,close,MA", start_date, end_date, "MA_N=500",usedf=True)[1]
df_data1 = df_data.reset_index().copy()
df_data1 = df_data1.rename(columns={'index':'trade_date', 'PRE_CLOSE':'昨收价', 'MA':'MA500', 'CLOSE':'收盘点位', 'HIGH':'最高点位', 'LOW':'最低点位'})
df_data1['trade_date'] = pd.to_datetime(df_data1['trade_date'])
df_data1 = df_data1.sort_values('trade_date',ascending=False).reset_index(drop=True)
df_data1['counter'] = range(len(df_data1))
其次是计算近10日的振幅情况,公式如下:
(本周期最高价-最低价)/上一周期的收盘价
也就是近10天的最高价-最低价,然后除以第前11天的收盘价
代码如下:
"""计算近10日的振幅"""
for index, row in df_data1.iterrows():
counter = row['counter']
if counter+10 > df_data1.shape[0]:
max_price = df_data1.loc[(df_data1['counter']>=counter) & (df_data1['counter']'最高点位'].max()
min_price = df_data1.loc[(df_data1['counter']>=counter) & (df_data1['counter']'最低点位'].min()
pre_close = df_data1.loc[df_data1['counter']==df_data1.shape[0]-1, '昨收价'].iloc[0]
else:
max_price = df_data1.loc[(df_data1['counter']>=counter) & (df_data1['counter']'最高点位'].max()
min_price = df_data1.loc[(df_data1['counter']>=counter) & (df_data1['counter']'最低点位'].min()
pre_close = df_data1.loc[df_data1['counter']==counter+9, '昨收价'].iloc[0]
ten_chg = (max_price-min_price)/pre_close*100
df_data1.loc[df_data1['counter']==index, '近十日振幅(%)'] = ten_chg
最后是计算当前价格的偏离程度,并根据近10日的振幅情况,计算当前的扣款率
代码比较简单,如下:
"""计算偏离程度和振幅,得出扣款率"""
df_data1['均价偏离(%)'] = (df_data1['收盘点位']-df_data1['MA500'])/df_data1['MA500']*100
df_data1 = df_data1.reset_index(drop=True)
df_data1['扣款率(%)'] = df_data1[['均价偏离(%)', '近十日振幅(%)']].apply(lambda x: get_kk_ratio(x), axis=1)
df_data1.head(20)
以上代码块可以直接合并运行,都是同一层级关系
上述代码输出的 9月份 扣款率结果如下所示:
可以看到,如果你是每周4定投,9月份出现的5个周4定投日,都是以90%的比例进行定投。
说直白点,你每次定投初始金额为 1000元,那么这5个定投日会各投 900元进去!
以上就是关于均线定投策略的复现,也仅是针对支付宝的智能定投策略进行策略的设计。
由于篇幅优先,关于沪深300的回测结果、白酒基金的回测结果、甚至部分个股的回测结果,我会在整理之后继续分享出来,大家可以关注一下 投资理财,用数据说话 这个话题,后续相关策略的复现、基金持仓的更新我都会汇总在这个话题下。
不想错过以后文章的读者,右下角的点赞和在看,你每次都点的话,公众号的每一篇推送你都会收到,这也是公众号推送机制改了之后不错过文章唯二的方式之一了。