Pandas怎么处理股票停牌?空值填充有妙招!
停牌数据处理的痛点
做量化交易的朋友都知道,股票停牌是个让人头疼的问题。你精心设计的策略跑得好好的,突然某只股票停牌了,数据流里直接给你塞个NaN,整个回测结果可能就歪了。更糟的是,不同股票的停牌时间还不一样,有的停一天,有的能停半年。
我见过不少新手直接dropna()一把梭,结果把正常交易日的数据也删了。也有的用零填充,这比删除还可怕——你想想,一支股票昨天收盘10块,今天"变成"0,明天又变回10块,这收益率计算能准吗?
为什么不能简单删除或填零
上周就有个客户跟我吐槽,他回测一个多因子模型,年化收益显示80%,兴奋得不行。结果实盘一跑,亏了20%。后来发现是停牌数据处理有问题——他把所有NaN都用前值填充,导致停牌期间的价格一直不变,策略信号严重滞后。
这就像用去年的天气预报决定今天穿什么,能不翻车吗?停牌期间市场在变化,其他股票在波动,简单沿用停牌前价格会严重低估真实风险。
专业选手的四种填充姿势
前值填充法(ffill)
这是最基础的方法:
df.fillna(method='ffill')
适合短期停牌,比如例行股东大会停牌一天。但长期停牌就会失真——一支股票停牌三个月,期间大盘跌了20%,你还用三个月前的价格,这明显不合理。
行业指数替代法
更聪明的做法是用行业指数来替代:
industry_return = get_industry_index() # 获取行业指数收益率
df['stock_price'] = df['stock_price'].fillna(df['industry_price'] * industry_return)
比如茅台停牌时,可以用白酒行业指数涨跌幅来估算。这个方法在行业同涨同跌时比较准,但个股特殊情况(如暴雷)就不适用。
市场中性填充法
对冲基金常用的方法:
beta = calculate_beta() # 计算股票beta值
market_return = get_market_return() # 获取市场收益率
df['stock_price'] = df['stock_price'].fillna(prev_price * (1 + beta * market_return))
考虑了个股与大盘的相关性。比如β=1.2的股票,在大盘涨1%时估算涨1.2%。但β值本身也会变化,长期停牌时仍需谨慎。
多因子预测法
最复杂但也最精准的方法:
model = load_factor_model() # 加载预训练的多因子模型
features = get_current_factors() # 获取当前因子暴露
df['stock_price'] = df['stock_price'].fillna(model.predict(features))
需要历史数据训练模型,考虑估值、动量、波动率等多个因子。适合专业机构,但对数据量和算力要求较高。
实战中的组合拳
我服务的几个大客户通常这样做:
- 停牌5天以内:前值填充
- 5-20天:行业指数法+市场中性法加权
- 20天以上:触发人工复核,必要时暂时移出股票池
def smart_fillna(df):
stop_days = df['price'].isnull().cumsum()
df['filled_price'] = np.select(
[stop_days <= 5, stop_days <= 20],
[df['price'].ffill(),
industry_fill(df)*0.7 + market_neutral_fill(df)*0.3],
default=manual_review_flag
)
return df
停牌期的风控技巧
处理价格只是第一步,真正的难点在风控:
- 仓位管理:停牌股票无法卖出,要控制单票仓位上限
- 流动性补偿:在组合风险模型中增加流动性惩罚因子
- 事件驱动预警:对长期停牌股票设置特殊处理流程
我们券商的量化系统有个实用功能:当持仓股票停牌超过10个交易日,会自动降低其他相关股票的风险敞口,防止流动性危机。
为什么选择我们
看到这里你可能发现了,处理停牌数据不是改一行代码那么简单。我们为量化客户提供的服务包括:
- 全市场停牌预警推送:比公告提前30分钟获知停复牌信息
- 智能填充算法库:内置7种经过实盘验证的填充方案
- 流动性压力测试:模拟极端行情下的停牌冲击
上周刚帮一个客户优化停牌处理流程,使他的高频策略回撤减少了15%。现在开户即送《A股停牌数据处理白皮书》,包含2016-2023年所有停牌事件的统计分析。
(悄悄说:通过我的渠道开户,还能额外获取独家整理的"停牌股票替代组合"数据库,包含每支停牌股票的历史最优替代标的)
最后的小建议
如果你还在用简单填充方法,赶紧升级吧。市场不会原谅懒惰的量化玩家——去年就有个私募因为停牌数据处理不当,在房地产股票集体停牌期间净值暴跌30%。
不如现在就来聊聊?我们团队的数据科学家可以免费帮你诊断现有的停牌处理流程。点击下方链接开户,前20名还能获得定制化的停牌应对方案。
(对了,最近创业板注册制下停牌规则又有变化,我们更新了对应的处理模块,老客户记得升级)