• QQ空间
  • 回复
  • 收藏

【宽客策略源码】海龟交易策略源码分享

geek168 数据策略 2019-8-11 16:05 80430人围观


本策略通过计算CZCE.FG801和SHFE.rb1801的ATR.唐奇安通道和MA线,并:上穿唐奇安通道且短MA在长MA上方则开多仓,下穿唐奇安通道且短MA在长MA下方则开空仓


若有 多/空 仓位则分别:
价格 跌/涨 破唐奇安平仓通道 上/下 轨则全平仓位,否则
根据 跌/涨 破持仓均价 -/+ x(x=0.5,1,1.5,2)倍ATR把仓位





回测数据为:CZCE.FG801和SHFE.rb1801的1min数据
回测时间为:2017-09-15 09:15:00到2017-10-01 15:00:00



  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. import numpy as np
  4. import pandas as pd
  5. try:
  6.     import talib
  7. except:
  8.     print('请安装TA-Lib库')
  9. from gm.api import *

  10. def init(context):
  11.     # context.parameter分别为唐奇安开仓通道.唐奇安平仓通道.短ma.长ma.ATR的参数
  12.     context.parameter = [55, 20, 10, 60, 20]
  13.     context.tar = context.parameter[4]
  14.     # context.goods交易的品种
  15.     context.goods = ['CZCE.FG801', 'SHFE.rb1801']
  16.     # context.ratio交易最大资金比率
  17.     context.ratio = 0.8
  18.     # 订阅context.goods里面的品种, bar频率为1min
  19.     subscribe(symbols=context.goods, frequency='60s', count=101)
  20.     # 止损的比例区间
  21. def on_bar(context, bars):
  22.     bar = bars[0]
  23.     symbol = bar['symbol']
  24.     recent_data = context.data(symbol=symbol, frequency='60s', count=101, fields='close,high,low')
  25.     close = recent_data['close'].values[-1]
  26.     # 计算ATR
  27.     atr = talib.ATR(recent_data['high'].values, recent_data['low'].values, recent_data['close'].values,
  28.                     timeperiod=context.tar)[-1]
  29.     # 计算唐奇安开仓和平仓通道
  30.     context.don_open = context.parameter[0] + 1
  31.     upper_band = talib.MAX(recent_data['close'].values[:-1], timeperiod=context.don_open)[-1]
  32.     context.don_close = context.parameter[1] + 1
  33.     lower_band = talib.MIN(recent_data['close'].values[:-1], timeperiod=context.don_close)[-1]
  34.     # 计算开仓的资金比例
  35.     percent = context.ratio / float(len(context.goods))
  36.     # 若没有仓位则开仓
  37.     position_long = context.account().position(symbol=symbol, side=PositionSide_Long)
  38.     position_short = context.account().position(symbol=symbol, side=PositionSide_Short)
  39.     if not position_long and not position_short:
  40.         # 计算长短ma线.DIF
  41.         ma_short = talib.MA(recent_data['close'].values, timeperiod=(context.parameter[2] + 1))[-1]
  42.         ma_long = talib.MA(recent_data['close'].values, timeperiod=(context.parameter[3] + 1))[-1]
  43.         dif = ma_short - ma_long
  44.         # 获取当前价格
  45.         # 上穿唐奇安通道且短ma在长ma上方则开多仓
  46.         if close > upper_band and (dif > 0):
  47.             order_target_percent(symbol=symbol, percent=percent, order_type=OrderType_Market,
  48.                                  position_side=PositionSide_Long)
  49.             print(symbol, '市价单开多仓到比例: ', percent)
  50.         # 下穿唐奇安通道且短ma在长ma下方则开空仓
  51.         if close < lower_band and (dif < 0):
  52.             order_target_percent(symbol=symbol, percent=percent, order_type=OrderType_Market,
  53.                                  position_side=PositionSide_Short)
  54.             print(symbol, '市价单开空仓到比例: ', percent)
  55.     elif position_long:
  56.         # 价格跌破唐奇安平仓通道全平仓位止损
  57.         if close < lower_band:
  58.             order_close_all()
  59.             print(symbol, '市价单全平仓位')
  60.         else:
  61.             # 获取持仓均价
  62.             vwap = position_long['vwap']
  63.             # 获取持仓的资金
  64.             money = position_long['cost']
  65.             # 获取平仓的区间
  66.             band = vwap - np.array([200, 2, 1.5, 1, 0.5, -100]) * atr
  67.             grid_percent = float(pd.cut([close], band, labels=[0, 0.25, 0.5, 0.75, 1])[0]) * percent
  68.             # 选择现有百分比和区间百分比中较小的值(避免开仓)
  69.             target_percent = np.minimum(money / context.account().cash['nav'], grid_percent)
  70.             if target_percent != 1.0:
  71.                 print(symbol, '市价单平多仓到比例: ', target_percent)
  72.                 order_target_percent(symbol=symbol, percent=target_percent, order_type=OrderType_Market,
  73.                                      position_side=PositionSide_Long)
  74.     elif position_short:
  75.         # 价格涨破唐奇安平仓通道或价格涨破持仓均价加两倍ATR平空仓
  76.         if close > upper_band:
  77.             order_close_all()
  78.             print(symbol, '市价单全平仓位')
  79.         else:
  80.             # 获取持仓均价
  81.             vwap = position_short['vwap']
  82.             # 获取持仓的资金
  83.             money = position_short['cost']
  84.             # 获取平仓的区间
  85.             band = vwap + np.array([-100, 0.5, 1, 1.5, 2, 200]) * atr
  86.             grid_percent = float(pd.cut([close], band, labels=[1, 0.75, 0.5, 0.25, 0])[0]) * percent
  87.             # 选择现有百分比和区间百分比中较小的值(避免开仓)
  88.             target_percent = np.minimum(money / context.account().cash['nav'], grid_percent)
  89.             if target_percent != 1.0:
  90.                 order_target_percent(symbol=symbol, percent=target_percent, order_type=OrderType_Market,
  91.                                      position_side=PositionSide_Short)
  92.                 print(symbol, '市价单平空仓到比例: ', target_percent)
  93. if __name__ == '__main__':
  94.     '''
  95.     strategy_id策略ID,由系统生成
  96.     filename文件名,请与本文件名保持一致
  97.     mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  98.     token绑定计算机的ID,可在系统设置-密钥管理中生成
  99.     backtest_start_time回测开始时间
  100.     backtest_end_time回测结束时间
  101.     backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  102.     backtest_initial_cash回测初始资金
  103.     backtest_commission_ratio回测佣金比例
  104.     backtest_slippage_ratio回测滑点比例
  105.     '''
  106.     run(strategy_id='strategy_id',
  107.         filename='main.py',
  108.         mode=MODE_BACKTEST,
  109.         token='token_id',
  110.         backtest_start_time='2017-09-15 09:15:00',
  111.         backtest_end_time='2017-10-01 15:00:00',
  112.         backtest_adjust=ADJUST_PREV,
  113.         backtest_initial_cash=10000000,
  114.         backtest_commission_ratio=0.0001,
  115.         backtest_slippage_ratio=0.0001)
复制代码

海龟.png


路过

雷人

握手

鲜花

鸡蛋
原作者: abctrader
关注微信