如果你做过ESG研究、写过双碳相关的行业报告,或者单纯对碳市场的价格波动好奇,那“北京碳排放交易所碳交易数据”大概率是你绕不开的一份原料。我刚拿到这类数据时有点懵:名义上是“交易数据”,但它的形态和股票日线数据完全不同,成交量稀疏、价格有平台报价和大宗成交之分,更别提不同数据产品里字段口径还不一致。这篇东西就围绕我和北京碳市场行情数据打交道的过程展开,讲清楚拿到数据之后该怎么理解、怎么清洗、怎么从中抠出真正有用的信息。适合刚接触碳交易数据、想用它做论文或行业分析的读者,也可以作为一份“拿数据就能上手”的参考笔记。
1. 先搞清楚北京碳市场在交易什么——这直接决定你怎么理解数据
1.1 市场里不只有配额,还有一类叫 CCER 的产品
碳交易所的正式名称一眼看过去会让人想当然:碳交易所,交易的是“碳”?其实交易的是两类标准化合约:一类是碳排放配额,北京市场里通常简称为BEA或者直接叫碳排放配额;另一类是中国核证自愿减排量,行业里简写为CCER。配额是政府给重点排放单位发的排放许可,每年年末或次年初,控排企业需要交出与实际排放量等量的配额完成清缴。如果实际排放超出配额,企业就得去市场上买;如果配额有富余,则可以卖出获利。简单说,配额交易解决的是“怎么分配排放成本”的问题。
CCER的逻辑稍有不同。它来自自愿减排项目,比如风电、光伏、林业碳汇这类,项目方通过审定和核证后产生减排量,可以卖给控排企业用于抵消一部分排放。北京碳市场里,这两类品种在同一个交易所挂牌,但价格走势、成交活跃度和参与主体都有差异。以“CnOpenData 北京碳排放交易所碳交易数据”这类数据集为例,一般会包括交易日期、品种、开盘价、收盘价或成交均价、成交量、成交额等字段。但问题是,不同数据产品对字段的处理方式不一样,有的把碳配额和CCER放在同一张表里用product字段区分,有的会分成两个文件。
我看到过很多初次接触碳数据的同学,拿到数据后直接对“价格”一列做全序列分析,完全没发现价格序列混杂了两类品种。这在碳市场研究里是大忌。配额市场和CCER市场是两个相对独立的价格发现场所,人为因素、政策因素和供求结构各不相同。极端情况下,两者的价格水平可以相差一倍以上。第一步要做的是按品种把数据拆开,不要混在一起分析。
1.2 数据产品解决的核心问题:把散落在一级市场公告里的信息变成结构化长表
北京碳市场的官方交易信息发布渠道,从交易所网站到地方主管机构公告,再到各类研究机构转载,信息散布得相当零散。官网会给每日行情,但要逐日复制成Excel再汇总,时间成本极其可观。有些第三方数据平台会把历史行情按照统一schema整理好,字段包括date、product、open、high、low、close、volume、amount之类,这会节省大量时间。但这里有一个常见的、代价不低的误读:结构化交易数据本身只是“结果”,不代表完整因果。你拿到的只是市场交易层面信息,并不包含背后的配额分配方案、企业履约进度、具体买卖方身份等关键上下文。
从数据产品的角度,我最常用到的字段组合是“成交均价”和“成交量”。碳市场里开盘价、最高价、最低价有时并不重要。北京碳市场早期流动性不高,价格很容易被一两笔小额成交拉出一个很夸张的“最高价”“最低价”,用收盘价或者日成交均价更稳定。不过,日成交均价也有自身问题,我在下一个部分展开。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 拿到数据后先别急着画图:三个高频坑和处理顺序
2.1 坑一:零成交日与缺数日的区分
碳市场与股票市场的一大差异是成交稀疏。北京碳市场某些交易日可能全天没有任何成交,交易所公告会显示“无成交”。第三方数据产品在处理这些日期的时候,往往直接用NaN或者干脆把那一行删掉。直接删掉数据行会让时间轴“看起来连续,其实少了很多天”;用NaN则相对可接受,但在做滚动均值时会留下空洞。更好的做法是:先自己生成一个从起始日到结束日的完整交易日历(把周末和法定节假日排除),然后左连接行情数据,缺失部分主动标记为“无成交”,而不是简单当作错误数据删除。
处理订单应该是:建立完整日期索引,去掉非交易日,再合并成交数据。这一步看起来很基础,但影响后续所有滚动窗口计算。如果漏了“把缺失日显式补上”这个动作,后面做滚动相关性时就会错位,两列数据来自不同日期,结果面目全非。
2.2 坑二:成交均价与收盘价的差异
整理碳市场数据时,最容易被忽略的口径问题是价格类型。在股票市场里,“收盘价”是每天最后一场交易的成交价,但在碳市场里,相当一部分第三方数据给出的价格是“当日成交均价”,算法是当日总成交额除以总成交量。同样是日度行情,成交均价和收盘价可能差很多。尤其当一天里既有一笔高价小单,又有一笔低价大单时,两种价格几乎会给出完全不同的信号。研究碳价走势前应当确认:你手里的price到底是哪种口径,全部历史数据是否统一使用同一口径。如果数据源混合了两种口径,后面所有的收益计算都会失真。
需要说明的是,常见的做法是用成交量加权平均价来代表“当天的市场价格”,部分交易所自营统计里就采用这种方式。较真一点的分析者,可以尝试用成交额除以成交量反向验证这个价格是否为加权平均价。如果数据集里同时给出amount和volume,这个验证可以在几行代码内完成。反向验证看起来有点多余,但数据整理里这种“用另一个字段反推某个字段是否成立”的习惯,能帮你识别不少平台导出时产生的精度问题。
2.3 坑三:配额和CCER搅在一起
前文提到的品种混用问题会在这里重新出现。因为不少数据产品为了让用户使用方便,把BEA和CCER放在一张表内,仅用“product”字段区分。如果做数据透视时没有对product做过滤,成交量和成交额都会变成“混合总量”,价格更是变成毫无意义的平均数。实践中最稳妥的做法是拆分为两个DataFrame,后续按需要再合并。常规操作的示例代码大致如下,实际字段名需要参考你手上的数据:
python复制import pandas as pd
df = pd.read_csv("beijing_carbon.csv", parse_dates=["date"])
bea = df[df["product"] == "BEA"].copy()
ccer = df[df["product"] == "CCER"].copy()
bea["date"] = pd.to_datetime(bea["date"])
bea = bea.set_index("date").sort_index()
# 生成完整的交易日历,这里以工作日近似,之后再剔除交易所休市日
all_days = pd.date_range(start=bea.index.min(), end=bea.index.max(), freq="B")
bea = bea.reindex(all_days).rename_axis("date")
# 成交量为0或缺失时,均价没有意义,统一填充为NaN
bea.loc[bea["volume"] <= 0, "price"] = pd.NA
2.4 零成交日背后的业务含义
处理完缺失价之后,还要再考虑一层:连续多日零成交并不只是技术问题,它本身就有经济含义。流动性极度匮乏说明市场定价功能弱,价格可能一直停留在上一笔成交价格上。分析时如果继续沿用“价格连续”的假设,会高估价格信息含量。比较朴素但有效的处理方式是做“有效成交日”分析:只在有成交的日期之间计算涨跌幅,用“交易间隔天数”作为一个额外的解释变量。我在一次分析中发现,北京碳市场价格跳空幅度与距离上一笔成交的时间成正比,这个结论只有把零成交日显式保留下来才能得到。
3. 把日历叠在价格曲线上:履约期的量价脉冲怎么找
3.1 清缴节奏是碳市场量价关系的核心驱动器
股票市场看季报、看宏观数据,碳市场的核心时间锚则是配额清缴截止日。控排企业如果配额不足,需要在此之前购入并上缴;配额富余的企业则会择机卖出。理论上,越临近清缴截止日,有缺口企业的买方需求越刚性,价格与成交量大概率同向上升。实践中的北京碳市场数据也能看到类似迹象。不过,要注意年度间存在差异:有些年份市场提前交易,有些年份拖到最后一个月才放量。只盯着最后一个月的“冲刺”还不够,需要观察“履约窗口期”前的三到六个月。
实操层面,建议在数据集里增加几个时间特征字段,比如“距上次履约截止日天数”“履约状态标记”,然后分年度画出量价时间序列。比较理想的可视化是:纵轴左轴为价格、右轴为成交量,将每年的清缴截止日画成一条竖线。这个方法不复杂,但能让你很直观地看出“每年放量的时段是否随清缴日期变化”。如果你只是拿到价格曲线做简单回归,这个过程会完全缺失。
3.2 北京碳价长期高企的机制,数据里能看出什么
北京配额价格在试点市场里经常偏高,原因很复杂。其中一个可以定量观察的点是:北京配额市场从一开始就设置了较严格的竞拍/回购机制,而且市场参与者中有一批实力较强、持配额偏谨慎的排放单位。在数据上表现为:价格下跌空间有限、成交稀疏时价格也能维持高位。分析时不要轻易用“价格均值回归”的假设。至少在做单位根或均值回归检验时,要留意市场制度变化带来的结构断点。最典型的断点是配额分配方案调整,比如部分年份配额收紧,价格从低位直接跳到另一个区间。
处理这种结构变化,常规t检验并不适用,建议先用可视化和滚动均值检查是否存在明显的“台阶式”抬升。一旦发现价格存在台阶,后续建模就要么分段处理,要么加结构断点变量。在没有官方断点清单的情况下,也可以使用时间序列结构突变检测方法,比如Chow检验或Bai-Perron方法,不同方法给出的断点位置可能不同,建议再参照当年的市场事件做人工复核。
3.3 大宗交易与挂牌交易的价格差:别被单一价格骗了
北京碳市场存在几种不同的交易方式。挂牌交易相当于连续竞价,流动性相对好;大宗交易则适合大额持仓划转,协议性更强,成交价可能与公开挂牌价有明显偏离。如果数据结构给你的是“当天所有交易的综合均价”,那一笔大宗低价交易也可能把当天均价拉低,得出“价格暴跌”的错误结论。我见过的数据产品里,有的会提供交易方式字段,有的不会。能拿到明细最好,拿不到时至少需要检验一下价格序列中的极端值是否由低成交量造成。
识别方法是计算每吨成交金额与成交量的关系,如果某日成交量异常大而均价明显偏离前后几日,大概率是包含了大宗交易。遇到这种情况,谨慎的做法是把当日标记为“异常交易日”,在稳健性检验里剔除该日,看看结论是否仍然成立。数据清洗和数据分析之间没有清晰边界,这一类处理本质上就是分析的一部分。
4. 从一份行情表到研究结论:四条可落地的分析路径
4.1 路径一:碳价与能源价格的联动
碳市场研究里比较成熟的方向是碳价与能源价格的联动。逻辑链条很清楚:天然气和煤炭价格影响企业发电成本,进而影响企业履约方式,最终传导到碳配额需求。实际操作时把碳价和动力煤期货、天然气价格放在一起做相关性分析即可。然而有几个细节需要注意:第一,时间对齐问题,能源期货有夜盘,碳市场没有,直接取“日期”一致的数据会产生时间错位;第二,碳价数据本身是稀疏成交的,而能源价格是连续的,处理方法上需要对碳价做“前向填充”,或者只保留碳市场有成交的日期。忽略这两点做出的相关性可能只是噪声。
4.2 路径二:市场流动性的动态刻画
没有成交时价格停留在旧值,不代表市场价值没变。衡量碳市场流动性,常用指标是“成交量”和“成交额”本身,也可以用Amihud非流动性指标,即日收益率绝对值除以日成交额,该指标越高,说明单位成交额对价格冲击越大,市场越缺乏深度。用这份数据算Amihud指标时,需要先剔除零成交日。流动性指标本身也值得作为被解释变量研究,因为碳市场很多政策目标与流动性相关:没有流动性的碳价,价格信号对企业决策的引导作用就会大打折扣。
4.3 路径三:配额与CCER的相对价差
当市场允许控排企业使用CCER抵消配额时,CCER和配额之间存在替代关系。从数据中观察到的现象是:当配额价格走高,CCER价格往往跟着走高,但两者比值会显著波动;当配额供给相对宽松或CCER抵消政策发生变化时,价差会迅速收窄。利用同一数据源把两类品种按同一时间轴画出来,可以量化这种替代关系的动态变化。由于两类品种的交易日不完全同步,需要做多品种时间序列的联合处理,常见做法是取两者都有成交的日期子集,或者用last observation carried forward填充。
4.4 路径四:用数据理解政策事件的冲击——但别滥用
碳市场是政策驱动极强的市场。拿到数据后最常被问的问题就是:“某个法规出台对碳价有没有影响?”事件研究法可以做,但对碳市场要格外谨慎。股票市场的事件研究法建立在连续交易和有效市场假设上,而碳市场交易的稀疏性意味着价格无法在事件发生后立即反映信息,事件窗口需要拉长到数周甚至数月。如果事件公告日和最后交易日隔着很多天,按“交易日”计算的事件窗口长度与自然日长度之间差异会很大。所以做事件研究时建议同时报告自然日窗口和交易日窗口的结果,防止结论被时间口径牵着走。
5. 数据源的边界与复用:关于CnOpenData这类数据产品要心里有数
5.1 数据产品与官方原始披露的差异
使用CnOpenData这类平台的北京碳排放交易所碳交易数据时,最好把它理解为“整理过的官方数据”,官方发布仍是第一手来源。平台的价值是统一字段、补全历史、定期更新。但整理过程本身会夹带数据处理者的判断,比如处理停牌日、处理零成交、四舍五入价格,以及选择价格口径。我在拿到一份第三方整理的碳数据后,通常抽最近三到五天的数据,去交易所官网找到对应日期的公告逐字核对,这个动作耗时不超过半小时,却足以帮你搞清数据质量和可能的口径偏差。数据平台的“可复现性”依赖这个过程。
5.2 自建数据字典与版本管理
碳市场数据会随制度调整而修订,部分历史数据可能因新规则发生口径变化。第三方的更新可能不是简单新增行,也可能修改历史值。如果你的研究依赖于一个特定时点的数据快照,建议把下载的数据连同下载日期、来源版本保存下来,并在论文或报告里注明数据获取日期。不少研究在复现阶段出问题,不是方法错,而是无法确认原始数据版本。数据整理阶段就维护一个data dictionary,把每个字段的原始含义、数据类型、缺失比例记下来。这个做法看起来很笨,但它保证你在项目过了一个月后还能自信地回到分析里。
5.3 碳数据能不能“预测”碳价:一些现实预期
最后说一点容易被营销号带偏的事。市面上很多介绍碳价预测的内容,动不动就用机器学习模型预测下一日碳价,回测结果极其完美。现实中,因为碳市场流动性低、政策事件难以结构化,基于纯价格序列的预测上限很低;加入能源价格、温度、履约进度等变量会提升模型表现,但很难把预测误差压到可以做高频交易的水平。对大多数研究和企业碳资产管理决策来说,关注“价格区间”和“关键政策节点”比“预测精确到小数点后两位”更有价值。碳价预测的核心价值是帮助企业决定在什么价格区间内完成履约采购,而非赚取交易价差。
5.4 实际处理碳数据最容易被低估的一步
如果要在这篇内容里留一个最想强调的经验:数据下载之后的第一个小时,别建模,先做描述性统计。每个字段的缺失比例、取值范围、时间跨度、按年分组的成交天数,这些看起来朴素到不值得写进论文的统计量,其实最能暴露数据问题。我曾经因为在开头少做这一步,用一份混入CCER的历史数据跑了三天回归,换了几十组参数,直到第四天才发现product字段里混着两个品种。碳市场数据本来就稀疏,任何一个小口径问题都会被时间序列模型放大。这些环节虽然没有建模听起来有技术含量,但绝大部分所谓“奇怪的实证结论”都源自数据阶段埋下的隐患。
