『期货策略』利用AR(人气指标)伺机而动

策略分享
标签: #<Tag:0x00007fcf5ed64f90>

(caoxiyang) #1

期货AR(人气指标)策略

AR(人气指标)简介

人气指标通过一定时期内开盘价、最高价、以及最低价之间的关系,来分析多空力量的对比,反映市场买卖人气,分析价格波动,达到追踪价格未来动向的目的。

计算公式(以日为单位举例):

AR = [N天所有(High-Open)的和/ N天所有(Open—Low)的和] * 100

其中:High=当日最高价;Low=当日最低价;Open=当日开市价
N为公式中的设定参数,一般设定为26日。

人气指标的基本应用法则:

(1)AR值以100为中心地带,其±20之间,即AR值在80-120之间波动时,属盘整行情,市价走势比较平稳,不会出现剧烈波动。

(2)AR值走高时表示行情活跃,人气旺盛,过高则表示市价进入高价,应选择时机退出,AR值的高度没有具体标准,一般情况下,AR值上升至150以上时,市价随时可能回档下跌。

(3)AR值走低时表示人气衰退,需要充实,过低则暗示市价可能跌入低谷,可考虑伺机介入,一般AR值跌至70以下时,市价有可能随时反弹上升。

(4)从AR曲线可以看出一段时期的买卖气势,并具有先于市价到达峰或跌入谷底的功能,此策略配合MA一同使用。

MA指标简介

MA:在上升行情进入稳定期,短周期、中周期、长周期移动平均线从上而下依次顺序排列,向右上方移动。

在下跌行情中,短周期、中周期、长周期移动平均线自下而上依次顺序排列,向右下方移动,称为空头 排列,预示市价将大幅下跌。

策略逻辑

根据市价慢涨快跌的特点,我们在经典的AR-MA上作一些调整:

  • 如果AR值 > 120,当MA(5)>MA(10)>MA(30),做多 。

  • 当MA(5)<MA(10)<MA(30),做空 ,并且此条件下,如果AR值 < 75,代表这波下跌动能趋于耗尽,这时候平掉空头。

  • 如果110 >= AR值 >= 90 ,代表市价走势比较平稳,不会出现剧烈波动,这时候保持空仓。

策略代码部分

  • 首先,我们选择要交易的标的,这里选择的是’RU1809.SHF’,把标的本身的市场情况作为参考标准。
  • 然后,编写策略初始化部分,initialize函数只会运行一次,在第一个日期运行,因此可以把策略一些参数放在该函数定义。 在这里我们设置AR的上下阈值,以及短、中、长均线的窗口,分别为5、10、30天。
  • handle_data函数会每个周期(日/分)运行一次,可以把行情数据理解成K线,然后handle_data函数会在每个K线上依次运行,每天都进行均线值和AR值的计算。
  • 最后启动回测,编写策略回测接口。

具体代码如下:

克隆策略
In [33]:
# 1. 策略基本参数
def prepare(context):
    # 策略比较参考标准
    benchmark = 'RU1809.SHF'
In [34]:
def initialize(context):
   # 设置是否是结算模式
    context.set_need_settle(False)
    # 设置最大杠杆
    context.set_max_leverage(1, 'fill_amap')
    #设置参数
    context.ar_period=26 
    #设置AR阈值、MA窗口
    context.ar_upr=140
    context.ar_dwn=75
    context.short_period=5
    context.mid_period=10
    context.long_period=30
    
