楼主: kakapdc
4016 5

[源码分享] 事件驱动策略(基于业绩快报) [推广有奖]

  • 0关注
  • 1粉丝

初中生

80%

还不是VIP/贵宾

-

威望
0
论坛币
56 个
通用积分
0.0001
学术水平
3 点
热心指数
8 点
信用等级
3 点
经验
485 点
帖子
11
精华
0
在线时间
6 小时
注册时间
2017-3-21
最后登录
2017-5-26

楼主
kakapdc 企业认证  发表于 2017-3-30 20:14:50 |只看作者 |坛友微信交流群|倒序 |AI写论文
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
事件驱动(Event Driven)属于量化投资之中的一个重要类别,涵盖投资机会广泛。广义上说,市场上任何发生的有可能与股票市场相关的新闻、事件、公告均有可能成为事件驱动的投资机会。 目前我国业界事件驱动策略中包括的常用重大事件有:业绩预告、业绩快报、分红送转、大股东增减持、高管增减持、定向增发、限售股解禁、股权激励、重组并购、ST摘和评级上调等,如下图所示。

1.png

可以看出,目前市场经过验证有效的事件已经不少,涵盖了影响股票价格的多个方面。事件驱动策略由于其策略逻辑的独特性,因此与其他常规股票策略相关性很低,再加上事件众多,资金容量大这一特点,使得事件驱动策略成为国外对冲基金非常大类的投资策略。

BigQuant回测引擎能够快速验证事件的有效性,从而开发事件驱动策略。为方便小伙伴顺利开发事件驱动策略,本文以业绩快报中净利润大幅增长为事件,验证该事件是否可以带来超额收益,未来我们会发布更多的基于其他事件的策略,敬请耐心等待。

在回测之前,我们先看策略的完整介绍:

  • 策略逻辑:认为业绩快报中净利润大幅增长为利好消息,会导致价格在一定期限内上涨
  • 事件定义:当业绩快报中公布净利润同比增增长超过30%
  • 股票持有不超过50只,仅当持有数量小于50只时,才买入股票
  • 持有时间:40个交易日

我们的策略流程是:每日更新数据,查看当日发布财务报表并且(归属母公司)净利润季度同比增长率超过30%的公司,如果出现这样的事件,就买入该股票。因此这里的分析和"选股系列"以及"大师系列"的策略依然相似,大家可以结合来看。

策略回测结果为:

2.png

从测试结果来看,该事件驱动策略为长期正收益系统。因为财报公布事件会有一个期限规定(年度报告是每年结束后4个月内,半年度是上半年结束后2个月内,季度报告是季度结束后1个月内),所以某些时间段不会有公司公布财务报表,当然那段时间就不会出现业绩快报净利润大幅增长的事件,因此仓位很多时候并不是100%。

备注:上市公司财报披露时间一般是财报发布日期的前一天晚上8点,因此策略回测中订单生成时间是财报公布日前一天,目的是便于回测和实盘保持一致性。


源码,原文请参考BigQuant人工智能量化投资平台的社区

  1. instruments = D.instruments()
  2. start_date = '2010-01-01'
  3. end_date = '2017-02-16'
  4. # 获取数据
  5. data = D.financial_statements(instruments, start_date, end_date,
  6.           fields=['instrument','fs_publish_date','fs_quarter_year',
  7.           'fs_quarter_index','fs_net_profit_yoy'])
  8. # 选择净利润同比增长率大于30%的股票
  9. selected = data[data['fs_net_profit_yoy'] > 30]
复制代码
  1. # 获取交易日历
  2. date = D.trading_days(start_date=start_date,end_date=end_date)
  3. date = date['date'].apply(lambda x : x.strftime('%Y-%m-%d'))
  4. # 为尽量接近实盘,事件日期应为财报公布日的前一天
  5. publish_date = date.shift(-1)
  6. shift = dict(zip(date,publish_date))
复制代码
  1. # 建立事件表
  2. event = {}
  3. for dt in date:
  4.     if type(shift[dt]) is str:
  5.         event[dt] = list(selected[selected['fs_publish_date'] == shift[dt]].sort_values(
  6.             'fs_net_profit_yoy',ascending=False ).instrument)
  7.     else:
  8.         event[dt] = []     
复制代码
  1. def initialize(context):
  2.    
  3.     context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
  4.     context.daily_buy_stock = event
  5.     context.hold_periods = 40 # 持有40天
  6.     context.stock_max_num = 50 # 最大持仓数量为50只
  7.     context.hold_days = {}
  8.      
  9. def handle_data(context,data):
  10.   
  11.     date = data.current_dt.strftime('%Y-%m-%d')
  12.    
  13.     # 目前仓位里面的股票列表
  14.     equities = {e.symbol: e for e, p in context.perf_tracker.position_tracker.positions.items()}
  15.    
  16.     for k in equities.keys():
  17.         # 如果持仓时间大于40天
  18.         if context.trading_day_index - context.hold_days[k] >= context.hold_periods
  19.                and data.can_trade(context.symbol(k)):
  20.             # 卖完
  21.             context.order_target_percent(context.symbol(k),0)
  22.    
  23.     # 还允许建仓的股票数目
  24.     stock_can_buy_num = context.stock_max_num - len(equities)
  25.     # 获取当日买入股票的代码
  26.     stock_to_buy = context.daily_buy_stock[date][:stock_can_buy_num]

  27.   
  28.     # 等权重买入
  29.     weight =  1 / context.stock_max_num
  30.    
  31.     # 买入
  32.     for  stock in stock_to_buy:
  33.         if data.can_trade(context.symbol(stock)):
  34.             context.order_target_percent(context.symbol(stock), weight)
  35.             # 记录建仓时间的日期索引
  36.             context.hold_days[stock] = context.trading_day_index  
复制代码
  1. m=M.backtest.v4(
  2.     instruments=instruments,
  3.     start_date=start_date,
  4.     end_date=end_date,
  5.     initialize=initialize,
  6.     handle_data=handle_data,
  7.     order_price_field_buy='open',
  8.     order_price_field_sell='open',
  9.     capital_base=float("1.0e7"),
  10.     benchmark='000300.INDX',
  11. )
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


已有 1 人评分经验 学术水平 热心指数 信用等级 收起 理由
accumulation + 100 + 1 + 1 + 1 精彩帖子

总评分: 经验 + 100  学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

本帖被以下文库推荐

沙发
风性逐影 发表于 2017-3-31 09:13:45 |只看作者 |坛友微信交流群
哈哈,好东西,整的挺明白

使用道具

藤椅
魔元 发表于 2017-4-1 17:55:35 |只看作者 |坛友微信交流群
事件驱动策略容易有未来函数

使用道具

板凳
kakapdc 企业认证  发表于 2017-4-2 09:29:43 |只看作者 |坛友微信交流群
魔元 发表于 2017-4-1 17:55
事件驱动策略容易有未来函数
不会的。很多人在资金管理会有一些未来函数,但是不太严重。

使用道具

报纸
kakapdc 企业认证  发表于 2017-4-2 20:05:57 |只看作者 |坛友微信交流群
风性逐影 发表于 2017-3-31 09:13
哈哈,好东西,整的挺明白
一起学习

使用道具

地板
seanlee91 发表于 2017-5-21 15:43:55 |只看作者 |坛友微信交流群
感谢楼主分享

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 18:46