打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
量化策略课第六关笔记

介绍

认识期货之前,得先理解什么是“现货”。

在金融市场中,“现货”是指能够通过买卖交易,立即转换所有权的“实物”

期货买卖双方通过签订合约,跨越时间在“未来”完成交易的方式。

期货交易的特点

特点 a:买卖合约

期货通常以标准化合约的形式,集中在期货交易所,进行买卖。

现货交易的对象是“实物”,但期货的交易对象是合约(合同)本身。

特点 b:以小博大

在投资期货时,也需要缴纳一定的保证金手续费,对象是期货交易所。

保证金的比例不是固定的,目前我国的最低保证金为交易金额的 5%

这种以小博大的方式,就是金融市场常说的“杠杆”

特点 c:双向交易

和一般的股票市场不同,期货可以买多也可卖空。甚至,你可以既买多也卖空。

如果你觉得未来的价格是上涨(看涨),那么就可以做多,开多单,买入合约。

如果你觉得未来的价格是下跌(看跌),那么就可以做空,开空单,卖出合约。

期货的结算制度

它执行的是当日无负债结算制度,当天结算所有合约的盈亏。

保证金不足或者在规定时间内没有补足,交易所就会对其进行强制平仓

若账户里的保证金直接亏损且无法追加保证金,被强平,我们称为“爆仓”

若强平之后,依然出现倒欠钱的情况,我们称为“穿仓”

期货的平仓就是手里有“做多合约”就强行卖出合约,如果有“做空合约”就强行买入合约

做多做空是两个相对的概念。

做多,是通过股价的上涨盈利,而做空,靠的是股价下跌盈利。

因而在期货市场,无论是上涨还是下跌趋势,都有投资者从中赚钱。

特点 d:多样性

市面的期货种类也逐步丰富,大致可分为商品期货金融期货

像黄金、农产品、原油一类属于商品期货,较为流行的金融期货有外汇、利率等。

!
导入失败


不同类型的期货,所要缴纳的保证金比例也不一样。

!
导入失败



CTA 策略

介绍

CTA(Commodity Trading Advisor),中文翻译为“商品交易顾问”。

原指代美国交易农产品期货的顾问,也被称作“管理期货”,由 NFA(全国期货业协会)认定,并在 CFTC(商品期货交易委员会)注册,监管的投资经理人。

一般是指通过给客户提供期权、期货方面的交易建议,或者直接通过受管理的期货账户,参与实际交易来获得收益的机构或个人。

随着商品期货市场的发展,CTA 的业务范围也在扩大,CTA 的内涵也不断充实。

现在,人们提到 CTA,有着多种含义:

1)指代标准定义的商品交易顾问;

2)指代 CTA 基金,也就是进行期货管理的基金;

3)指代机构或者个人所使用的策略;

4)指代投资于期货的资产管理产品。

现在用一句话来概括就是:CTA 是期货行业中的一种基金管理方式

CTA 策略又称“管理期货策略”,是指在期货市场利用期货价格变动趋势获利的一种投资策略。

CTA 交易策略有以下几大特点:

1)与股市的相关性低。CTA 策略的主要标的是期货市场的各个品种,这种底层资产本身就与传统市场差异较大,产品之间的相关性也很低,有利于分散风险;

2)保证金交易制度。由于期货市场采用保证金交易制度,各不同品种通过保证金交易,可以实现数倍乃至数十倍的无成本杠杆;

3)具有危机 Alpha 的“保险”作用。因为期货是双向交易的机制,所以 CTA 可以跟随行情趋势,做多或做空标的来获取收益。

CTA 策略的分类

CTA 策略大致可分为两类:套利类策略趋势跟踪策略

!
导入失败


套利类策略

主要依赖不同金融产品价格之间的稳定关系,根据品种间的价差在“某个范围”内的波动,通过“买卖价差”进行获利。

套利策略的主要特点是“赚胜率高的小钱”,每笔交易的确定性较高,盈利相对较小。

本质上,它是一种反趋势(与主流趋势相反)的策略,和趋势跟踪策略互补

