Python量化交易——股票择时到底能否赚钱?技术指标大比拼——TRIX指标

45 篇文章 5 订阅
30 篇文章 43 订阅

Python量化交易——TRIX技术指标的有效性研究

背景介绍

技术指标是股票交易中最常用的技术手段之一,abc几乎所有的技术文章或股票分析文章都离不开通过MACD等各种指标来判断一支股票的买点和卖点,做量化的也会经常接触TA-Lib中提供的各种技术指标。从股评人的文章里看,似乎这些指标都有指哪打哪的能力,但是,我们既然做量化交易,就必须用数据说话,一个技术指标到底好不好,有没有用,不是靠嘴说的,是靠数据来验证的。因此,我这个系列文章的目标,就是把TA-Lib中的技术指标全都拿出来溜一溜,做一个横向大评比。俗话说,是骡子是马拉出来溜溜,通过大数据分析,我们就应该对指标的有效性有一个大致的了解。

为此,我通过一个系列文章,来综合评测33种TA-Lib中的技术指标的有效性,详情请点击这里

TRIX技术指标介绍

TRIX指标也称为“三重指数平滑移动平均指标”,它根据移动平均线理论,对一条平均线进行三次平滑处理,再根据这条移动平均线的变动情况来预测股价的长期走势。TRIX指标可以通过过滤掉许多不必要的波动来反映股价的长期波动趋势。

指标用法建议

TRIX指标是属于中长线技术指标,其最大的优点就是可以过滤短期波动的干扰,以避免频繁操作而带来的失误和损失。因此TRIX指标最适合于对行情的中长期走势的研判。在股市软件上TRIX指标有两条线,一条线为TRIX线,另一条线为TRMA线。TRIX指标的一般研判标准主要集中在TRIX线和TRMA线的交叉情况的考察上。其基本分析内容如下:

  1. 当TRIX线一旦从下向上突破TRMA线,形成“金叉”时,预示着股价开始进入强势拉升阶段,投资者应及时买进股票。
  2. 当TRIX线向上突破TRMA线后,TRIX线和TRMA线同时向上运动时,预示着股价强势依旧,投资者应坚决持股待涨。
  3. 当TRIX线在高位有走平或掉头向下时,可能预示着股价强势特征即将结束,投资者应密切注意股价的走势,一旦K线图上的股价出现大跌迹象,投资者应及时卖出股票。
  4. 当TRIX线在高位向下突破TRMA线,形成“死叉”时,预示着股价强势上涨行情已经结束,投资者应坚决卖出余下股票,及时离场观望。
  5. 当TRIX线向下突破TRMA线后,TRIX线和TRMA线同时向下运动时,预示着股价弱势特征依旧,投资者应坚决持币观望。
  6. 当TRIX线在TRMA下方向下运动很长一段时间后,并且股价已经有较大的跌幅时,如果TRIX线在底部有走平或向上勾头迹象时,一旦股价在大的成交量的推动下向上攀升时,投资者可以及时少量地中线建仓。
  7. 当TRIX线再次向上突破TRMA线时,预示着股价将重拾升势,投资者可及时买入,持股待涨。
  8. TRIX指标不适用于对股价的盘整行情的研判。

qteasy中内置了TRIX交易策略

这里使用qteasy作为回测评测的工具。

qteasy是本人正在开发的一个快速量化交易工具包,使用这个工具包,可以快速灵活地生成各种量化交易策略,生成历史数据并回测策略的表现,有针对性地优化策略的性能;还能模拟实盘自动化交易。qteasy目前最新版本为v1.0.14,可以通过pip安装,Github项目地址在这里

qteasy 的安装方法:

python -m pip install qteasy

qteasy中有一个内置策略TRIX是基于TRIX指标创建的,其创建规则如下:

交易策略:
计算价格的三重平滑指数移动平均价TRIX,再计算M日TRIX的移动平均:
1, TRIX位于MATRIX上方时,设置仓位目标为1
2, TRIX位于MATRIX下方时,设置仓位目标位-1

上述规则是qteasy内置策略的定义,用户完全可以根据自己的理解重新定义交易规则,或者选用其他策略参数。详细用法参见qteasy文档

433支股票五年回测结果

下面使用qteasy进行技术指标的回测
使用qteasy回测所有433支股票的回测结果,每次回测的时间跨度都是5年,从2015年1月1日开始投资于一个股票,在技术指标发出买入信号时全仓买入,在发出卖出信号后全仓卖出,一直到2019年21月31日为止,最后综合计算每个技术指标的指标强度适应性,通过两个数字来反映技术指标的有效性。关于计算方法的详细介绍,请参见这里

首先放出结果:TRIX策略的强度为

-11.2% ——该指标平均产生-11.2%的超额收益

result_df.describe()
return 策略收益率benchmark 基准收益率mdd 最大回撤sharp 夏普率alpha 超额收益diff
count288288288288288288
mean95.27%106.44%45.16%30.20%0.36%-11.16%
std147.99%178.18%11.42%35.54%14.13%152.78%
min-68.88%-57.14%14.93%-76.25%-40.46%-1146.94%
25%7.71%-11.96%36.76%2.94%-7.98%-53.29%
50%45.50%40.12%45.18%27.22%0.97%3.33%
75%136.21%156.31%53.08%55.00%8.80%55.34%
max985.36%1420.35%77.80%146.11%74.98%802.82%

