一、策略简介
动量交易策略源于股票或期货市场中的动量效应,所谓动量效应是指过去一段时间的收益较高的资产价格,那么,资产在未来一段时间内同样也能获得较高收益。
同样的,如果某一资产价格过去的波动越大,那么在未来的一段时间内这部分资产价格的波动同样也大,也就是惯性效应。因此,基于这样的逻辑开发策略,称作:动量策略。
在股票和期货市场都有这样的效应,那么下面在期货市场中实现基于这一逻辑的策略。
二、策略的原理
本文将利用海龟交易策略中的唐奇安通道,应用在这一逻辑中,用Python tqsdk 开发基于多品种的动量交易策略,品种排序的标准是根据平均真实波幅(ATR中的TR)进行一阶段差分后平均值,进行排序。
策略逻辑:
(1)在多个品种中选出波动率较大的品种,计算唐奇安通道。当价格突破上轨时,开多。跌破下轨时开空。
(2)当价格突破上轨时,平空。跌破下轨时平多。
其实我们可以看得出,策略的基本思想并不复杂,就是一个通道+动量效应。但就是因为是基于动量这一逻辑,才让一个平凡的策略拥有比较理想的收益。在量化程序化交易中获得很多交易者的亲睐!
三、代码编写
策略的实现过程,我将用四个部分来讲解:剔除交易量较小或上市短的品种、按照ATR平均真实波幅进行排序、将排序后的期货合约进行交易。
(一)首先,剔除交易量较小或上市短的品种。
1.导入模块。
from tqsdk import TqApifrom tqsdk.ta import ATR,MAfrom datetime import timedeltaimport pandas as pdimport seaborn as snsimport numpy as npimport mathimport matplotlib.pyplot as pltsns.set()
2.获取剔除后的品种。我们剔除了股指期货和成交量或上市日期较短的期货品种",存入symbol_Trade这个列表中,用后后续进行排序。
symbol_Trade = []def trade_symbol(api): "剔除股指期货和成交量或上市日期较短的期货品种" Continuous_contract = [v["underlying_symbol"] for k, v in api._data["quotes"].items() if k.startswith("KQ.m")] symbol_Index = [] a = '' for i in range(len(Continuous_contract)): if Continuous_contract[i].split('.')[0] == 'CFFEX': continue else: for j in range(len(Continuous_contract[i].split('.')[1])): if Continuous_contract[i].split('.')[1][j] in '0123456789': symbol_Index.append(Continuous_contract[i].split('.&#