141-基于移仓换月实盘情形下的布林带期货通道突破策略
由qxiao创建,最终由qxiao 被浏览 90 用户
回测绩效
\
策略简介
我们在《127-期货布林带通道突破策略-日频》介绍了一种常见的期货CTA策略,该策略是非常经典的一个策略,常年在实盘策略排前。那篇文章里,我们交易的是某个期货品种的主力合约(8888)合约,但做个实盘的人知道,8888主力是没法交易的,我们真正实盘的时候交易的是具体的有明确交个日期的合约。
因此本策略是通过主力合约出信号,然后在具体合约上交易买卖,这和真实交易情形就是一致的了。
那么新的问题来了,持有某一个具体的合约不能一直持有,因为随时交割日临近,我们需要不断切换到下一个主力合约上,这个操作实盘叫:移仓换月。
\
策略说明
数据抽取
因为我们需要两个数据,一个是行情数据来计算指标,一个是主力合约映射关系表。所以,我们有两个数据抽取,第一个数据抽取模块(m4)是行情数据,第二个数据抽取(m5)是主力合约映射关系表。
在m2模块里,我们需要计算布林带相关指标,上轨下轨等,如下:
选择品种
这里我们选择焦煤这个品种,jm开头的合约数据都需要。如果我们想换成螺纹钢,我们换成 instrument like “RB%“
移仓换月
如果当前持仓和主力合约不是同一个标的,那我们需要进行移仓换月。如果是多头仓位,那我们先卖平旧的合约,再买开新的主力合约。
反之同理,如果是空头仓位,那我们先买平旧的合约,再卖开新的主力合约。
交易逻辑
代码见下:
buy_close、buy_open可以按照字面含义理解,买平和买开
if short_position > 0:
if price > high_line:
# 空头情况下,价格突破上轨
context.buy_close(dominant_contract, short_position, price, order_type=OrderType.MARKET)
context.buy_open(dominant_contract, context.lots, price, order_type=OrderType.MARKET)
print(today,'先平空再开多', dominant_contract)
elif long_position > 0:
if price < low_line:
# 多仓情况下,价格突破下轨
context.sell_close(dominant_contract, long_position, price, order_type=OrderType.MARKET)
context.sell_open(dominant_contract, context.lots, price, order_type=OrderType.MARKET)
print(today,'先平多再开空', dominant_contract)
elif curr_position == 0:
if price > high_line:
# 无仓位情形下,价格突破上轨
context.buy_open(dominant_contract, context.lots, price, order_type=OrderType.MARKET)
print(today, '空仓开多', dominant_contract)
elif price < low_line:
# 无仓位情形下,价格突破下轨
context.sell_open(dominant_contract, context.lots, price, order_type=OrderType.MARKET)
print(today, '空仓开空', dominant_contract)
\n
克隆链接
https://bigquant.com/codesharev3/9528d380-7b29-4bcd-b732-5a2423cbf98f
\