def handle_data(context, data):
    
    if context.trading_day_index  < context.long_period: # 在生成长期均线以后才开始真正运行
        return
   
    today = data.current_dt.strftime('%Y-%m-%d') # 当前交易日期
    instrument = context.future_symbol(context.instruments[0]) # 交易标的
    curr_po=context.portfolio.positions[instrument] # 组合持仓
    curr_position = curr_po.amount  # 持仓数量
         
    #均线计算
    ma_short = data.history(instrument, 'close', context.short_period, '1d').mean()
    ma_medium = data.history(instrument, 'close', context.mid_period, '1d').mean()
    ma_long = data.history(instrument, 'close', context.long_period, '1d').mean()
    
    #计算AR值
    open_prices = data.history(instrument, 'open', context.ar_period, '1d')
    high_prices = data.history(instrument, 'high', context.ar_period, '1d')
    low_prices = data.history(instrument, 'low', context.ar_period, '1d')
    ar_value = sum(high_prices - open_prices) / sum(open_prices - low_prices) * 100

    # 交易逻辑
    if ar_value > context.ar_upr and ma_short > ma_medium > ma_long and data.can_trade(instrument): # 开多
        order(instrument,  40)
        print(today,'long')
            
    elif  ma_short < ma_medium < ma_long and data.can_trade(instrument):# 开空
        if ar_value < context.ar_dwn and curr_position<0 and data.can_trade:
            order_target(instrument, 0)
            print(today,'close_sp')
        else:
            order(instrument,  -40)
            print(today,'short')

    elif 110 >= ar_value >= 90 and curr_position!=0 and data.can_trade(instrument):
        order_target(instrument, 0)
        print(today,'close_out')
In [35]:
# 3. 启动回测
# 策略回测接口: https://bigquant.com/docs/module_trade.html
m = M.trade.v3(
    instruments= ['RU1809.SHF'],
    start_date='2017-11-01',
    end_date='2018-05-01',
    prepare=prepare,
    initialize=initialize,
    handle_data=handle_data,
    # 买入订单以开盘价成交
    order_price_field_buy='open',
    # 卖出订单以开盘价成交
    order_price_field_sell='open',
    capital_base=1000000,
    benchmark='RU1809.SHF',
    m_deps=np.random.rand()
)
[2018-07-18 15:53:17.232866] INFO: bigquant: backtest.v7 开始运行..
[2018-07-18 15:53:17.235628] INFO: bigquant: biglearning backtest:V7.1.2
[2018-07-18 15:53:17.318933] INFO: algo: TradingAlgorithm V1.2.1
Future(RU1809.SHF) update expiration date: 2018-09-15 00:00:00+00:00 -->> 2018-05-07 00:00:00+00:00
2018-01-03 short
2018-01-04 close_out
2018-01-09 short
2018-01-10 short
2018-01-11 short
2018-01-12 short
2018-01-15 close_out
2018-01-22 short
2018-01-23 short
2018-01-24 short
2018-01-25 short
2018-01-26 short
2018-01-29 short
2018-01-30 short
2018-01-31 short
2018-02-01 close_sp
2018-02-02 short
2018-02-05 close_sp
2018-02-06 short
2018-02-07 close_sp
2018-02-08 short
2018-02-09 close_sp
2018-02-12 short
2018-02-13 close_sp
2018-02-14 short
2018-02-22 close_sp
2018-02-23 short
2018-03-08 short
2018-03-09 close_sp
2018-03-12 short
2018-03-13 close_sp
2018-03-14 short
2018-03-15 short
2018-03-16 short
2018-03-19 short
2018-03-20 close_sp
2018-03-21 short
2018-03-22 short
2018-03-23 close_sp
2018-03-26 short
2018-03-27 close_sp
2018-03-28 short
2018-03-29 close_sp
2018-03-30 short
2018-04-02 close_sp
2018-04-03 short
2018-04-04 close_sp
2018-04-09 short
2018-04-10 close_sp
2018-04-11 short
2018-04-12 close_sp
2018-04-16 short
2018-04-17 close_sp
2018-04-18 short
2018-04-19 close_sp
2018-04-20 short
[2018-07-18 15:53:18.351346] INFO: Performance: Simulated 120 trading days out of 120.
[2018-07-18 15:53:18.352537] INFO: Performance: first open: 2017-11-01 00:00:00+00:00
[2018-07-18 15:53:18.353563] INFO: Performance: last close: 2018-04-27 15:00:00+00:00
  • 收益率151.98%
  • 年化收益率596.43%
  • 基准收益率-19.76%
  • 阿尔法1.4
  • 贝塔-1.73
  • 夏普比率2.78
  • 胜率0.5
  • 盈亏比3.34
  • 收益波动率78.97%
  • 信息比率0.18
  • 最大回撤23.44%
[2018-07-18 15:53:19.035707] INFO: bigquant: backtest.v7 运行完成[1.802815s].