简介:本资源是一份面向金融研究者、经管类硕博生及毕业设计学生的实证分析数据集,聚焦上市公司信息不对称程度量化问题,提供1991–2022年沪深北A股共59534条面板数据,覆盖流动性比率(LR)、非流动性比率(ILL)、收益率反转(GAM)及两个综合指数ASY1/ASY2等7个核心指标,支持Stata与Excel双格式分析。资源为单个70KB的DOCX文档,内含完整指标定义、计算逻辑说明、Stata过程代码、原始数据验证路径(含超2.8GB 2007–2021原始计算数据指引)及参考文献支撑,便于复现、拓展与方法比对。目前已有231人学习下载,适用于金融计量课程作业、学术论文实证部分构建、毕业设计中信息效率或公司治理方向的深度分析,尤其适配需兼顾理论严谨性与操作可复现性的中高级研究场景。
1. 上市公司信息不对称程度ASY数据(1991–2022)不是“下载即用”的现成表格,而是需从原始行情与财务数据中严格复现的学术度量指标
很多刚接触公司金融或资产定价研究的朋友,看到标题里“ASY数据1991-2022”“流动性比率”“非流动性比率”“收益率反转指标”这些词,第一反应是:网上搜到一个网盘链接,点开.docx就能直接导入Stata或Python做回归——但现实恰恰相反。ASY(Amihud Illiquidity Ratio 的衍生变体,常指基于日度收益率与成交额构造的信息不对称代理变量)本身没有官方发布源,它不是像CSMAR、Wind那样由数据库厂商预计算好的字段,而是依赖研究者对原始高频交易数据(逐笔或日频)、收盘价、成交量、成交额、流通股本等底层要素的清洗逻辑、时间窗口设定与稳健性处理共同决定的。1991–2022年A股跨度极大,早期数据缺失严重(如1991–1996年多数券商未保留逐日成交额),交易所披露标准多次变更(2006年股权分置改革后流通股定义变化、2013年融资融券标的扩容、2019年科创板引入做市商报价),这些都会导致ASY值在断点处不可比。本文不提供任何网盘链接(此类.docx文件普遍存在字段定义模糊、时间范围错位、未声明计算口径等问题),而是带你从零构建一套可复现、可验证、适配中国资本市场演进特征的ASY计算流程——适用于实证论文写作、因子回测、监管合规分析等严肃场景,尤其适合需要向期刊或风控部门说明指标生成逻辑的研究者与量化工程师。
2. ASY指标的本质:不是单一公式,而是三类流动性代理变量的组合逻辑与市场微观结构映射
ASY并非一个固定公式,而是学术文献中对“信息不对称如何通过交易行为显化”的建模尝试。其核心思想是:当投资者掌握私有信息时,会倾向于在流动性较差(即单位成交额引发更大价格冲击)的股票上集中交易,从而推高该类股票的价量敏感度。因此,ASY本质是用可观测的交易摩擦反推不可观测的信息环境。当前主流实现路径有三类,需根据研究目标选择主干并明确声明:
2.1 Amihud非流动性比率:最基础且可追溯至1991年的日度代理变量
Amihud (2002) 提出的非流动性比率定义为:
$$ \text{ILLIQ}{i,t} = \frac{|R{i,t}|}{\text{DollarVolume}{i,t}} $$
其中 $ R{i,t} $ 是股票 $ i $ 在交易日 $ t $ 的日收益率(通常用前复权收盘价计算),$ \text{DollarVolume}_{i,t} $ 是当日成交金额(单位:万元)。该指标物理含义清晰:单位成交金额引发的绝对收益率越大,说明市场对该股定价越不充分,信息不对称程度越高。
注意:A股早期(1991–1996)成交金额数据极不完整,上交所1990年12月开市,深交所1991年7月开市,但系统性电子化记录始于1997年。因此实际可用区间建议设为1997年1月–2022年12月,并在论文中明确标注数据可得性断点。
2.2 Pastor–Stambaugh流动性比率:捕捉流动性风险溢价的跨期波动
Pastor & Stambaugh (2003) 构造的流动性Beta,本质是股票收益对市场整体流动性冲击的敏感度:
$$ \text{LiquidityBeta}i = \text{Cov}(R{i,t}, \Delta\text{ILLIQ}_t) / \text{Var}(\Delta\text{ILLIQ}_t) $$
其中 $ \Delta\text{ILLIQ}_t $ 是全市场股票ILLIQ序列的日度变化中位数。该指标反映个股是否在市场流动性收紧时更易被抛售,间接体现信息优势方的择时能力。计算需全市场截面数据,对样本覆盖度要求极高。
2.3 收益率反转指标:识别信息驱动型短期动量/反转
信息不对称常表现为“坏消息滞后反应”——知情交易者先行交易,不知情者随后跟风,导致股价在事件后数日出现显著反转。常用代理是:
$$ \text{Rev}{i,t} = R{i,t-1} - \text{Median}(R_{j,t-1} \mid j \in \text{SameIndustry}) $$
即个股昨日收益率减去同行业其他股票昨日收益率中位数。该指标需行业分类(推荐使用申万一级行业2021版),且对停牌股票需特殊处理(如用前一交易日收益率替代)。
2.1.1 为什么ASY必须组合使用?单指标失效的典型场景
| 场景 | ILLIQ单独失效原因 | 组合修正方式 |
|---|---|---|
| ST股/退市预警股 | 成交额骤降导致ILLIQ虚高,但并非信息不对称,而是流动性枯竭 | 引入Pastor Beta过滤:若LiquidityBeta显著为正且ILLIQ>95分位数,则标记为“异常流动性陷阱”,剔除或缩尾 |
| 新股上市首月 | 高换手率伴随高ILLIQ,实为制度性供给约束而非信息优势 | 加入“上市天数<60”虚拟变量交互项,或直接剔除上市60日内样本 |
| 融资融券标的股 | 做空机制降低信息不对称,但ILLIQ可能因融券卖出放大 | 在回归中控制“是否两融标的”哑变量,或使用融券余额/融资余额比作为调节变量 |
3. 用Python从原始行情数据生成ASY指标:从CSMAR/Wind导出到日频ILLIQ序列的最小可行代码
本节提供可直接运行的Python脚本框架,基于真实A股数据结构(以CSMAR为例,字段名适配Wind可自行替换)。关键在于数据清洗顺序不可逆:先处理停牌与ST标识,再计算收益率,最后统一度量单位。所有步骤均附参数说明与常见报错应对。
3.1 数据准备:必需字段与清洗逻辑
从CSMAR下载原始数据表(StockDailyReturn+StockTrade),确保包含以下字段:
Stkcd: 股票代码(6位数字字符串)Trddt: 交易日期(YYYYMMDD格式)Dnvaltrd: 日成交金额(万元)Clsprc: 收盘价(前复权)Dsmvttl: 总市值(万元)Stknme: 股票简称(用于识别ST/*ST)Dretnd: 日收益率(已计算好,但需校验)
提示:CSMAR中
Dnvaltrd单位为“万元”,而Amihud原始论文要求美元成交额,A股直接使用万元单位即可,但需在论文方法部分注明“单位统一为人民币万元”,避免审稿人质疑量纲。
3.2 核心计算函数:ILLIQ日度序列生成
import pandas as pd import numpy as np from datetime import datetime def calculate_illiq(df: pd.DataFrame) -> pd.DataFrame: """ 计算Amihud非流动性比率 ILLIQ = |R| / DollarVolume 输入df需含:Stkcd, Trddt, Clsprc, Dnvaltrd, Dretnd 输出新增列:ILLIQ, valid_flag(标识是否有效计算) """ # 步骤1:剔除ST/*ST及暂停上市股票 df['is_st'] = df['Stknme'].str.contains(r'(ST|\*ST)', na=False) df = df[~df['is_st']].copy() # 步骤2:过滤成交金额为0或缺失的记录(常见于新股首日无成交额) df = df.dropna(subset=['Dnvaltrd', 'Dretnd']) df = df[df['Dnvaltrd'] > 0] # 步骤3:收益率取绝对值,成交额单位保持万元(无需转换) df['abs_ret'] = df['Dretnd'].abs() df['ILLIQ'] = df['abs_ret'] / df['Dnvaltrd'] # 步骤4:缩尾处理(Winsorize)——消除极端值干扰 # 按股票-年度分组,对ILLIQ做1%缩尾(非全样本缩尾!) df['year'] = pd.to_datetime(df['Trddt'], format='%Y%m%d').dt.year def winsorize_group(x): x['ILLIQ'] = x['ILLIQ'].clip(lower=x['ILLIQ'].quantile(0.01), upper=x['ILLIQ'].quantile(0.99)) return x df = df.groupby(['Stkcd', 'year']).apply(winsorize_group).reset_index(drop=True) # 步骤5:标记有效样本(ILLIQ > 0 且非无穷大) df['valid_flag'] = ((df['ILLIQ'] > 0) & (df['ILLIQ'] < np.inf) & (~df['ILLIQ'].isna())) return df # 示例调用 raw_data = pd.read_csv('csamar_stock_daily_1997_2022.csv', dtype={'Stkcd': str, 'Trddt': str}) illiq_df = calculate_illiq(raw_data) print(f"原始记录数:{len(raw_data)} → 有效ILLIQ记录数:{illiq_df['valid_flag'].sum()}")3.2.1 关键参数说明与调试指南
Dnvaltrd > 0过滤:A股存在“零成交额但有收盘价”的情况(如B股、部分债券),必须剔除,否则ILLIQ为无穷大;year分组缩尾:若对全样本缩尾,会导致小盘股ILLIQ被大盘股分布主导,违背“个股流动性应独立评估”原则;valid_flag设计:后续做面板回归时,必须用此标志筛选样本,避免将NaN或Inf带入模型;- 常见报错
ZeroDivisionError:源于Dnvaltrd含负值(CSMAR偶有录入错误),加df = df[df['Dnvaltrd'] > 0]前置过滤即可解决。
3.3 构建多维度ASY复合指标:ILLIQ + LiquidityBeta + Rev的整合框架
def build_asy_composite(df_illiq: pd.DataFrame) -> pd.DataFrame: """ 整合三类指标生成最终ASY变量 返回df含:Stkcd, Trddt, ILLIQ, LiquidityBeta, Rev, ASY_Composite """ # 步骤1:计算市场层面ΔILLIQ(全市场ILLIQ日度变化中位数) market_illiq = df_illiq.groupby('Trddt')['ILLIQ'].median().rename('Mkt_ILLIQ') df_illiq = df_illiq.merge(market_illiq, on='Trddt', how='left') df_illiq['Delta_ILLIQ'] = df_illiq['ILLIQ'] - df_illiq['Mkt_ILLIQ'] # 步骤2:计算Pastor Beta(滚动60日窗口,需保证至少30个有效日) def calc_beta(group): if len(group) < 30: return np.nan cov = np.cov(group['Dretnd'], group['Delta_ILLIQ'], ddof=1)[0,1] var = np.var(group['Delta_ILLIQ'], ddof=1) return cov / var if var != 0 else np.nan df_illiq['LiquidityBeta'] = df_illiq.groupby('Stkcd').apply( lambda x: x.sort_values('Trddt')['Dretnd'].rolling(60).apply( lambda y: calc_beta(x.iloc[y.index]) ) ).reset_index(level=0, drop=True) # 步骤3:计算收益率反转Rev(同行业比较) # 假设已有industry_map: {Stkcd: industry_code} industry_map = load_industry_mapping() # 自行实现,推荐申万2021一级行业 df_illiq['industry'] = df_illiq['Stkcd'].map(industry_map) df_illiq['Rev'] = df_illiq.groupby(['Trddt', 'industry'])['Dretnd'].transform( lambda x: x - x.median() ) # 步骤4:合成ASY_Composite(标准化后等权) for col in ['ILLIQ', 'LiquidityBeta', 'Rev']: df_illiq[f'{col}_zscore'] = df_illiq.groupby('Trddt')[col].transform( lambda x: (x - x.mean()) / x.std(ddof=1) if x.std(ddof=1) != 0 else 0 ) df_illiq['ASY_Composite'] = ( df_illiq['ILLIQ_zscore'] + df_illiq['LiquidityBeta_zscore'] + df_illiq['Rev_zscore'] ) / 3 return df_illiq # 输出最终结果(按研究需求保存) final_asy = build_asy_composite(illiq_df) final_asy.to_parquet('asy_composite_1997_2022.parquet', index=False)3.3.1 行业映射与滚动窗口的实操细节
industry_map获取:CSMAR提供IndustryClass表,字段Indcd对应申万行业代码,需匹配最新版(2021版共31个一级行业);rolling(60)窗口:60交易日≈3个月,符合Pastor原论文设定;若某股连续停牌超30日,则该窗口内Beta为空,不影响其他时段;zscore标准化:必须按交易日截面标准化(groupby('Trddt')),确保每日指标均值为0、标准差为1,避免时间序列趋势干扰。
4. 处理1991–2022年数据断点的三大实操方案:从缺失填补到制度变迁校正
1991–2022年跨度32年,A股经历了交易所成立、股权分置改革、创业板开板、注册制试点等重大制度变迁,直接拼接ILLIQ序列会产生系统性偏差。不能简单用“线性插值”或“均值填充”,必须按阶段采取针对性处理。
4.1 1991–1996年:用“可得性替代法”构建准代理变量
该阶段原始成交金额缺失率超80%,但上交所《证券市场年鉴》记载了年度总成交额与上市公司家数。可行方案:
- 计算年度市场ILLIQ均值:$ \text{ILLIQ}{\text{market},y} = \frac{\sum_i |R{i,y}|}{\text{TotalDollarVolume}y} $,其中 $ R{i,y} $ 用年度涨跌幅近似(CSMAR提供
YearlyReturn表); - 对个股赋予该年度市场均值,同时添加
data_quality_flag=0(低质量); - 在回归中加入
data_quality_flag交互项,检验低质量样本是否系统性偏离。
4.2 1997–2005年:股权分置改革前的流通股校正
2006年前非流通股占比高,成交额仅反映流通部分,但ILLIQ分母应为“可交易市值”。校正公式:
$$ \text{Adjusted_DollarVolume}{i,t} = \text{Dnvaltrd}{i,t} \times \frac{\text{TotalMarketCap}{i,t}}{\text{CirculatingMarketCap}{i,t}} $$
其中CirculatingMarketCap可从CSMARStockSummary表获取(字段CircumValue),TotalMarketCap用Dsmvttl。此校正使ILLIQ更真实反映全市场信息环境。
4.3 2013年后:融资融券与科创板做市商的双重影响
- 融资融券标的扩容:2013年3月起两融标的从278只扩至1000+只,做空机制降低信息不对称,ILLIQ应系统性下降。建议在回归中加入
is_margin_trading哑变量(1=是两融标的,0=否); - 科创板做市商制度:2022年10月起科创板股票引入做市商报价,流动性提升但价格发现效率变化复杂。稳妥做法是将2022年10月后科创板样本单独分组,报告异质性结果。
4.1.1 断点检验的Stata命令模板(供实证复现)
* 检验股权分置改革断点(2006年股权分置改革完成) gen post_reform = (year >= 2006) gen illiq_post = ILLIQ * post_reform reg ASY_Composite i.post_reform c.illiq_post i.size i.roa, r est store reform_test * 检验科创板做市商断点(2022年10月) gen post_kcb = (year == 2022 & month >= 10) & (market == "KCB") reg ASY_Composite i.post_kcb c.ILLIQ##i.post_kcb i.size, r提示:所有断点检验必须报告
F统计量与p值,若post_xxx系数显著为负,说明该制度降低了信息不对称,支持理论预期。
5. 验证ASY指标有效性的三个硬核方法:从描述性统计到资产定价检验
生成ASY数据后,不能直接用于回归,必须通过三重验证确认其捕捉的是“信息不对称”而非“噪声”或“其他混杂因素”。这是期刊拒稿的高发区,也是风控模型上线前的必过关卡。
5.1 描述性统计:检查指标分布是否符合理论预期
信息不对称程度应呈现右偏分布(多数股票较低,少数股票极高),且与公司特征强相关。执行以下检验:
summarize ASY_Composite, detail:观察skewness > 2(右偏)、p95/p5 > 10(极值存在);correlate ASY_Composite size roa age:预期size(市值)与ASY显著负相关(大盘股信息更透明),roa(资产收益率)与ASY负相关(盈利稳定公司信息更可预测),age(上市年限)与ASY负相关(老公司信息披露更规范)。
5.2 横截面回归:复现经典文献的基准结果
将ASY作为解释变量,检验其对下一期股票收益的预测能力(信息不对称越高,预期收益越高以补偿信息风险):
# Python statsmodels示例 import statsmodels.api as sm X = final_asy[['ASY_Composite', 'size', 'bm', 'turnover', 'volatility']] X = sm.add_constant(X) # 加入截距项 y = final_asy['next_month_return'] # 下月收益率 model = sm.OLS(y, X).fit(cov_type='HC1') # 聚类稳健标准误 print(model.summary())合格标准:ASY_Composite系数显著为正(t值>2.0),且加入控制变量后仍稳健;若符号为负,说明指标构造存在方向性错误(如收益率未取绝对值)。
5.3 事件研究法:检验重大信息披露事件前后的ASY跃迁
选取2010–2022年全部年报披露日(每年4月30日前),构造事件窗[-5, +5]日,计算每只股票在事件窗内ILLIQ均值减去基准窗[-120, -11]日均值:
$$ \Delta\text{ILLIQ}{i,t} = \text{mean}(ILLIQ{i,t-5:t+5}) - \text{mean}(ILLIQ_{i,t-120:t-11}) $$
理论预期:年报披露后信息不对称下降,ΔILLIQ应显著小于0。使用双重差分(DID)框架:
- 处理组:当年披露年报的股票;
- 对照组:同行业、同市值分组的未披露股票;
- 回归:
ΔILLIQ ~ treatment + controls,treatment系数显著为负即验证成功。
关键技巧:年报披露日需从CSMAR
CorpAnnounce表提取,字段AnnDt(公告日期),避免使用“财报截止日”(实际披露常延迟)。若用Wind,对应字段为report_date。
本文还有配套的精品资源,点击获取