常见的套利策略有:期现套利跨期套利跨市场套利跨品种套利

目前市场上流通较广的 CTA 策略,主要以趋势类策略为主。

趋势跟踪策略的概念

趋势策略的盈利依赖于市场的波动性,捕捉市场单方向运行的行情。一旦市场出现大方向性的波动时,该类策略的收益会较高。

但是当市场较为平稳、没有明显的方向性波动,这类策略就对市场的变化不够敏感了,也难以发挥他们的作用。

所以,做好止损也是该类策略中的重要环节。

趋势策略的主要特点是“亏小赚大”。

常见的趋势追踪策略

CTA 的趋势策略会根据趋势级别不同,将趋势类策略大致分为日内策略以及日间策略

所谓的日内策略,是指一种短期交易策略,一天结束时平仓,从价格的小幅波动中获利,更关注市场短期(一天)变动。

日间策略则相反,通常是隔夜持仓,也可以是隔周/月持仓,从市场大的行情和趋势中获利。

!
导入失败


日内策略

日内趋势策略主要是通道突破类策略

常见的日内策略有 R-Braker 策略Dual Thrust 策略菲阿里四价策略空中花园策略

这几个常见的日内策略都属于通道突破策略,核心都在于通道上下轨的确定

日间策略

日间趋势策略这类策略大体可分为:

1)通道类策略。一般根据确认的价格中枢,以及计算得到的波动范围,确定一个通道的上下轨,价格突破上下轨则认为是某一趋势,可以进行交易。

2)信号类策略。主要依赖一些技术指标,以确认价格的趋势进而指导交易。

常见的日间策略还有 Aberration 策略ATR 策略动量策略肯特纳策略

!
导入失败


肯特纳通道策略

肯特纳通道策略的原理

肯特纳通道,英文为 Keltner Channel,是 Chester Keltner 在二十世纪六十年代首次推出,最开始应用于期货,后经过演变和改良,也逐步推广于股票、外汇等各大金融市场。

它由上轨、中轨、下轨三条线组合而成(也称上通道、中通道及下通道),是一种通道类策略

!
导入失败


肯特纳通道的计算方式如下:

1)中轨:N 日(收盘价+最高价+最低价)/3 的指数移动平均线 EMA;

2)通道宽度:N 日 ATR * k;

3)上轨:中轨 + 通道宽度;

4)下轨:中轨 - 通道宽度。

注:k 为 N 日 ATR 的倍数,该变量越大,通道的宽度越大。

用一句话总结:肯特纳通道的中轨为价格数据的移动平均线(EMA),而通道的上下轨由中轨叠加平均真实波幅(ATR)所构成

与布林带通道对比:

!
导入失败


公式出现了两个陌生的技术指标:EMAATR。在 ForTrader 中,你可以直接调用专门的类与函数,计算出结果。

EMA 的概念及原理

EMA 原文为 Exponential Moving Average,直译过来,就是指数移动平均值,也称之为 EXPMA 指标。

!
导入失败


当天的 EMA 值 = 近期数据权重 * 当前价格 + 剩下的权重 * 前一天的 EMA 值

ATR 的概念及原理

ATR 是一种震荡类指标,英文全称是 Average True Range。

其中,Average 是平均的意思,True Range 翻译过来是“真实波幅”(TR),整体译为“平均真实波幅”

是指过去一段时间,真实波幅的指数移动平均值,用于描述价格的波动情况。

!
导入失败


ATR 的计算公式要分两步来理解,一个是 TR,另一个是 EMA

首先,最关键的部分,是TR(真实波幅)的计算,它的计算公式如下图所示 👇。

!
导入失败

!
导入失败


计算当日的 TR 值,至少要用到两根 K 线,分别是今日和前一日的 K 线。

如图所示,当前交易日为阴线,前一个交易日为阳线。

真实波幅就是从以下三种情况中,找到它们波动幅度最大的值,获取幅度方法就是计算数值之差的绝对值

情况 ① 是:(当日最高价 - 当日最低价)的绝对值;

