轻松跑赢大盘 - 主题Momentum策略

来源:https://uqer.io/community/share/551d02c2f9f06c8f33904502

策略原理

在我们的观点中,Momentum这样的思路在主题中也有体现, 业绩好的主题会继续保持其上涨的势头, 本策略测试了这个思路, 具体实现方式为: 按20个交易日为一个调仓周期, 在调仓日卖出以前所有持仓, 买入选出的最好的20个主题中最好的5只股票总共100只股票本策略的回测参数如下:

  • 起始日期: 2014年12月24日

  • 结束日期: 2015年4月24日

  • 股票池: 3月25日所有活跃主题关联的所有股票

  • 业绩基准: 沪深300

  • 起始资金: 1000万元

  • 调仓周期: 20个交易日

本策略使用的主要数据API有:

  • DataAPI.ActiveThemesGet 获取某天活跃的主题数据,输入一个日期,获取在该日期活跃的主题。

  • DataAPI.TickersByThemesGet 获取主题关联的证券

还有很多可以根据基本面调优的办法, 读者可以自己尝试

  1. from datetime import datetime,timedelta
  2. from heapq import nlargest
  3. #ticker转换为id
  4. tk2id=lambda x: x+'.XSHG' if x[0]=='6'else x+'.XSHE'
  5. #获取3月25日活跃主题对应的所有股票
  6. themeList = DataAPI.ActiveThemesGet('20150325').themeID.tolist()
  7. sa = []
  8. for t in themeList:
  9. sa += DataAPI.TickersByThemesGet(themeID=str(t)).ticker.tolist()
  10. sa = list(set(sa))
  11. #以下为回测参数
  12. start = '2014-12-24'
  13. end = '2015-04-24'
  14. benchmark = 'HS300'
  15. universe = map(tk2id, sa)
  16. capital_base = 10000000
  17. refresh_rate = 20
  18. longest_history = 20
  19. def initialize(account):
  20. pass
  21. def handle_data(account):
  22. # 获取调仓日活跃主题相关股票tickers
  23. themeList = DataAPI.ActiveThemesGet(account.current_date.strftime('%Y%m%d')).themeID.tolist()
  24. ta = {}
  25. for t in themeList:
  26. ta[t] = DataAPI.TickersByThemesGet(themeID=str(t)).ticker.tolist()
  27. # 获取过去20个交易日的收盘价
  28. p = account.get_attribute_history('closePrice', 20)
  29. #找调仓日内按照等权return加和最大的20个主题
  30. sa = {}
  31. for stock in account.universe:
  32. sa[stock] = p[stock][-1] / p[stock][0] -1 #从调仓日之前20天的return
  33. tb = {}
  34. for t in ta:
  35. tb[t] = sum(sa.get(s,0) for s in ta[t])
  36. tb = nlargest(20,tb,tb.get)
  37. # 找这最好的20个主题中最好的5只股票
  38. sc = []
  39. for t in tb:
  40. sc += nlargest(5,[s for s in map(tk2id,ta[t]) if s in sa],sa.get)
  41. sc = list(set(sc))
  42. for stock in account.valid_secpos: # 卖出目前所有持有的股票
  43. order_to(stock, 0)
  44. for stock in sc: # 买进新选出的100只股票
  45. order(stock, account.referencePortfolioValue / len(sc) / p[stock][-1])

轻松跑赢大盘 - 主题Momentum策略 - 图1