输入/搜索内容
1
关注
279
关注者
港股量化之钱德动量摆动策略(CMO)
创建于 2020-12-04 18:08:01  更新于 2024-12-26 21:48:37
 0
 1694

img

一、摘要

在上个章节中,我们学习了美股港股的基础知识和优势,以及如何使用优宽量化(youquant.com)获取行情。本节我们将开发一个钱德动量摆动(CMO)策略,来实现港股量化交易。

二、初识CMO

对于交易初学者来说,最先接触的应该是各种各样的技术指标,相信每个小伙伴们都有一两个自己擅长的。通过技术指标来实现策略构建,是量化交易最简单的入门方式。

您认为是什么原因导致了价格的上涨或下跌?宏观政策、新闻事件、供需关系、市场情绪等等,这些都有可能影响价格的波动。但最终价格上涨或下跌是多方力量和空方力量角逐的结果,如果多方力量强于空方,将会推升价格上涨,反之亦然。而钱德动量摆动(CMO)则可以测量价格背后的动能。

三、CMO简介

img
钱德动量摆动(CMO)出自Tushar Chande,其本人不仅是一位科学家,还是出色的系统化交易员。市面上有很多动量摆动指标,比如:相对强弱指标(RSI)和随机指标(KDJ),但钱德动量摆动(CMO)的独特之处在于其计算公式的分子中采用上涨日和下跌日的数据。

四、CMO计算公式

CMO=((Su-Sd)*100)/(Su+Sd)

其中:

Su是今日收盘价与昨日收盘价(上涨日)差值加总。若当日下跌,则增加值为0;

Sd是今日收盘价与做日收盘价(下跌日)差值的绝对值加总。若当日上涨,则增加值为0。

五、CMO用法

1、零轴交叉

CMO上穿零轴时可以视为多头信号,下穿零轴时可以视为空头信号。如下图所示:
img

2、超买/超卖

CMO的值是在-100~100范围内移动,如果其值小于-50表示处于超卖区,如果其值大于50表示处于超买区。如下图所示:
img

3、背离

理论上CMO应该与价格通向,如果价格创新高,但CMO没有创新高,甚至走低,那么价格上涨趋势可能即将反转;如果价格创新低,但CMO没有创新低,甚至走高,那么价格下跌趋势可能即将反转。如下图所示:
img

4、绝对值

CMO的绝对值越高,表明趋势的力量越强,如下图所示:
img

六、策略逻辑

根据以上CMO的用法,创建一个量化交易策略,策略逻辑如下:

  • 多头开仓:如果当前无持仓,并且价格大于长期和短期均线,并且CMO的绝对值大于阈值
  • 空头开仓:如果当前无持仓,并且价格小于长期和短期均线,并且CMO的绝对值大于阈值
  • 多头平仓:如果当前持多单,并且价格小于短期均线
  • 空头平仓:如果当前持空单,并且价格大于短期均线

七、完整策略

python
'''backtest start: 2017-01-01 00:00:00 end: 2020-12-01 00:00:00 period: 1h basePeriod: 1h exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}] ''' # 导入第三方库 # 如果本机电脑没有这些库,需要使用pip安装 import talib import numpy as np # 定义全局变量,记录开平仓 mp = 0 # 获取K线列表中的收盘价数据 def get_data(bar): arr = [] for i in bar: arr.append(i['Close']) return arr def bar(): bar = _C(exchange.GetRecords) # 获取K线列表 if len(bar) < ma_length: # 如果K线列表长度过小 return # 就直接返回 bar.pop() # 删除列表最后一个元素 price = bar[-1]['Close'] # 最新价格 np_arr = np.array(get_data(bar)) # 转换数据类型 cmo = abs(talib.CMO(np_arr, cmo_length)[-1]) # 计算CMO数据 ma1 = talib.MA(np_arr, ma_length)[-1] # 计算长期均线 ma2 = talib.MA(np_arr, ma_length / 2)[-1] # 计算短期均线 global mp # 引入全局变量 if mp > 0 and price < ma2: # 如果当前持多单,并且价格小于短期均线 exchange.SetDirection("closebuy") # 设置交易方向和类型 exchange.Sell(price - 1, 1) # 平多单 mp = 0 # 重置虚拟持仓 if mp < 0 and price > ma2: # 如果当前持空单,并且价格大于短期均线 exchange.SetDirection("closesell") # 设置交易方向和类型 exchange.Buy(price, 1) # 平空单 mp = 0 # 重置虚拟持仓 if mp == 0 and abs(cmo) > cmo_value: # 如果当前无持仓,并且CMO的绝对值大于cmo_value if price > ma1 and price > ma2: # 如果价格大于长期和短期均线 exchange.SetDirection("buy") # 设置交易方向和类型 exchange.Buy(price, 1) # 开多单 mp = 1 # 重置虚拟持仓 if price < ma1 and price < ma2: # 如果价格小于长期和短期均线 exchange.SetDirection("sell") # 设置交易方向和类型 exchange.Sell(price - 1, 1) # 开空单 mp = -1 # 重置虚拟持仓 def main(): _C(exchange.SetContractType, 'rb000') # 订阅行情 while True: # 进入无线循环模式 bar() # 重复执行bar函数 Sleep(1000) # 使程序休眠1秒

直接点击下方链接,复制完整策略,无需配置直接回测:
https://www.youquant.com/strategy/239900

相关推荐
评论
全部评论 (0)
暂无数据
暂无数据
  • 1
iPhone 下载
社区
回测系统
© 2015 - ∞ YouQuant 豫ICP备19046564号