情况 ② 是:(当日最高价 - 前一日收盘价)的绝对值;

情况 ③ 是:(当日最低价 - 前一日收盘价)的绝对值。

上图中,情况 ① 的波幅最大(线段最长),

所以当前交易日的真实波幅就是 ① 的值:

(当日最高价 - 当日最低价)的绝对值

肯特纳通道策略的应用

根据市场价格的不同走向,肯特纳通道策略能发出不同类型的交易信号。

中轨处于上升趋势,且市场价格突破上轨,表示此时的市场处于强势,上涨趋势将延续一段时间,可以做多。止损条件设置为价格向下突破中轨。

!
导入失败


中轨处于下降趋势,且市场价格突破下轨,表示此时的市场处于弱势,市场价格大概率将持续下跌一段时间,可以做空。止损条件设置为价格向上突破中轨。

!
导入失败


综上,根据价格与肯特纳通道上中下轨的不同突破情况,肯特纳通道策略有以下几个重要的使用方法:

1)如果当日的中轨值大于前一日的中轨值,并且收盘价向上突破了上轨,那就发出做多信号;

2)如果当日的中轨值小于前一日的中轨值,并且收盘价向下跌破了下轨,那就发出做空信号;

3)当持有多仓的时候,收盘价跌破了中轨时,则发出平多信号;

4)当持有空仓的时候,收盘价上穿了中轨时,则发出平空信号。

下图为使用肯特纳策略,产生做多信号(买点)、平多信号(卖点)的示

!
导入失败


肯特纳通道策略的代码讲解

指标模块

指标模块主要实现以下三个功能:

!
导入失败


功能一:设置肯特纳通道策略的 2 个重要参数

period 为周期参数,主要控制肯特纳通道中轨 EMA 和 上下轨 ATR 的周期。

将该参数设为 10,意思是计算均值的滑动周期数为两周交易日。

k 为倍数参数,用于控制肯特纳上下轨与中轨的距离。

将该参数设为 1.5,意思是中轨与上下轨保持 1.5 倍 ATR 的距离。

!
导入失败


参数名称period 和 k 可以自定义,但要保证后面使用该参数时,名称一致。

功能二:获取肯特纳通道的 3 个指标

肯特纳通道三个指标包括,上轨、下轨和中轨。

在此之前,需要先实例化肯特纳通道类KeltnerChannel(),传入参数:标的对象context.data、周期period、通道倍数devfactor

!
导入失败


通过实例.属性的方式,分别获取到肯特纳通道的上轨、下轨、中轨。

你也许注意到了,中轨(context.middle_line)和上下轨(upper_line、lower_line)的变量命名方式并不相同。

这是因为,上下轨的计算在指标模块就能结束了。但后面的择时模块将持续使用中轨数据,于是增加了context.前缀,令其变成全局模块皆可访问的变量。

功能三:计算收盘价与肯特纳通道上轨、下轨的交叉信号

之前,我们获取“两线交叉信号”的方式,是通过判断数据序列之间的大小关系,以上穿信号为例。👇

!
导入失败


你可以直接调用 CrossOver() 类,获取两线的交叉信号。

!
导入失败


该类有两个参数,分别传入你想计算交叉的数据序列,以数据 1数据 2为例:

当返回的值为 1.0,说明 数据 1 上穿 数据 2

当返回的值为 -1.0,说明 数据 1 下穿 数据 2

计算收盘价与肯特纳通道上轨的交叉信号。CrossOver() 类第一个参数传入收盘价 context.data.close,第二个参数传入肯特纳通道的上轨 upper_line

如下图,为收盘价向上突破肯特纳通道上轨的情况。 👇

!
导入失败


下图为计算的是收盘价与肯特纳通道下轨的交叉信号。CrossOver() 类第一个参数传入收盘价 context.data.close,第二个参数传入肯特纳下通道 lower_line

!
导入失败


最后计算的是收盘价与肯特纳通道中轨的交叉信号。CrossOver() 类第一个参数传入收盘价 context.data.close,第二个参数传入肯特纳中轨 context.middle_line

