单股票 MACD 算法示例

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

  1. import talib
  2.  
  3.  
  4. # 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。
  5. def init(context):
  6. context.s1 = "000001.XSHE"
  7.  
  8. # 使用MACD需要设置长短均线和macd平均线的参数
  9. context.SHORTPERIOD = 12
  10. context.LONGPERIOD = 26
  11. context.SMOOTHPERIOD = 9
  12. context.OBSERVATION = 100
  13.  
  14.  
  15. # 你选择的证券的数据更新将会触发此段逻辑,例如日或分钟历史数据切片或者是实时数据切片更新
  16. def handle_bar(context, bar_dict):
  17. # 开始编写你的主要的算法逻辑
  18.  
  19. # bar_dict[order_book_id] 可以拿到某个证券的bar信息
  20. # context.portfolio 可以拿到现在的投资组合状态信息
  21.  
  22. # 使用order_shares(id_or_ins, amount)方法进行落单
  23.  
  24. # TODO: 开始编写你的算法吧!
  25.  
  26. # 读取历史数据,使用sma方式计算均线准确度和数据长度无关,但是在使用ema方式计算均线时建议将历史数据窗口适当放大,结果会更加准确
  27. prices = history_bars(context.s1, context.OBSERVATION,'1d','close')
  28.  
  29. # 用Talib计算MACD取值,得到三个时间序列数组,分别为macd, signal 和 hist
  30. macd, signal, hist = talib.MACD(prices, context.SHORTPERIOD,
  31. context.LONGPERIOD, context.SMOOTHPERIOD)
  32.  
  33. plot("macd", macd[-1])
  34. plot("macd signal", signal[-1])
  35.  
  36. # macd 是长短均线的差值,signal是macd的均线,使用macd策略有几种不同的方法,我们这里采用macd线突破signal线的判断方法
  37.  
  38. # 如果macd从上往下跌破macd_signal
  39.  
  40. if macd[-1] - signal[-1] < 0 and macd[-2] - signal[-2] > 0:
  41. # 计算现在portfolio中股票的仓位
  42. curPosition = context.portfolio.positions[context.s1].quantity
  43. #进行清仓
  44. if curPosition > 0:
  45. order_target_value(context.s1, 0)
  46.  
  47. # 如果短均线从下往上突破长均线,为入场信号
  48. if macd[-1] - signal[-1] > 0 and macd[-2] - signal[-2] < 0:
  49. # 满仓入股
  50. order_target_percent(context.s1, 1)