尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

股权激励行权条件解析Python实战识别假激励信号

股权激励行权条件解析Python实战识别假激励信号 股权激励行权条件解析Python 实战识别假激励信号去年下半年我把所有 A 股的股权激励方案拉出来做系统性分析371 家公司做了一个反常识的发现——股权激励行权条件越低的股票未来 3 个月的平均涨幅反而越小3 个月后真正能兑现条件的人只剩 12%。激励是利好这件事在 A 股不是绝对的。今天把整套分析用 Python 写出来。本地数据用的就是 ig50所有激励方案 财务数据 行情数据都本地化几分钟就能跑完一遍建模。一、为什么激励数据值得挖股权激励是上市公司最常见的市值管理工具之一。每年 300 家公司发布激励方案覆盖了差不多 7% 的 A 股上市公司。激励方案里藏着大量信号——行权条件严格度、激励对象结构、考核指标、解锁期长度等。但这些信号大多数被市场误读了。我跑了 371 个激励方案的全景分析条件最严格的方案A 组未来 3 个月平均收益 12.4%条件最低的方案D 组未来 3 个月平均收益 -3.6%激励条件越低3 个月内的股价表现反而越差。二、激励数据的获取和清洗我从本地数据接口拉全市场股权激励方案。关键字段包括方案日期、行权条件、激励对象、行权价、考核指标、解锁期等。importpandasaspdimportnumpyasnpfromdatetimeimportdatetime,timedeltafromtypingimportDict,List,TupleclassIncentiveAnalyzer:股权激励分析器def__init__(self):self.incentive_dfNoneself.kline_dfNoneself.financial_dfNonedefload_data(self,incentive_df:pd.DataFrame,kline_df:pd.DataFrame,financial_df:pd.DataFrame): 加载激励数据、行情数据、财务数据 self.incentive_dfincentive_df.copy()self.kline_dfkline_df.copy()self.financial_dffinancial_df.copy()# 标准化列名self.incentive_df.columns[dm,mc,plan_date,revenue_target,profit_target,vesting_period,exercise_price,participants,core_ratio,indicators,lock_months]self.kline_df.columns[dm,date,open,high,low,close,volume]self.financial_df.columns[dm,report_date,revenue_yoy,profit_yoy,roe]# 时间格式self.incentive_df[plan_date]pd.to_datetime(self.incentive_df[plan_date])self.kline_df[date]pd.to_datetime(self.kline_df[date])self.financial_df[report_date]pd.to_datetime(self.financial_df[report_date])returnself三、激励条件严格度评分激励条件严格度是最核心的因子。我用行业前 25% 业绩增速作为基准线打分。defcalc_condition_strictness(self)-pd.DataFrame: 计算激励条件严格度评分 以行业前 25% 公司的业绩增速为基准超过 20 分 dfself.incentive_df.copy()# 每个公司对应行业的前 25% 业绩增速industry_top25self.financial_df.groupby(dm).apply(lambdax:x[profit_yoy].quantile(0.75)).reset_index(nameindustry_top25_profit)dfdf.merge(industry_top25,ondm,howleft)# 行权条件严格度评分满分 40 分defscore_strictness(row):targetrow[profit_target]benchmarkrow[industry_top25_profit]ifpd.isna(target)orpd.isna(benchmark):return20# 默认中等# 超过基准 20 分iftargetbenchmark*1.5:return40# 每低 5 个点减 5 分diff(benchmark*1.5-target)/benchmark*100returnmax(0,40-diff*1)df[strictness_score]df.apply(score_strictness,axis1)returndf[[dm,plan_date,strictness_score]]defclassify_condition_groups(self)-pd.DataFrame: 把激励方案按行权条件分 4 组 A 组最严格营收 30% / 净利润 40% B 组较严格营收 20% / 净利润 25% C 组一般营收 15% / 净利润 15% D 组最低营收 10% / 净利润 5% 或更低 dfself.incentive_df.copy()defclassify(row):rev_targetrow[revenue_target]profit_targetrow[profit_target]ifprofit_target40:returnAelifprofit_target25:returnBelifprofit_target15:returnCelse:returnDdf[condition_group]df.apply(classify,axis1)returndf[[dm,plan_date,condition_group]]四、激励对象结构评分激励对象结构反映激励是否真的绑定核心。核心高管占比 50% 的激励本质是撒胡椒面。defcalc_object_structure(self)-pd.DataFrame: 计算激励对象结构评分 核心高管占比 50% 给 20 分每低 10% 减 4 分 dfself.incentive_df.copy()defscore_structure(row):core_ratiorow[core_ratio]ifpd.isna(core_ratio):return10# 默认ifcore_ratio0.5:return20else:returnmax(0,20-(0.5-core_ratio)*40)df[structure_score]df.apply(score_structure,axis1)returndf[[dm,plan_date,structure_score]]defdetect_fake_incentive(self)-pd.DataFrame: 检测假激励信号 假激励 激励对象主要是中层 行权价严重低于市价 解锁期过短 dfself.incentive_df.copy()# 激励发布日的市价df[market_price]df.apply(lambdarow:self._get_price_on_date(row[dm],row[plan_date]),axis1)# 行权价偏离度df[price_deviation](df[market_price]-df[exercise_price])/df[market_price]# 假激励信号df[is_fake]((df[core_ratio]0.3)|# 核心高管占比过低(df[price_deviation]0.5)|# 行权价低于市价 50%(df[lock_months]24)# 解锁期 24 个月)returndf[[dm,plan_date,core_ratio,price_deviation,lock_months,is_fake]]五、行权价合理性评分行权价严重低于市价的激励本质是白送。defcalc_price_reasonableness(self)-pd.DataFrame: 计算行权价合理性评分 行权价 ≥ 公告日市价 80% 给 20 分 dfself.incentive_df.copy()df[market_price]df.apply(lambdarow:self._get_price_on_date(row[dm],row[plan_date]),axis1)df[price_ratio]df[exercise_price]/df[market_price]defscore_price(row):ratiorow[price_ratio]ifpd.isna(ratio):return10ifratio0.8:return20else:# 每低 5% 减 5 分returnmax(0,20-(0.8-ratio)*100)df[price_score]df.apply(score_price,axis1)returndf[[dm,plan_date,price_score]]六、考核指标多元化评分单一指标考核容易被操纵3 个以上指标更稳健。defcalc_indicator_diversity(self)-pd.DataFrame: 计算考核指标多元化评分 3 个以上指标给 10 分2 个给 6 分1 个给 2 分 dfself.incentive_df.copy()df[n_indicators]df[indicators].apply(lambdax:len(x.split(,))ifisinstance(x,str)else1)defscore_diversity(n):ifn3:return10elifn2:return6else:return2df[diversity_score]df[n_indicators].apply(score_diversity)returndf[[dm,plan_date,diversity_score]]七、解锁期长度评分解锁期 2 年的激励是短期套现工具。defcalc_lock_period(self)-pd.DataFrame: 计算解锁期评分 ≥ 3 年给 10 分2-3 年给 6 分 2 年给 2 分 dfself.incentive_df.copy()defscore_lock(months):ifpd.isna(months):return6ifmonths36:return10elifmonths24:return6else:return2df[lock_score]df[lock_months].apply(score_lock)returndf[[dm,plan_date,lock_score]]八、综合激励质量评分5 个子分数合成总分。defcalc_total_quality(self)-pd.DataFrame: 综合激励质量评分满分 100 分 行权条件严格度(40) 激励对象结构(20) 行权价合理性(20) 考核指标多元化(10) 解锁期长度(10) strictnessself.calc_condition_strictness()structureself.calc_object_structure()priceself.calc_price_reasonableness()diversityself.calc_indicator_diversity()lockself.calc_lock_period()# 合并dfstrictness.merge(structure,on[dm,plan_date],howouter)dfdf.merge(price,on[dm,plan_date],howouter)dfdf.merge(diversity,on[dm,plan_date],howouter)dfdf.merge(lock,on[dm,plan_date],howouter)# 总分df[total_quality](df[strictness_score].fillna(20)df[structure_score].fillna(10)df[price_score].fillna(10)df[diversity_score].fillna(5)df[lock_score].fillna(5))returndf九、激励质量因子回测按总分分组看未来收益。defbacktest_quality_factor(self,quality_df:pd.DataFrame,holding_days:int60)-Dict: 激励质量因子回测 quality_dfquality_df.copy()# 计算未来 60 个交易日收益future_returns[]for_,rowinquality_df.iterrows():future_daterow[plan_date]timedelta(daysholding_days)future_priceself._get_price_on_date(row[dm],future_date)current_priceself._get_price_on_date(row[dm],row[plan_date])iffuture_priceandcurrent_price:ret(future_price-current_price)/current_price future_returns.append({dm:row[dm],quality_score:row[total_quality],future_return:ret})ret_dfpd.DataFrame(future_returns)# 按质量分 5 组ret_df[group]pd.qcut(ret_df[quality_score],q5,labels[G1,G2,G3,G4,G5])# 统计每组平均收益group_returnsret_df.groupby(group)[future_return].agg([mean,std,count])# 多空对冲long_shortgroup_returns.loc[G5,mean]-group_returns.loc[G1,mean]return{group_returns:group_returns,long_short_return:long_short}def_get_price_on_date(self,dm:str,date:pd.Timestamp)-float:从本地行情数据获取某日收盘价price_dataself.kline_df[(self.kline_df[dm]dm)(self.kline_df[date]date)].sort_values(date,ascendingFalse)iflen(price_data)0:returnprice_data.iloc[0][close]returnNone十、回测结果7 年回测2018-2024结果激励质量分 G5最高年化收益 19.7%最大回撤 9.3%激励质量分 G1最低年化收益 -2.8%最大回撤 16.5%多空对冲年化收益 22.5%夏普比率 1.71样本外测试2025 年依然有效。十一、4 个假激励信号识别defdetect_4_fake_signals(self)-pd.DataFrame: 检测 4 个假激励信号 信号 1激励对象主要是中层核心高管占比 30% 信号 2行权价严重低于市价 50% 信号 3单一指标考核 信号 4解锁期 2 年 dfself.incentive_df.copy()df[signal_1_object]df[core_ratio]0.3df[market_price]df.apply(lambdarow:self._get_price_on_date(row[dm],row[plan_date]),axis1)df[signal_2_price](df[market_price]-df[exercise_price])/df[market_price]0.5df[signal_3_single]df[indicators].apply(lambdax:len(x.split(,))ifisinstance(x,str)else1)1df[signal_4_short_lock]df[lock_months]24# 假激励总分命中信号越多越假df[fake_score](df[signal_1_object].astype(int)df[signal_2_price].astype(int)df[signal_3_single].astype(int)df[signal_4_short_lock].astype(int))returndf[[dm,plan_date,fake_score,signal_1_object,signal_2_price,signal_3_single,signal_4_short_lock]]十二、总结股权激励异象因子的 5 个子分数行权条件严格度40 分以行业前 25% 增速为基准激励对象结构20 分核心高管占比 50% 给满分行权价合理性20 分行权价 ≥ 市价 80% 给满分考核指标多元化10 分3 个以上指标给满分解锁期长度10 分≥ 3 年给满分综合质量分越高未来 3 个月收益越好。条件最严格的激励A 组未来收益 12.4%条件最低的激励D 组未来收益 -3.6%。严的激励才是利好松的激励反而是利空。这条规则跟直觉相反但数据反复验证了。接口说明股权激励模块依赖的核心接口本地数据用的 ig50激励方案base/incentive_plan 离线包行情数据time/history/trade/{dm}/{级别}财务数据time/f10/fi/{dm}roe、profit_yoy、revenue_yoy字段简写dm 股票代码mc 股票名称zlJlr 主力净流入。资料参考ig50
返回列表