标的模块

选择期货“螺纹钢2201(RB2201)”为交易标的,只需将标的代码 "RB2201.XSGE",以列表格式赋值给 symbol_list 即可。 👇

def choose_stock(context):
"""标的"""
context.symbol_list = ["RB2201.XSGE"]

择时模块

该模块将实现肯特纳通道策略最核心的开仓逻辑。

择时模块主要实现了 4 个功能:

!
导入失败


功能一:判断当前是否无持仓、收盘价是否向上突破肯特纳通道的上轨,且通道的中轨是否向上,都满足则发送做多信号

通过 if 条件判断语句去包含了三个判断条件:

1)当前是否无持仓:hold_size == 0

2)收盘价是否向上突破通道的上轨,即收盘价与上轨的交叉信号是否为 1.0:context.upper_signal[0] == 1.0

3)通道的中轨是否向上,即当日的中轨值是否大于昨日:context.middle_line[0] > context.middle_line[-1]

只有三个条件同时满足的行情,才会执行买入代码,调用context.buy(),发送做多信号。

!
导入失败


若上述语句无法被全部被满足,代码将执行下一个条件判断语句,即择时模块的功能二。

功能二:判断当前是否无持仓、收盘价是否向下突破肯特纳通道的下轨,且通道的中轨是否向下,都满足则发送做空信号

elif 条件判断语句同样包含了三个判断条件:

1)当前是否无持仓:hold_size == 0

2)收盘价是否向下突破通道的下轨,即收盘价与下轨的交叉信号是否为 -1.0:context.lower_signal[0] == -1.0

3)通道的中轨是否向下,即当日的中轨值是否小于昨日的中轨值:context.middle_line[0] < context.middle_line[-1]

如果上述条件都满足,则调用 卖出代码, context.sell(),发送做空信号。

!
导入失败


若上述两条判断语句都未满足,代码将继续往下执行另一条 elif 语句。

功能三:判断当前是否持多仓,且收盘价是否向下突破肯特纳通道的中轨,都满足则发送平多信号

第二个 elif 条件判断语句,包含两个判断条件:

1)当前是否持多仓hold_size > 0

2)收盘价是否向下突破通道的中轨,即收盘价与中轨的交叉信号是否为 -1.0:context.mid_signal[0] == -1.0

如果上述条件都满足,则调用 平仓代码 context.close(),发送平多信号。

!
导入失败


假设上述三个判断语句都不满足,代码将会执行最后一个判断语句。

功能四:判断当前是否持空仓,且收盘价是否向上突破肯特纳通道的中轨,都满足则发送平空信号

第三个elif 条件判断语句,包含了两个判断条件:

1)当前是否持空仓,在 ForTrader 中,持仓数为负即持有空仓:hold_size < 0

2)判断收盘价是否向上突破通道的中轨,即收盘价与中轨的交叉信号是否为 1.0:context.mid_signal[0] == 1.0

当上述条件都满足,则调用平仓代码 context.close(),发送平空信号。

!
导入失败


风控模块

本次策略没有设置额外的风控逻辑,代码写上 pass 即可。 👇

def control_risk(context):
"""风控"""
pass

执行代码

指标模块代码:

def indicators(context):
    """指标"""
    # 设置周期
    period = 5
    # 设置倍数
    k = 1.5

    # 计算肯特纳通道相关指标
    kc = KeltnerChannel(context.data, period=period, devfactor=k)
    # 获取肯特纳通道的上轨
    upper_line = kc.top
    # 获取肯特纳通道的下轨
    lower_line = kc.bot
    # 获取肯特纳通道的中轨
    context.middle_line = kc.mid

    # 计算收盘价与上轨的突破信号
    context.upper_signal = CrossOver(context.data.close, upper_line)
    # 计算收盘价与下轨的突破信号
    context.lower_signal = CrossOver(context.data.close, lower_line)
    # 计算收盘价与中轨的突破信号
    context.mid_signal = CrossOver(context.data.close, context.middle_line)

标的模块代码:

