8.1 大小盘轮动 · 新手上路 — 二八ETF择时轮动策略2.0

  1. start = '2013-05-01' # 回测起始时间
  2. end = '2015-09-01' # 回测结束时间
  3. benchmark = 'HS300' # 策略参考标准
  4. universe = ['510300.XSHG','510500.XSHG'] # 证券池,支持股票和基金
  5. HS300,SZ500=universe
  6. capital_base = 100000 # 起始资金
  7. freq = 'd' # 策略类型,'d'表示日间策略使用日线回测
  8. refresh_rate =1 # 调仓频率,表示执行handle_data的时间间隔,由于freq = 'd',时间间隔的单位为交易日
  9. max_retracement = 0.01 # 最大回撤比例
  10. def initialize(account): # 初始化虚拟账户状态
  11. pass
  12. def handle_data(account): # 每个交易日的买入卖出指令
  13. # 周末进行交换
  14. if account.current_date.weekday() != 4 :
  15. return
  16. # 有停牌的话,今天就跳过。
  17. if len(account.universe) < 2: return
  18. hist = account.get_attribute_history('closePrice', 19)
  19. if len(hist) < 2:
  20. return
  21. # 如果HS300四周内涨幅大于SZ500
  22. if hist[HS300][-1]/hist[HS300][0] > hist[SZ500][-1]/hist[ SZ500][0]:
  23. # 且为正收益
  24. if hist[HS300][-1]/hist[HS300][0] > 1:
  25. if account.avail_secpos.has_key(SZ500):
  26. order_pct_to(SZ500, 0)
  27. order_pct_to(HS300, 0.99)
  28. elif hist[HS300][-1]/hist[HS300][0] < 1- max_retracement:
  29. # 负收益,清盘
  30. if account.avail_secpos.has_key(SZ500):
  31. order_pct_to(SZ500, 0)
  32. if account.avail_secpos.has_key(HS300):
  33. order_pct_to(HS300, 0)
  34. # 如果HS300四周内涨幅小于SZ500
  35. elif hist[HS300][-1]/hist[HS300][0] < hist[SZ500][-1]/hist[ SZ500][0]:
  36. # 且为正收益
  37. if hist[SZ500][-1]/hist[SZ500][0] > 1:
  38. if account.avail_secpos.has_key(HS300):
  39. order_pct_to(HS300, 0)
  40. order_pct_to(SZ500, 0.99)
  41. elif hist[SZ500][-1]/hist[SZ500][0] < 1- max_retracement:
  42. # 负收益,清盘
  43. if account.avail_secpos.has_key(SZ500):
  44. order_pct_to(SZ500, 0)
  45. if account.avail_secpos.has_key(HS300):
  46. order_pct_to(HS300, 0)

8.1 大小盘轮动 · 新手上路 — 二八ETF择时轮动策略2.0 - 图1