296支股票的平均收益率是106.44%,而策略平均收益为95.27%,平均跑输了原始股票11个百分点。

再看策略适应性:

85.36%——该指标平均适应度85.36%,对于大部分股票能取得正收益

在所有有回测结果的296支股票中,六种典型结果的数量分别如下:

序号组别股票数量该组平均基准收益该组平均择时收益该组平均超额收益
1力挽狂澜51-29.52%47.98%77.50%
2锦上添花75103.28%202.73%99.44%
3差强人意101239.40%109.14%-130.27%
4无力回天20-37.01%-15.11%21.90%
5屋漏逢雨16-17.91%-30.62%-12.71%
6乐极生悲2550.41%-17.75%-68.16%

综上,结论如下:

  • 该指标在大部分情况下会产生正收益,产生正收益的比例有约76%
  • 该指标在大约一半的情况下能产生超额收益,比例为49%
  • 不足之处在于有大约1/3股票产生差强人意的收益,而且平均跑输原始股票130个百分点,这是导致指标失分的主要原因。

总体来说,该指标的择时效果较好,且有较好的抗跌性能,只是平均超额收益不够理想。如果要看其他所有股票的结果,请点击这里

  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是股票常用指标Python 代码示例: 1. 移动平均线(MA) ```python import pandas as pd # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算5日移动平均线 df['MA5'] = df['close'].rolling(5).mean() # 计算10日移动平均线 df['MA10'] = df['close'].rolling(10).mean() # 计算20日移动平均线 df['MA20'] = df['close'].rolling(20).mean() ``` 2. 指数移动平均线(EMA) ```python import pandas as pd # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算12日指数移动平均线 df['EMA12'] = df['close'].ewm(span=12, adjust=False).mean() # 计算26日指数移动平均线 df['EMA26'] = df['close'].ewm(span=26, adjust=False).mean() ``` 3. 相对强弱指标(RSI) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算14日相对强弱指标 df['RSI'] = talib.RSI(df['close'].values, timeperiod=14) ``` 4. 布林带(BOLL) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算布林带 df['upper'], df['middle'], df['lower'] = talib.BBANDS(df['close'].values, timeperiod=20) ``` 5. 随机指标(KDJ) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算KDJ指标 high = df['high'].values low = df['low'].values close = df['close'].values df['K'], df['D'] = talib.STOCH(high, low, close, fastk_period=9, slowk_period=3, slowk_matype=0, slowd_period=3, slowd_matype=0) df['J'] = 3 * df['K'] - 2 * df['D'] ``` 6. 平均真实波幅(ATR) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算14日平均真实波幅 df['ATR'] = talib.ATR(df['high'].values, df['low'].values, df['close'].values, timeperiod=14) ``` 7. 动量指标(MOM) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算12日动量指标 df['MOM'] = talib.MOM(df['close'].values, timeperiod=12) ``` 8. 相对强弱指数(RSI) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算14日相对强弱指数 df['RSI'] = talib.RSI(df['close'].values, timeperiod=14) ``` 9. 指数平滑移动平均线(MACD) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算MACD指标 macd, macdsignal, macdhist = talib.MACD(df['close'].values, fastperiod=12, slowperiod=26, signalperiod=9) df['MACD'] = macd df['MACD_SIGNAL'] = macdsignal df['MACD_HIST'] = macdhist ``` 10. 相对强弱平均线(RMI) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算RMI指标 df['RMI'] = talib.RMI(df['close'].values, timeperiod=14) ``` 11. 能量潮指标(OBV) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算OBV指标 df['OBV'] = talib.OBV(df['close'].values, df['volume'].values) ``` 12. 三重指数平滑移动平均线(TRIX) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算TRIX指标 df['TRIX'] = talib.TRIX(df['close'].values, timeperiod=30) ``` 13. 移动平均线收敛/发散指标(MACD) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算MACD指标 macd, macdsignal, macdhist = talib.MACD(df['close'].values, fastperiod=12, slowperiod=26, signalperiod=9) df['MACD'] = macd df['MACD_SIGNAL'] = macdsignal df['MACD_HIST'] = macdhist ``` 14. 顺势指标(CCI) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) high = df['high'].values low = df['low'].values close = df['close'].values # 计算CCI指标 df['CCI'] = talib.CCI(high, low, close, timeperiod=20) ``` 15. 平均趋向指标(ADX) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) high = df['high'].values low = df['low'].values close = df['close'].values # 计算ADX指标 df['ADX'] = talib.ADX(high, low, close, timeperiod=14) ``` 16. 相对强弱指标(ROC) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算ROC指标 df['ROC'] = talib.ROC(df['close'].values, timeperiod=10) ``` 17. 心理线指标(PSY) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算PSY指标 df['PSY'] = talib.PSY(df['close'].values, timeperiod=12) ``` 18. 威廉指标(WILLR) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) high = df['high'].values low = df['low'].values close = df['close'].values # 计算WILLR指标 df['WILLR'] = talib.WILLR(high, low, close, timeperiod=14) ``` 19. 相对强弱动量指标(RMI) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) # 计算RMI指标 df['RMI'] = talib.RMI(df['close'].values, timeperiod=14) ``` 20. 梅斯线指标(MASS) ```python import pandas as pd import talib # 读取股票数据 df = pd.read_csv('stock.csv', index_col='date', parse_dates=True) high = df['high'].values low = df['low'].values close = df['close'].values # 计算MASS指标 df['MASS'] = talib.MASS(high, low, close) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值