多股票RSI算法示例

以下是一个我们使用TALib编写的多股票RSI算法示例,使用了TALib的RSI方法:

  1. import talib
  2.  
  3.  
  4. # 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
  5. def init(context):
  6.  
  7. # 选择我们感兴趣的股票
  8. context.s1 = "000001.XSHE"
  9. context.s2 = "601988.XSHG"
  10. context.s3 = "000068.XSHE"
  11. context.stocks = [context.s1, context.s2, context.s3]
  12.  
  13. context.TIME_PERIOD = 14
  14. context.HIGH_RSI = 85
  15. context.LOW_RSI = 30
  16. context.ORDER_PERCENT = 0.3
  17.  
  18.  
  19. # 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
  20. def handle_bar(context, bar_dict):
  21. # 开始编写你的主要的算法逻辑
  22.  
  23. # bar_dict[order_book_id] 可以拿到某个证券的bar信息
  24. # context.portfolio 可以拿到现在的投资组合状态信息
  25.  
  26. # 使用order_shares(id_or_ins, amount)方法进行落单
  27.  
  28. # TODO: 开始编写你的算法吧!
  29.  
  30. # 对我们选中的股票集合进行loop,运算每一只股票的RSI数值
  31. for stock in context.stocks:
  32. # 读取历史数据
  33. prices = history_bars(stock, context.TIME_PERIOD+1, '1d', 'close')
  34.  
  35. # 用Talib计算RSI值
  36. rsi_data = talib.RSI(prices, timeperiod=context.TIME_PERIOD)[-1]
  37.  
  38. cur_position = context.portfolio.positions[stock].quantity
  39. # 用剩余现金的30%来购买新的股票
  40. target_available_cash = context.portfolio.cash * context.ORDER_PERCENT
  41.  
  42. # 当RSI大于设置的上限阀值,清仓该股票
  43. if rsi_data > context.HIGH_RSI and cur_position > 0:
  44. order_target_value(stock, 0)
  45.  
  46. # 当RSI小于设置的下限阀值,用剩余cash的一定比例补仓该股
  47. if rsi_data < context.LOW_RSI:
  48. logger.info("target available cash caled: " + str(target_available_cash))
  49. # 如果剩余的现金不够一手 - 100shares,那么会被ricequant 的order management system reject掉
  50. order_value(stock, target_available_cash)