库存周期的数据指标:如何获取和清洗这些数据?

做库存周期研究,最头疼的往往不是理论,而是数据。我刚开始接触这个领域时,光找数据就花了两周。后来发现,其实核心指标就那么几个,关键是知道去哪拿、怎么处理。

今天咱们就聊聊三个最关键的指标:工业企业产成品库存PMI库存指数OECD综合领先指标。嗯,这三个指标基本能覆盖库存周期的全貌。

一、工业企业产成品库存:最直接的库存数据

这个数据来自国家统计局,每月发布一次。它统计的是规模以上工业企业的产成品库存金额。说白了,就是工厂仓库里堆了多少货。

数据来源:国家统计局官网 → 月度数据 → 工业 → 产成品库存

频率:月度,每月27日左右发布上月数据

单位:亿元(累计值)

获取方式其实很简单。我个人习惯用Python直接爬取,但如果你不熟悉编程,手动下载Excel也行。

# 我常用的爬取代码
import requests
import pandas as pd

# 国家统计局API接口(示例)
url = "https://data.stats.gov.cn/easyquery.htm"
params = {
    "m": "QueryData",
    "dbcode": "fsnd",
    "rowcode": "zb",
    "colcode": "sj",
    "wds": "[]",
    "dfwds": '[{"wdcode":"zb","valuecode":"A0E0F01"}]'
}

response = requests.get(url, params=params)
data = response.json()
df = pd.DataFrame(data['data'])
print(df.head())

注意:统计局的数据有时会修订。我曾经因为用了修订前的数据,导致模型回测结果完全不对。建议每次发布新数据时,把历史数据也重新拉一遍。

二、PMI库存指数:领先的先行指标

PMI库存指数分两个:原材料库存产成品库存。这两个指标很有意思,它们能提前1-2个月反映库存周期的拐点。

为什么会这样?因为PMI是调查数据,企业采购经理凭感觉填的。你想想看,当企业开始减少原材料采购时,往往意味着他们预感到需求要下滑了。这种"感觉"虽然主观,但统计上确实有效。

指标 含义 领先性
原材料库存 企业采购的原材料库存水平 领先2-3个月
产成品库存 企业生产完成待销售的产品 同步或滞后1个月

我的经验:当原材料库存快速下降,而产成品库存还在高位时,说明企业正在主动去库存。这时候往往是周期底部附近,可以考虑布局了。

获取PMI数据,我推荐两个渠道:

  • 中国物流与采购联合会:每月1日发布官方PMI
  • 财新PMI:更偏向中小企业,有时与官方数据有差异
# 财新PMI数据获取示例
import pandas as pd
import requests

# 使用第三方数据平台API
url = "https://api.xxx.com/pmi/caixin"
params = {
    "start_date": "2010-01",
    "end_date": "2024-12",
    "indicator": "finished_goods_inventory"
}

response = requests.get(url, params=params)
data = response.json()
df = pd.DataFrame(data['data'])
# 清洗:处理缺失值
df = df.fillna(method='ffill')  # 前向填充
print(df.tail())

三、OECD综合领先指标:全球视角

做库存周期研究,不能只看国内。全球需求变化会通过出口传导到国内。OECD综合领先指标(CLI)就是用来捕捉这种全球周期的。

这个指标由OECD编制,覆盖了33个成员国。它通过工业产出、订单、消费者信心等数据合成,能提前6-9个月预测经济拐点。

数据特点:

  • 月度数据,每月10日左右发布
  • 标准化为100,大于100表示扩张,小于100表示收缩
  • 有趋势恢复版本(振幅调整)和原始版本

获取方式:

# OECD数据获取
import pandas as pd
from oecd import OECD  # 假设有封装好的库

# 初始化客户端
client = OECD()
data = client.get_dataset(
    dataset_id="MEI_CLI",
    filter_dict={
        "LOCATION": "G7",  # 七国集团
        "SUBJECT": "CLI",  # 综合领先指标
        "FREQUENCY": "M"   # 月度
    }
)

# 清洗:去除季节性波动
from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(data['Value'], model='additive', period=12)
data['Value_SA'] = data['Value'] - result.seasonal  # 季节调整
print(data.head())

避坑指南:我曾经直接用OECD的原始数据做模型,结果发现指标总是滞后。后来才明白,OECD发布的数据是经过多次修订的。建议使用实时版本(real-time data),而不是最新修订版。这样模拟出来的交易信号才真实。

四、数据清洗的通用流程

不管从哪拿数据,清洗步骤都差不多。我总结了一套标准流程:

  1. 缺失值处理:用前向填充或插值法
  2. 异常值检测:3倍标准差法或IQR法
  3. 季节调整:X-13ARIMA-SEATS或移动平均
  4. 标准化:Z-score或Min-Max
  5. 对齐时间戳:统一到月末或月初
# 完整的清洗函数
def clean_inventory_data(df, method='forward'):
    """
    库存数据清洗函数
    """
    # 1. 缺失值处理
    if method == 'forward':
        df = df.fillna(method='ffill')
    elif method == 'interpolate':
        df = df.interpolate()
    
    # 2. 异常值处理(3倍标准差)
    mean = df['value'].mean()
    std = df['value'].std()
    df['value'] = df['value'].clip(mean - 3*std, mean + 3*std)
    
    # 3. 计算同比变化率(库存周期常用)
    df['yoy'] = df['value'].pct_change(12) * 100
    
    return df

# 使用示例
df_clean = clean_inventory_data(df_raw, method='interpolate')
print(df_clean.describe())

五、三个指标的联动关系

这三个指标不是孤立的。我画了一张图,帮你理解它们之间的关系:

库存周期数据指标联动关系图 工业企业产成品库存 滞后指标 PMI库存指数 同步/领先指标 OECD综合领先指标 领先指标 验证 驱动 核心逻辑: 1. OECD领先指标 → 预示全球需求变化 2. PMI库存指数 → 反映企业预期调整 3. 产成品库存 → 确认周期拐点

你看,这三个指标形成了一个验证链条。我个人习惯先用OECD指标判断大方向,再用PMI库存指数找拐点,最后用产成品库存数据确认。这样能大大减少误判。

实战技巧:当OECD指标连续3个月上升,同时PMI原材料库存开始回升,而产成品库存还在下降时,这就是经典的"被动去库存"阶段,往往是周期底部。我2019年底就用这个信号成功捕捉到了2020年的库存周期反转。

好了,数据获取和清洗就讲到这里。记住,数据质量决定了研究质量。花时间把数据弄干净,后面建模会省很多事。

专注资料整理