您当前所在位置: 主页 > 量化交易 > 投资策略解密 >

>量化交易

DE CHUAN FUND

投资策略解密

量化交易策略——多股票KD指标

发布日期:2016年10月15

  策略思路:

  1.定义初始化 initialize(context),用于初始一些全局变量,在整个回测、模拟实盘中最开始执行一次。

  2.定义before_trading_start(context),在每天交易开始前,该函数会被调用一次,一些每天都要初始化的东西可以添加到这里。这里每天返回符合买入条件的股票(最多十只),在handle_data里进行调用。

  3.定义买入条件函数buy_condition(stock, count),返回true进行买入,False则卖出。

  4.handle_data(context, data):

  (1)循环before_trading_start(context)中每日返回的符合买入条件的股票:

  (2)把初始资金分成十份,现金如少于初始资金的1/10不买入,否则,可买入的该股数量按初始资金的1/10计算。

  (3)买入条件:当前该股数量为0时并且可购买数量大于零时。如符合条件买入该股

  (4)卖出条件:当前价格小于0.8*3日内最高价,或总价值增长30%或or价值跌10%,并且已经买入该股,如果符合卖出条件则卖出该股。

  收益风险:

  策略累计收益101.87,沪深300收益:43.65%

  源码:

  import talib

  import math

  #初始化方法,在整个回测、模拟实盘中最开始执行一次,用于初始一些全局变量

  def initialize(context):

  #g为全局变量

  g.buystocks = []

  context.stocks = get_index_stocks('000300.XSHG')

  # context.stocks = ['000562.XSHE']

  context.pct_per_stock = 1.0 / 10

  g.count = 20

  #定义股票池

  set_universe(context.stocks)

  #该函数会在每天开始交易前被调用一次, 可以在这里添加一些每天都要初始化的东西.

  #这里每天返回符合买入条件的股票,在handle_data里进行调用

  def before_trading_start(context):

  g.buystocks = []

  for stock in context.stocks:

  if buy_condition(stock, g.count):

  g.buystocks.append(stock)

  if len(g.buystocks)>10:

  g.buystocks = g.buystocks[:10]

  #该函数会在每天结束交易后被调用一次, 可以在这里添加一些每天收盘后要执行的内容.

  #这个时候所有未完成的订单已经取消.

  def after_trading_end(context):

  pass

  #定义买入条件函数,返回true进行买入,False则卖出

  def buy_condition(stock, count):

  h = attribute_history(stock, count, '1d', ('high','low','close'))

  h = h.dropna()

  if h.empty:

  return False

  # 创建STOCH买卖信号,包括最高价,最低价,收盘价和快速线(一般取为9),慢速线

  # 注意:STOCH函数使用的price必须是narray

  slowk, slowd = talib.STOCH(h['high'].values,h['low'].values,h['close'].values,

  fastk_period=9,slowk_period=3,slowk_matype=0,slowd_period=3,

  slowd_matype=0)

  # 获得最近的kd值

  slowk = slowk[-1]

  slowd = slowd[-1]

  # 当slowk > 90 or slowd > 90

  if slowk < 10 or slowd < 10:

  return True

  if slowk > 90 or slowd > 90:

  return False

  # 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次

  def handle_data(context, data):

  # 循环股票列表

  startingvalues = context.portfolio.starting_cash

  for stock in g.buystocks:

  # 取得当前的现金

  cash = context.portfolio.cash

  values = context.portfolio.portfolio_value

  # 将初始资金分成10份,如果现金少于初始资金的1/10不买入

  if cash < startingvalues*context.pct_per_stock:

  money = 0

  else:

  money = startingvalues*context.pct_per_stock

  Istrading=not data[stock].paused

  #当前成交才涉及到这个问题

  if Istrading==True:

  # 获取当前股票的数据

  current_position = context.portfolio.positions[stock].amount

  # 获取当前股票价格

  current_price = data[stock].price

  #判断是否停盘

  if not math.isnan(current_price):

  #将资金分为10份,计算每只股票购买量

  number_of_shares = int(money/current_price)

  h = attribute_history(stock, 3, '1d', ('high'))

  maxvalue = max(h['high'])

  # 当符合指标的卖出条件或当前价格小于0.8*3日内最高价或总价值增长30%,

  # 或总价值跌10%时,并且已经买入了该股票则卖出

  if (not buy_condition(stock, g.count) or current_price < 0.8*maxvalue or values > 1.3*startingvalues or values < 0.9*startingvalues )and current_position > 0:

  order_target(stock, 0)

  # 购买量大于0时,下单

  elif number_of_shares>0 and current_position == 0:

  # 买入股票

  order(stock, +number_of_shares)

  # 记录这次买入

  log.info("Buying %s" % (stock))