库存周期的数据指标:如何获取和清洗这些数据?
做库存周期研究,最头疼的往往不是理论,而是数据。我刚开始接触这个领域时,光找数据就花了两周。后来发现,其实核心指标就那么几个,关键是知道去哪拿、怎么处理。
今天咱们就聊聊三个最关键的指标:工业企业产成品库存、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),而不是最新修订版。这样模拟出来的交易信号才真实。
四、数据清洗的通用流程
不管从哪拿数据,清洗步骤都差不多。我总结了一套标准流程:
- 缺失值处理:用前向填充或插值法
- 异常值检测:3倍标准差法或IQR法
- 季节调整:X-13ARIMA-SEATS或移动平均
- 标准化:Z-score或Min-Max
- 对齐时间戳:统一到月末或月初
# 完整的清洗函数
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())
五、三个指标的联动关系
这三个指标不是孤立的。我画了一张图,帮你理解它们之间的关系:
你看,这三个指标形成了一个验证链条。我个人习惯先用OECD指标判断大方向,再用PMI库存指数找拐点,最后用产成品库存数据确认。这样能大大减少误判。
实战技巧:当OECD指标连续3个月上升,同时PMI原材料库存开始回升,而产成品库存还在下降时,这就是经典的"被动去库存"阶段,往往是周期底部。我2019年底就用这个信号成功捕捉到了2020年的库存周期反转。
好了,数据获取和清洗就讲到这里。记住,数据质量决定了研究质量。花时间把数据弄干净,后面建模会省很多事。