简介这份数据集聚焦2013至2024年上市公司与上下游供应商、客户之间的协同创新关系面向从事供应链管理、创新研究及实证分析的学者与从业者可用于评估供应链协同创新效果、优化供应链决策。资源包共10个文件以xlsx数据表为主辅以do代码文件、html来源说明与txt使用说明压缩包约258.68MB涵盖合并后的供应链专利数据、重构后的供应商与客户数据以及供应商版、客户版协同创新结果表。其中专利数据包含标题、摘要、申请人、IPC分类、引证与被引证等字段协同创新数据则记录供应商与客户名称、代码、年份、合作次数及中游公司信息并附有整理代码便于复现。已有58人学习下载适合需要构建供应链协同创新指标、开展专利合作计量或进行上下游关系实证的研究者参考使用。1. 上市公司上下游供应链协同创新数据一份横跨十二年的面板怎么用2013 到 2024 年A 股上市公司里做供应链协同创新的研究最头疼的从来不是模型而是数据。你要研究一家整车厂和它的电池供应商、结构件供应商之间到底有没有协同创新光靠年报里那句“深化战略合作”是没用的得把上下游关系、专利联合申请、研发投入、采购集中度这些字段拼到一张面板上。这份“上市公司-上下游供应链协同创新数据2013-2024年”解决的正是这件事它把上市公司和它的主要供应商、客户按年度对齐让你能直接跑固定效应、做 DID、算协同强度。适合谁做公司金融、产业经济、创新管理的硕博生以及券商研究所里需要量化产业链关系的分析师。下面我按自己复现这类面板的路径把口径、合并、清洗、回归和踩坑一次讲透。2. 先搞清楚“协同创新”在数据里到底长什么样2.1 供应链关系的三种识别口径拿到任何一份供应链数据第一件事是确认它用什么口径认定“上下游”。常见做法有三类可靠性和覆盖度差别很大。第一类是年报前五大供应商/客户披露。这是最扎实的来源因为上市公司年报“主要供应商”“主要客户”章节会列出采购额占比和销售额占比虽然很多公司只写“第一名”“第二名”不写名字但占比数据是硬信息。缺点是只有前五大覆盖不全而且部分公司只披露比例不披露名称需要靠企查查、天眼查或工商信息反推。第二类是关联交易公告与重大合同。这类数据能补上具体交易对手名称但只覆盖达到披露标准的交易小额协同创新根本进不来样本选择偏差明显。第三类是专利联合申请。这是判断“协同创新”最直接的证据——两家公司作为共同申请人出现在同一件专利上。常见做法是把上市公司及其子公司专利的共申请人提取出来再和供应商/客户名单做交集。我一般会把三类口径叠起来用前五大给关系骨架关联交易补名称专利联合申请标记“是否真协同”。这份 2013-2024 面板如果只给了关系对你一定要自己确认它有没有带专利字段否则“协同创新”四个字就落不了地。2.2 面板的三个核心字段组不管原始文件长什么样一份能用的供应链协同创新面板字段至少分三组。关系标识组股票代码、公司简称、年份、上游/下游角色、对手方名称或匿名编号、交易金额、占采购/销售比例。这组决定你能不能构造“供应商集中度”“客户集中度”这类变量。创新投入组研发支出、研发人员占比、专利申请数、专利授权数、联合申请专利数。注意专利要区分申请年和公开年用申请年更贴近创新发生时点。协同强度组这是衍生变量常见构造方式有——联合专利数取对数、交易金额占营收比、关系持续年数、双方研发投入的乘积或比值。协同强度怎么定义直接决定你后面回归系数怎么解释所以一定要在数据说明里写清楚。提示如果原始数据里对手方是匿名编号比如“供应商A”你没法做跨公司匹配只能做公司层面的集中度分析。想做配对研究必须要求带对手方股票代码或统一社会信用代码。2.3 为什么 2013 年是个合理起点2013 年前后有两个变化让这个起点站得住。一是创业板公司大量上市中小创新型企业进入样本供应链协同创新的观测对象变丰富二是专利数据从这一阶段开始电子化程度提高联合申请的可追溯性明显改善。再往前推年报供应商披露的规范性和专利数据完整性都会打折扣。所以 2013-2024 这个窗口做十二年的非平衡面板是合理的别硬往前延到 2008缺失值会让你清洗到怀疑人生。3. 把原始表拼成可回归面板的完整流程3.1 数据清洗先处理缺失和重复拿到数据第一步不是跑回归是看缺失和重复。供应链数据最典型的脏法是同一对公司同一年出现多条记录因为既有年报披露又有公告补充。处理原则同一关系对同一年保留交易金额最大的那条或者按来源优先级去重。import pandas as pd import numpy as np # 读取原始供应链关系表 df pd.read_excel(supply_chain_raw.xlsx) # 统一股票代码格式去掉后缀、补足6位 df[stock_code] df[stock_code].astype(str).str.zfill(6) # 标记来源优先级年报1公告2专利3 source_priority {年报: 1, 公告: 2, 专利: 3} df[priority] df[source].map(source_priority) # 同一公司-对手方-年份按优先级和金额去重 df df.sort_values([stock_code, partner_code, year, priority, amount], ascending[True, True, True, True, False]) df df.drop_duplicates(subset[stock_code, partner_code, year], keepfirst) # 缺失值处理交易金额缺失用行业中位数填充并打标记 df[amount_missing] df[amount].isna().astype(int) df[amount] df.groupby([year, industry])[amount].transform( lambda x: x.fillna(x.median()) ) print(df.shape) print(df[[stock_code, partner_code, year, amount, amount_missing]].head())这段代码做了四件事代码补位保证后续合并不出错来源优先级让年报数据优先按金额降序去重保留最大交易缺失金额用同行业同年度中位数填充并保留缺失标记。参数上zfill(6)是因为很多原始表把 000001 读成 1amount_missing这个标记变量别省回归时可以拿它做稳健性检验看填充是否影响结论。3.2 构造协同创新变量关系表干净之后下一步是构造协同强度。我一般用三个变量co_patent联合申请专利数加一取对数、trade_ratio交易金额占公司营收比、relation_duration关系持续年数。# 合并专利数据 patent pd.read_excel(patent_collab.xlsx) patent[stock_code] patent[stock_code].astype(str).str.zfill(6) patent[partner_code] patent[partner_code].astype(str).str.zfill(6) # 按公司-对手方-年份汇总联合专利数 patent_agg patent.groupby([stock_code, partner_code, year]).agg( co_patent(patent_id, nunique) ).reset_index() # 合并到主表 df df.merge(patent_agg, on[stock_code, partner_code, year], howleft) df[co_patent] df[co_patent].fillna(0) df[ln_co_patent] np.log1p(df[co_patent]) # 交易金额占营收比 df df.merge(fin[[stock_code, year, revenue]], on[stock_code, year], howleft) df[trade_ratio] df[amount] / df[revenue] # 关系持续年数按关系对累计出现年数 df df.sort_values([stock_code, partner_code, year]) df[relation_duration] df.groupby([stock_code, partner_code]).cumcount() 1 print(df[[stock_code, partner_code, year, ln_co_patent, trade_ratio, relation_duration]].describe())逻辑说明nunique统计专利去重数量避免同一专利多分类号重复计数log1p处理大量零值比直接取对数稳trade_ratio分母用营业收入注意单位统一金额是万元营收也是万元cumcount构造持续年数前提是数据按年排序且没有跳年。如果关系中间断过这个变量会高估持续年数严谨做法是按实际年份差判断连续性。参数上trade_ratio超过 1 的要检查可能是营收单位或金额单位不一致ln_co_patent的零值占比如果超过 90%说明联合专利太稀疏考虑改用“是否联合申请”的虚拟变量。3.3 合并财务与公司特征供应链协同创新不是孤立变量回归时必须控制公司规模、年龄、杠杆、盈利能力。合并财务数据用股票代码加年份做键注意财务数据是年度还是季度季度要转年度。# 财务数据年度化季度累加或取年末值 fin_annual fin.groupby([stock_code, year]).agg( revenue(revenue, sum), asset(asset, last), roa(roa, mean), leverage(leverage, last) ).reset_index() # 合并到供应链面板 panel df.merge(fin_annual, on[stock_code, year], howleft, suffixes(, _fin)) # 生成控制变量 panel[size] np.log(panel[asset]) panel[age] panel[year] - panel[ipo_year] panel[soe] (panel[ownership] 国有).astype(int) # 缩尾处理避免极端值主导回归 def winsorize(s, lower0.01, upper0.99): lo, hi s.quantile(lower), s.quantile(upper) return s.clip(lo, hi) for col in [trade_ratio, leverage, roa]: panel[col] winsorize(panel[col]) panel.to_parquet(supply_chain_panel.parquet) print(panel.shape)这里的关键是asset取年末值、revenue取全年累加别把流量和存量搞混。缩尾用 1% 和 99% 分位是公司金融里的常规操作能压住极端值。size、age、soe是最基本的控制变量如果做创新产出回归还要加研发投入和行业竞争度。注意合并后一定要检查样本量掉了多少。供应链关系表可能几十万行合并财务后如果只剩几千行说明股票代码或年份对不上先回去查键值格式别急着跑回归。4. 回归建模固定效应怎么设、标准误怎么聚4.1 基准模型设定研究供应链协同创新最常见的被解释变量是公司创新产出专利申请数或协同强度本身。基准模型一般长这样被解释变量对供应链协同变量回归控制公司特征加公司和年份固定效应。import statsmodels.formula.api as smf # 基准回归协同强度对创新产出的影响 model smf.ols( ln_patent ~ ln_co_patent trade_ratio relation_duration size age soe leverage roa C(year) C(industry), datapanel ).fit(cov_typecluster, cov_kwds{groups: panel[stock_code]}) print(model.summary())逻辑说明C(year)和C(industry)是年份和行业虚拟变量控制宏观冲击和行业差异标准误按公司聚类因为同一公司多年观测不独立。如果样本里公司-对手方配对多也可以按配对聚类但聚类层级越高越保守。参数上ln_patent是专利数加一取对数ln_co_patent是核心解释变量系数解释为联合专利每增加 1%创新产出变化多少trade_ratio衡量交易依赖度。注意多重共线性size和leverage相关性高时 VIF 会报警考虑删一个或做主成分。4.2 内生性与工具变量思路供应链协同和创新产出互为因果——协同创新多的公司本来就强不是协同导致创新。常见处理是找外生冲击比如上游行业的技术标准变化、下游客户的异地扩张或者用同行业同年度其他公司的平均协同强度做工具变量。# 构造行业-年度均值作为工具变量排除自身 panel[iv_coop] panel.groupby([industry, year])[ln_co_patent].transform( lambda x: (x.sum() - x) / (len(x) - 1) ) # 两阶段最小二乘 from linearmodels.iv import IV2SLS iv_model IV2SLS.from_formula( ln_patent ~ 1 trade_ratio relation_duration size age soe [ln_co_patent ~ iv_coop] C(year) C(industry), datapanel ).fit(cov_typeclustered, clusterspanel[stock_code]) print(iv_model.summary)工具变量的逻辑是同行业同年度其他公司的协同强度影响本公司协同相关性但不直接影响本公司创新产出外生性。外生性这个假设很难完全成立所以 IV 结果一般作为稳健性不作为主回归。第一阶段 F 值要大于 10否则弱工具变量问题会让系数有偏。4.3 异质性分析怎么做才有信息量全样本回归跑完审稿人一定会问“谁更受益”。常见分组维度产权性质国有 vs 民营、企业规模大小、行业技术密度高 vs 低、关系角色供应商 vs 客户。# 分产权性质回归 for name, sub in panel.groupby(soe): m smf.ols( ln_patent ~ ln_co_patent trade_ratio size age leverage roa C(year) C(industry), datasub ).fit(cov_typecluster, cov_kwds{groups: sub[stock_code]}) print(fSOE{name}, coef{m.params[ln_co_patent]:.4f}, fp{m.pvalues[ln_co_patent]:.4f}, N{int(m.nobs)})分组回归别只报系数要报组间系数差异是否显著。常见做法是引入交互项看交互项系数比分开跑两组更严谨。异质性分析的价值在于讲出机制——比如民营企业供应链协同的创新弹性更高可能是因为它们更依赖外部技术源。5. 这份数据最容易翻车的五个地方5.1 现象合并后样本量骤降九成原因股票代码格式不一致一边是“000001”一边是“1”或“000001.SZ”合并时全变缺失。解决合并前统一用六位字符串去掉交易所后缀用astype(str).str.zfill(6)处理合并后打印merge的indicator看匹配率。5.2 现象协同强度变量大量为零回归系数不显著原因联合专利本身稀疏2013-2024 里很多公司从未联合申请。解决改用“是否联合申请”虚拟变量或把协同定义放宽到“交易关系持续三年以上”再或者用交易金额占比作为主变量专利作为补充证据。5.3 现象固定效应加完后核心变量被吸收原因如果协同变量在公司层面几乎不变比如关系持续年数逐年递增加公司固定效应后变异被吸收系数估计不出来。解决改用随机效应或把不随时间变化的变量换成随时间变化的比率或做一阶差分。5.4 现象标准误聚错层级p 值假显著原因同一公司多年、同一关系对多年观测不独立。只在公司层面聚类可能不够如果对手方重复出现还要考虑双向聚类。解决用cov_typecluster按公司聚类稳健性检验里试按公司和年份双向聚类看结论是否稳定。5.5 现象2013 和 2024 两端数据质量差原因2013 年部分公司年报供应商披露不规范2024 年数据可能还没完整更新。解决做平衡面板子样本2015-2022做稳健性或者加年份固定效应后单独看两端年份的残差分布异常年份考虑截尾。提示清洗日志一定要留。每一步删了多少行、填充了多少值、缩尾截了多少观测写进附录。审稿人问起来你能说清楚样本怎么来的比系数漂亮更重要。6. 用事件研究法验证协同创新的真实效应前面都是年度面板回归但协同创新往往由具体事件触发——比如双方签订战略合作协议、联合实验室成立、共同中标大项目。想验证“协同创新是否真的带来创新产出提升”事件研究法比年度回归更有说服力。做法是把每个协同事件联合专利申请日、战略协议公告日作为事件日取事件前后各三年作为窗口看专利申请数的动态变化。核心是画事件时间图看处理组和控制组在事件前的平行趋势以及事件后的处理效应。# 构造事件时间虚拟变量 event panel[panel[event_year].notna()].copy() event[rel_year] event[year] - event[event_year] # 只保留事件前后三年 event event[(event[rel_year] -3) (event[rel_year] 3)] # 生成相对年份虚拟变量以事件前一年为基准 for y in range(-3, 4): if y ! -1: event[fd_{y}] (event[rel_year] y).astype(int) # 回归动态效应 formula ln_patent ~ .join([fd_{y} for y in range(-3, 4) if y ! -1]) \ size age soe leverage roa C(year) C(stock_code) event_model smf.ols(formula, dataevent).fit( cov_typecluster, cov_kwds{groups: event[stock_code]} ) print(event_model.summary())逻辑说明以事件前一年为基准组各相对年份虚拟变量的系数就是该年相对基准的效应。如果事件前系数不显著说明平行趋势成立事件后系数显著为正说明协同创新确实提升了创新产出。参数上窗口选前后三年是常见做法太长会混入其他冲击太短看不出动态。控制公司固定效应后识别来自公司内部时间变化。我自己的习惯是事件研究跑完一定手动检查事件日定义。联合专利申请日、公开日、授权日差好几年用错日期整个动态图就废了。另外控制组要选同行业同规模但没发生协同事件的公司否则时间趋势会污染结果。这套流程走下来从原始关系到可回归面板再到基准回归、异质性和事件研究基本能支撑一篇实证论文的核心表格。数据是死的口径和识别策略才是活的。我踩过最大的坑就是拿到数据直接跑回归结果被审稿人问“你的协同创新到底怎么定义”时答不上来。后来养成习惯先把变量定义和清洗日志写清楚再动模型。希望帮到你。本文还有配套的精品资源点击获取