ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

【Python量化实战 #15】业绩预告一出就追涨?用 Python 算清事件窗口真实收益(事件驱动实战)

【Python量化实战 #15】业绩预告一出就追涨?用 Python 算清事件窗口真实收益(事件驱动实战) 本文是「Python量化实战」系列第 15 篇策略实战模块收官篇。上一篇我们用 backtrader 跑通了第一个策略回测这一篇换个思路不看 K 线形态只看事件——业绩预告、公告一落地股价到底怎么走“某某股预增 80%”——这种消息一弹出来很多人的第一反应是马上追。但你有没有认真算过业绩预告发布后第二天买入平均到底能赚多少我们用 15 只大盘股近三年半的 54 条业绩预告真实数据算了一遍结果可能会让你意外预升公告后追涨T1 平均收益只有 0.11%胜率不足五成。本文带你用 Python 把这套事件驱动分析完整跑一遍让数据代替直觉说话。本文你将得到什么一套可复用的业绩预告事件抓取代码含预升/预增/预亏/预降类型解析一个标准的事件窗口收益分析框架T1 / T5 / T10 收益与胜率统计一份基于真实数据的分类型统计结论附完整数字可自行复现验证一个可扩展的公告关键词监控骨架回购/增持/中标/重大合同事件驱动策略常见的 4 个坑与规避方法一、在线体验想先在线试试接口效果打开 API Playground 即可直接调用测试无需安装任何东西https://mairuiapi.com/playground本文用到三个接口业绩预告company_earnings_forecast、个股公告stock_announcement、历史 K 线stock_history都可以先在 Playground 里输入股票代码看看返回结构。二、环境准备本文代码使用 mairui SDK 获取股票数据安装方法如下pipinstallmairuiSDK 的完整接口文档与使用说明请查阅 GitHub 仓库https://github.com/MaiRuiApi/mairui接口的详细参数说明请查阅官网 API 文档https://mairuiapi.com/hsdata运行环境Python 3.9mairui SDK 1.0.0pandas 2.2证书通过环境变量读取不要写死在代码里importosimportmairui# 证书从环境变量读取官网注册后获取apimairui.Client(LICENCE-66D8-9F96-0C7F0FBCD073)# 演示证书演示证书读者复制即用无需替换本文数据截至 2026-07-28事件样本区间 2023-01-01 至 2026-06-30读者复现时数据可能因行情更新而略有差异。三、什么是事件驱动策略技术面策略盯的是价格形态事件驱动策略盯的是信息落地业绩预告、回购公告、重大合同、股东增持……每个事件都可能改变市场对一只股票的定价。事件驱动分析的核心问题只有一个某类事件发生后的 N 个交易日里股价平均表现如何回答这个问题需要三步抓事件 → 对齐事件日之后的行情 → 统计窗口收益。下面逐步实现。四、第一步抓业绩预告事件company_earnings_forecast接口返回一只股票历史上所有业绩预告字段包括发布日pdate这就是我们的事件日、报告期rdate、预告类型type预升/预增/预降/预亏/减亏等和摘要absimporttimeimportpandasaspd# 示例股票池跨行业大盘股样本固定池便于复现实际可换成指数成分股STOCK_POOL{600519:贵州茅台,000858:五粮液,601318:中国平安,600036:招商银行,000333:美的集团,600900:长江电力,601088:中国神华,600030:中信证券,000651:格力电器,300750:宁德时代,601899:紫金矿业,600887:伊利股份,002594:比亚迪,601012:隆基绿能,600809:山西汾酒,}EVENT_START,EVENT_END2023-01-01,2026-06-30deffetch_forecast_events(api):拉取股票池的业绩预告抽取事件四要素代码 / 发布日 / 类型 / 摘要。rows[]forcode,nameinSTOCK_POOL.items():foriteminapi.company_earnings_forecast(code)or[]:rows.append({code:code,name:name,pdate:item.get(pdate),# 预告发布日 事件日type:item.get(type),# 预升/预增/预降/预亏…})time.sleep(0.2)# 控制请求频率eventspd.DataFrame(rows)eventsevents[(events[pdate]EVENT_START)(events[pdate]EVENT_END)]returnevents.sort_values(pdate).reset_index(dropTrue)真实运行结果2026-07-29 验证业绩预告采集: 成功 15 只, 失败 0 只 区间 2023-01-01 ~ 2026-06-30 事件数: 54类型分布: 预升 27 预增 14 预降 9 预亏 2 减亏 2关键解释事件日必须用预告发布日pdate而不是报告期rdate——市场是在发布那一刻才知道消息的用报告期对齐行情就是典型的未来函数。五、第二步计算事件窗口收益事件研究法Event Study的标准做法以事件日后第一个交易日为基准买入统计其后第 1、5、10 个交易日的累计收益importnumpyasnp WINDOWS(1,5,10)defevent_window_returns(api,code,pdate):以事件日后首个交易日开盘价买入算 T1/T5/T10 收盘相对收益%。stpdate.replace(-,)et(pd.Timestamp(pdate)pd.Timedelta(days40)).strftime(%Y%m%d)klineapi.stock_history(code,d,n,stst,etet)# st/et 格式 YYYYMMDDifnotkline:return{}kline_dfpd.DataFrame(kline).sort_values(t).reset_index(dropTrue)entry_openfloat(kline_df.iloc[0][o])# 事件后首根K线开盘价买入result{}forninWINDOWS:iflen(kline_df)n:close_nfloat(kline_df.iloc[n][c])result[fret_t{n}]round((close_n/entry_open-1)*100,2)else:result[fret_t{n}]np.nanreturnresult关键解释买入基准用事件日后首个交易日的开盘价——预告多在收盘后或周末发布事件日当天的收盘价你根本买不到st/et参数格式是YYYYMMDD不带横杠传2024-01-01这类带横杠格式会报参数错误这是新手最常踩的格式坑日历天数取 40 天再截取第 N 根 K 线自动跳过停牌和节假日比日历日 N 天严谨。六、真实数据说话54 个事件的统计结果按预告类型聚合 54 个事件样本的窗口收益平均收益单位 %真实运行输出预告类型样本数T1 平均T1 胜率T5 平均T5 胜率T10 平均T10 胜率预升270.1144%0.5048%0.4852%预增140.7443%2.1864%1.0264%预降90.7067%2.9178%4.2589%预亏25.0050%3.9450%5.72100%减亏2-3.520%3.18100%-0.8050%三个值得注意的现象仅就本样本而言预升追涨最不划算27 个样本 T1 平均只有 0.11%胜率 44%——好消息往往早已反映在价格里“利好出尽”。预降反而表现最好T10 平均 4.25%、胜率 89%——大盘蓝筹的利空落地后市场常出现靴子落地式修复。窗口拉长分化更明显T1 噪音大T5/T10 的类型差异才逐渐显现。⚠️ 统计局限性必须说清楚本样本仅 15 只大盘股、54 个事件“预亏”减亏各只有 2 条不具备统计显著性不同市值、不同行业、不同市场环境下结论可能完全不同。这套框架的价值在于方法可复现而不是结论可照搬。七、第三步公告监控骨架——把事件源扩展到全部公告业绩预告只是事件之一。回购、增持、中标、重大合同同样是经典事件源。stock_announcement接口配合关键词过滤就是一个最小可用的事件监控骨架ANNOUNCE_KEYWORDS(回购,增持,中标,重大合同,业绩)defscan_announcements(api,codes,limit5):拉最近公告并按关键词过滤作为盘中事件监控的最小骨架。hits[]forcodeincodes:forainapi.stock_announcement(code,ltlimit)or[]:titlea.get(zt,)# 公告标题ifany(kintitleforkinANNOUNCE_KEYWORDS):hits.append({code:code,date:a.get(t),title:title})time.sleep(0.2)returnpd.DataFrame(hits)真实运行输出节选code date title 000858 2026-07-15 五 粮 液2026年半年度业绩预告 000858 2026-07-16 五 粮 液关于2025年度分红派息实施后调整回购股份价格上限的公告 000333 2026-07-09 美的集团关于以集中竞价交易方式回购A股股份达总股本1%的进展公告把它挂上定时任务比如每 10 分钟扫一遍自选股池命中关键词就推送提醒一个简易的事件哨兵就成型了。系列第 19 篇会专门讲盯盘与推送的工程化实现。八、完整可运行示例把三步串起来的完整脚本约 120 行结构如下完整代码按文中各节拼装即可直接运行importosimportmairuidefmain():apimairui.Client(LICENCE-66D8-9F96-0C7F0FBCD073)# 证书从环境变量读取eventsfetch_forecast_events(api)# ① 抓业绩预告事件studybuild_event_study(api,events)# ② 逐事件算窗口收益study.to_csv(event_study.csv,indexFalse,encodingutf-8-sig)fornin(1,5,10):# ③ 按类型聚合统计aggstudy.groupby(type)[fret_t{n}].agg(样本数count,平均收益lambdas:round(s.mean(),2),胜率lambdas:f{(s0).mean()*100:.0f}%,)print(f[T{n}]\n{agg})annscan_announcements(api,list(STOCK_POOL)[:5])# ④ 公告监控骨架print(ann)if__name____main__:main()九、避坑与进阶坑 1用报告期当事件日。rdate是财报对应的期末日期pdate才是消息落地日搞混了就是引入未来函数回测结果会好得离谱。坑 2用事件日收盘价当买入价。预告常在盘后发布当天收盘价买不到事件后首个交易日开盘价甚至考虑高开幅度才是可执行的基准。坑 3样本太少就下结论。类型细分后单类样本很容易只剩个位数先看样本数再看均值必要时合并类型如预升预增 正面事件。坑 4忽略整体行情。事件窗口收益里混着大盘涨跌严谨做法是减去同期沪深 300 收益得到超额收益读者可以用index_history接口自行扩展。进阶方向把事件类型、预告幅度从abs摘要正则提取、市值分组做成因子与第 12 篇的多因子框架结合就是一个事件因子研究的雏形。十、总结与延伸本文用真实数据回答了业绩预告出了要不要追这个问题至少在大盘股样本里追预升是期望值很低的行为而预降的靴子落地效应反而值得研究。更重要的是你拿到了一套可复现的事件研究框架——抓事件、对齐窗口、算收益、看胜率任何事件源公告/解禁/分红都能套用。策略实战模块#11-#15到此收官。下一篇进入工程化模块全市场 5000 只股票的数据怎么批量拉才又快又稳——并发、重试、进度、合并一次讲透。延伸阅读在线体验更多接口https://mairuiapi.com/playground查看完整 API 文档https://mairuiapi.com/hsdataSDK 文档与源码https://github.com/MaiRuiApi/mairui关注公众号获取本系列更新本文为技术演示文中所有统计基于有限历史样本不构成投资建议。
返回列表