• QQ空间
  • 回复
  • 收藏

【宽客策略源码】指数增强(股票)

geek168 数据策略 2019-8-11 15:53 73323人围观


本策略以0.8为初始权重跟踪指数标的沪深300中权重大于0.35%的成份股.个股所占的百分比为(0.8*成份股权重)*100%.然后根据个股是否:
1.连续上涨5天 2.连续下跌5天,来判定个股是否为强势股/弱势股,并对其把权重由0.8调至1.0或0.6

回测时间为:2017-07-01 08:50:00到2017-10-01 17:00:00


  1. # coding=utf-8
  2. from __future__ import print_function, absolute_import, unicode_literals
  3. import numpy as np
  4. from gm.api import *
  5. from pandas import DataFrame

  6. def init(context):
  7.     # 资产配置的初始权重,配比为0.6-0.8-1.0
  8.     context.ratio = 0.8
  9.     # 获取沪深300当时的成份股和相关数据
  10.     stock300 = get_history_constituents(index='SHSE.000300', start_date='2017-06-30', end_date='2017-06-30')[0][
  11.         'constituents']
  12.     stock300_symbol = []
  13.     stock300_weight = []
  14.     for key in stock300:
  15.         # 保留权重大于0.35%的成份股
  16.         if (stock300[key] / 100) > 0.0035:
  17.             stock300_symbol.append(key)
  18.             stock300_weight.append(stock300[key] / 100)
  19.     context.stock300 = DataFrame([stock300_weight], columns=stock300_symbol, index=['weight']).T
  20.     print('选择的成分股权重总和为: ', np.sum(stock300_weight))
  21.     subscribe(symbols=stock300_symbol, frequency='1d', count=5, wait_group=True)
  22. def on_bar(context, bars):
  23.     # 若没有仓位则按照初始权重开仓
  24.     for bar in bars:
  25.         symbol = bar['symbol']
  26.         position = context.account().position(symbol=symbol, side=PositionSide_Long)
  27.         if not position:
  28.             buy_percent = context.stock300['weight'][symbol] * context.ratio
  29.             order_target_percent(symbol=symbol, percent=buy_percent, order_type=OrderType_Market,
  30.                                  position_side=PositionSide_Long)
  31.             print(symbol, '以市价单开多仓至仓位:', buy_percent)
  32.         else:
  33.             # 获取过去5天的价格数据,若连续上涨则为强势股,权重+0.2;若连续下跌则为弱势股,权重-0.2
  34.             recent_data = context.data(symbol=symbol, frequency='1d', count=5, fields='close')['close'].tolist()
  35.             if all(np.diff(recent_data) > 0):
  36.                 buy_percent = context.stock300['weight'][symbol] * (context.ratio + 0.2)
  37.                 order_target_percent(symbol=symbol, percent=buy_percent, order_type=OrderType_Market,
  38.                                      position_side=PositionSide_Long)
  39.                 print('强势股', symbol, '以市价单调多仓至仓位:', buy_percent)
  40.             elif all(np.diff(recent_data) < 0):
  41.                 buy_percent = context.stock300['weight'][symbol] * (context.ratio - 0.2)
  42.                 order_target_percent(symbol=symbol, percent=buy_percent, order_type=OrderType_Market,
  43.                                      position_side=PositionSide_Long)
  44.                 print('弱势股', symbol, '以市价单调多仓至仓位:', buy_percent)
  45. if __name__ == '__main__':
  46.     '''
  47.     strategy_id策略ID,由系统生成
  48.     filename文件名,请与本文件名保持一致
  49.     mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST
  50.     token绑定计算机的ID,可在系统设置-密钥管理中生成
  51.     backtest_start_time回测开始时间
  52.     backtest_end_time回测结束时间
  53.     backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST
  54.     backtest_initial_cash回测初始资金
  55.     backtest_commission_ratio回测佣金比例
  56.     backtest_slippage_ratio回测滑点比例
  57.     '''
  58.     run(strategy_id='strategy_id',
  59.         filename='main.py',
  60.         mode=MODE_BACKTEST,
  61.         token='token_id',
  62.         backtest_start_time='2017-07-01 08:50:00',
  63.         backtest_end_time='2017-10-01 17:00:00',
  64.         backtest_adjust=ADJUST_PREV,
  65.         backtest_initial_cash=10000000,
  66.         backtest_commission_ratio=0.0001,
  67.         backtest_slippage_ratio=0.0001)
复制代码

指数增强.png


路过

雷人

握手

鲜花

鸡蛋
原作者: abctrader
关注微信