def choose_stock(context):
    """标的"""
    context.symbol_list = ["RB2201.XSGE"]

择时模块代码:

def timing(context):
    """择时"""
    # 获取当前仓位
    hold_size = context.position.size

    # 如果当前交易日无持仓,且收盘价向上突破上轨,且中轨向上,出现做多信号
    if hold_size == 0 and context.upper_signal[0] == 1.0 and context.middle_line[0] > context.middle_line[-1]:
        # 发送做多指令
        context.buy(data=context.data)

    # 如果当前交易日无持仓,且收盘价向下突破下轨,且中轨向下,出现做空信号
    elif hold_size == 0 and context.lower_signal[0] == -1.0 and context.middle_line[0] < context.middle_line[-1]:
        # 发送做空指令
        context.sell(data=context.data)

    # 如果当前交易日持多仓,且收盘价向下突破中轨,出现平多信号
    elif hold_size > 0 and context.mid_signal[0] == -1.0:
        # 发送平多指令
        context.close(data=context.data)

    # 如果当前交易日持空仓,且收盘价向上突破中轨,出现平空信号
    elif hold_size < 0 and context.mid_signal[0] == 1.0:
        # 发送平空指令
        context.close(data=context.data)

风控模块代码:

def control_risk(context):
    """风控"""
    pass

初次回测

!
导入失败


FOF参数调优

参数分析

肯特纳通道策略的关键参数有两个:周期参数倍数参数

1)周期参数:决定了肯特纳中轨 EMA 和 ATR 的计算周期

周期参数的数值越小,意味着策略受近期数据影响越大,反之策略受近期数据的影响越小。

先固定倍数参数1.5,再分别缩小和扩大周期,看看策略的效果。

a. 第二组测试数据:设置周期参数的值为 60、倍数参数的值为 1.5。

通过两个参数调整,可以得出回测对比图。

!
导入失败


通过调整结果可知,周期参数不宜过大。

这背后的原因是,参数越大,近期行情的影响会远期价格数据被平均掉,均线的滞后性变大。

2)倍数参数:决定了肯特纳通道的上、下轨与中轨的距离

倍数参数的值越大,肯特纳通道的上、下轨与中轨的距离越远,策略越难开仓,因为策略的开仓条件之一是价格上穿通道的上轨或下穿通道的下轨。

我们先固定周期参数的值为 10,再分别缩小和扩大倍数参数。

a. 第一组测试数据:设置周期参数的值为 10、倍数参数的值为 1。

b. 第二组测试数据:设置周期参数的值为 10、倍数参数的值为 3。

通过两个参数调整,可以得出回测对比图。

!
导入失败


对比这两组参数回测结果,可知:倍数参数不宜太大

倍数参数值太大,很难达到开仓条件,当出现真正符合策略的行情,因为入场晚点,导致损失了一部分的收益。

通过上面 4 组参数的测试,可以总结出以下两点:

1)周期参数不宜太大。周期参数太大,会造成肯特纳通道过于平滑(降噪过度),无法及时反应价格趋势性的变动,错失进场时机,损失利润;周期参数太小,会受到短期偶然性行情的影响。

2)倍数参数不宜太大。倍数参数太大,会造成开仓信号过少甚至无法触发。

较优的参数组合

我为你提供了一组参数组合。

收益率相对较高的一个组合是:5、0.5

!
导入失败


5、0.5 这组参数值表示:肯特纳指标计算不需要太长的历史周期,肯特纳的通道倍数也可以适当减小,以增加交易机会

思维导图

!
导入失败


提示:

本公司发布内容均为市场公开信息,不构成投资建议,投资者据此操作,风险自担。市场有风险,投资需谨慎!

文本 
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【策略岛】(第14期)——经典交易策略解析:布林强盗交易系统
量化投资策略系列——肯纳特交易策略,凭什么在市场上持续赚钱?
肯特纳通道副图指标源码:发现期货价格逆转信号的秘密武器
期货交易对海龟法则的嵌入
【中长期策略】金肯特纳系统
十行代码带你量化交易入门
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服