【近五年年化17%】浅谈RUMI策略和其两个衍生策略

文章介绍了RUMI量化策略的基本逻辑,通过双均线计算得出RUMI值,用于判断市场趋势。文章探讨了模型搭建、优化过程,包括使用斜率代替离差值和引入双指标策略,以降低滞后性。改进后的策略在某些情况下表现出色,特别是在股市趋势明显时有防御作用。
摘要由CSDN通过智能技术生成

一、RUMI是什么?

在美国著名权威的交易系统评选杂志之一的《Futures Truth Magazine》中,RUMI策略在“多市场量化策略”排名第六,是一个非常简短但是又很有效的策略。

(图片来源:又来唠一唠曾在全球量化策略热榜上排名第6的RUMI策略

其基本逻辑类似于双均线策略,但是比双均线调仓频率更低,也更稳健,可以更有效地过滤市场噪音。通过计算双均线的离差值,并进行平滑处理得到RUMI值。RUMI值上穿0则意味市场看多趋势,此时买入;RUMI值下穿0则意味着市场看空趋势,此时卖出。

二、模型搭建 

接下来来搭建模型。

首先获取近五年股票数据。为方便起见,本文不对面板数据实施该策略,选取沪深300指数股作为投资标的回测策略效果。

import tushare as ts
import numpy as np
import pandas as pd
import talib
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')

data = ts.get_k_data(code='hs300', start = '2018-01-01', end = '2023-11-18', ktype = 'D')
data = data.set_index('date')
data.index = pd.to_datetime(data.index)
data = data[['open','close','high','low']]
data['pct'] = data['close'].shift(-1)/data['close']-1

接下来计算RUMI值。这里长期均线采用50日均线,短期均线采用3日均线,RUMI值采用30日平滑离差值。

data['fast'] = talib.SMA(data['close'].values, timeperiod = 3)
data['slow'] = talib.WMA(data['close'].values, timeperiod = 50)
data['diff'] = data['fast']-data['slow']
data['rumi'] = talib.SMA(data['diff'].values, timeperiod = 30)
data = data.dropna()

最后,回测结果。如果既可以做空又可以做多,采用一下回测代码:

data['strategy_pct']=data.apply(lambda x: x.pct \
                if x.rumi > 0 else -x.pct, axis=1)
data['strategy'] = (1.0 + data['strategy_pct']).cumprod()
data['benchmark'] = (1.0 + data['pct']).cumprod()
annual_return = 100 * (pow(data['strategy'].iloc[-1], 250/data.shape[0]) - 1.0)
print('Annual return for HS300 with RUMI is:%.2f%%' %annual_return)
ax = data[['strategy','benchmark']].plot(title='Selection of HS300 using RUMI')
plt.show()

下图回测结果较差,年化仅-0.89%,而且在大多数时候跑输指数。

如果考虑A股市场做空困难,而只考虑RUMI上穿0做多,下穿0卖出平仓,并等待RUMI再次上穿0时买入,只需将计算data['strategy_pct']的代码改成:

data['strategy_pct']=data.apply(lambda x: x.pct if x.rumi > 0 else 0, axis=1)

回测表现仍然不及预期,年化仅0.07%

比较fast、slow曲线和rumi曲线(2018-01-01至2020-01-01)时可以发现,将rumi作为信号容易造成见顶才入局、见底才卖出。在2018-2020年期间,RUMI的信号和实际股市信号常有差池,在2019年上半年短暂跟上上涨趋势,但是在2019年下半年常常给出错误信号。

即便将RUMI值计算时的平滑周期缩小为3天,回测结果仍差强人意。

猜测RUMI(平滑30天离差值)策略在股市震荡幅度较大时并不能迅速反应,于是考虑对模型进行优化和衍生。

三、模型优化 

(一)可能更改方向 

1.将计算rumi(原理在于计算面积)更改为计算斜率(即离差变化程度)。其原理简单直观:斜率为0说明股价已经到极值点(最高值或者最低值),而当涨跌幅斜率由0转为正时说明市场正在上涨区间内,应该买入;当涨跌幅斜率由0转为负时说明市场正在上涨区间内,应该卖出。这样的判别方法可以更有效规避见顶入局、见底卖出的情况。

(原理示意图)

2.双指标判断:上涨采用RUMl值判断下跌时及时止损,采用双均线法判断。观察RUMI策略表现不佳的原因可以看到,RUMI在及时止跌止损方面反应较慢,因此常常造成跑输指数的现象。为了保持RUMI的优势,在买入侧仍然采用RUMI策略,而在卖出侧采用反应速度更快、更敏捷的双均线法,即短期均线下穿长期均线即卖出。

(二)更改 

1. 斜率法(Slope)

获取数据部分与RUMI一致,在计算斜率时采用:

data['fast'] = talib.SMA(data['close'].values, timeperiod = 3)
data['slow'] = talib.WMA(data['close'].values, timeperiod = 30)
data = data.dropna()
data['diff'] = data['fast']-data['slow']
data['diff_pct'] = data['diff']/abs(data['diff'].shift(1))-1
data['signal'] = talib.SMA(data['diff_pct'].values, timeperiod = 3)
data['pct'] = data['close']/data['close'].shift(1)-1
data = data.dropna()

回测结果(以下回测均采用long only,不再考虑做空)

data['strategy_pct']=data.apply(lambda x: x.pct if x.signal > 0 else 0, axis=1)
data['strategy'] = (1.0 + data['strategy_pct']).cumprod()
data['benchmark'] = (1.0 + data['pct']).cumprod()
annual_return = 100 * (pow(data['strategy'].iloc[-1], 250/data.shape[0]) - 1.0)
print('Annual return for HS300 with Slope is:%.2f%%' %annual_return)
ax = data[['strategy','benchmark']].plot(title='Selection of HS300 using Slope')
plt.show()

回测结果非常优秀,近五年年化收益率为16.93%,而且近两年表现优异,回撤也较低。

2. 双指标法(Double-Signal)

获取数据部分与RUMI一致,在计算RUMI之之后构造signal:

data['signal'] = (data['rumi']>0) & (data['diff']>0)

回测代码类似,回测结果也较为优秀,近五年年化达4.93%,近两年表现优秀,在熊市环境下起到了有效防御作用。

四、总结和评价 

根据RUMI的原理可知这一策略较为稳健,找到明确的上涨趋势之后才买入,获得明确的下跌趋势后才卖出。但是问题在于可能滞后性较大,尤其股市迅速下跌时无法及时止损。

因此考虑两种变形,一种是根据离差变化程度作为替代信号,一种是采用“买入看RUMI,卖出看死叉”的方式。改进后的策略表现均较优异。

仔细观察改进后的策略,发现近两年表现尤为优秀,说明这类策略较为稳健,具有一定防御作用。在股市震荡剧烈时这类策略可能表现不及预期,但是在股市趋势明显或波动大但反转不频繁时表现良好,并具有及时止损的防御作用

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值