第一章:季节性规律概述

商品期货的季节性特征

做跨期套利这么多年,我越来越觉得季节性是个好东西。说白了,商品期货的价格波动,很大程度上是跟着自然规律走的。你想想看,农产品什么时候播种、什么时候收获,能源品什么时候需求旺,这些都有固定的时间窗口。

我刚开始做套利那会儿,总觉得季节性就是个玄学。直到有一次,我在做豆粕的跨期套利时,发现每年6-8月价差总会走出一波规律性的行情。后来一查,原来是美豆种植季的天气炒作。嗯,从那以后,我再也不敢小看季节性了。

商品期货的季节性特征,主要分三类:

  • 生产季节性:农产品最典型。比如大豆,南美和北美轮流收割,供应量跟着季节走
  • 消费季节性:能源品最明显。冬天取暖用油,夏天开车用汽油,需求曲线一目了然
  • 库存季节性:这个我习惯看库存报告。库存高的时候,近月合约往往承压

核心观点:季节性不是预测价格涨跌,而是告诉你「什么时候该关注什么品种」。它是个概率工具,不是水晶球。

季节性指数的构建方法

光说季节性特征不够,得量化。我个人习惯用季节性指数来刻画这个规律。怎么构建?其实不复杂。

第一步:收集历史数据

至少5年以上的日度价格数据。我建议用主力连续合约,别用具体月份合约,不然换月跳空会把你搞疯。

第二步:计算每日价格变化

用对数收益率,这样数据更平稳。公式很简单:

r_t = ln(P_t / P_{t-1})

第三步:按日历日对齐

把每年的同一天放在一起。比如1月1日,2019、2020、2021...全部取出来,算个平均值。

第四步:累加得到季节性指数

从年初开始,把平均收益率累加起来。这样你就得到了一条从1月1日到12月31日的曲线。

实战技巧:我一般会剔除极端年份的数据。比如2020年疫情那波,原油跌到负值,这种异常值会严重扭曲季节性规律。我曾经吃过这个亏,后来学乖了。

下面是我用Python写的一个简单实现:

import pandas as pd
import numpy as np

def build_seasonal_index(price_data):
    # price_data: DataFrame, 索引为日期, 列为价格
    # 计算对数收益率
    returns = np.log(price_data / price_data.shift(1))
    
    # 提取月份-日信息
    returns['month_day'] = returns.index.strftime('%m-%d')
    
    # 按月份-日分组求平均
    seasonal_avg = returns.groupby('month_day')['close'].mean()
    
    # 累加得到季节性指数
    seasonal_index = seasonal_avg.cumsum()
    
    return seasonal_index

代码看着简单,但实际用的时候要注意几个坑。比如节假日跳空、非交易日对齐问题。我建议用交易日序号代替日历日,这样更准确。

如何识别季节性拐点

季节性指数做出来了,关键是怎么用。我个人最关注的是拐点——也就是季节性规律开始反转的位置。

识别拐点,我一般看三个信号:

  1. 斜率变化:季节性指数从上升转为下降,或者反过来。这个用一阶导数就能看出来
  2. 历史分位数:当前值处于历史同期的高位还是低位。如果到了90%分位数以上,反转概率大增
  3. 基本面验证:季节性信号出来了,还得看看基本面是否配合。比如库存是不是真的开始累库了

避坑指南:我曾经在2018年做螺纹钢的季节性套利,看到季节性指数显示9月要涨,结果一路做多一路亏。后来复盘发现,那年环保限产政策突然放松,季节性规律被政策面完全覆盖了。记住,季节性只是概率,不是铁律。

下面这张图是我自己常用的季节性分析框架:

季节性分析框架 历史价格数据 季节性指数构建 季节性曲线 拐点识别:斜率变化 + 历史分位数 + 基本面验证 套利策略决策:入场/出场/仓位管理 反馈优化

这个框架我用了好几年,核心逻辑就是:数据 → 指数 → 拐点 → 决策。每一步都有对应的量化方法,不是拍脑袋。

识别拐点的时候,我习惯用移动平均线来平滑季节性指数。比如用20日均线,当指数上穿均线时,说明季节性开始走强;下穿时,说明走弱。这个信号比单纯看指数本身更可靠。

一个小技巧:别只看一个品种的季节性。我一般会把相关品种放在一起看。比如做豆粕套利,同时看大豆和豆油的季节性。三者联动,信号更稳。

最后说一句,季节性分析不是万能药。它是个很好的起点,但绝不是终点。真正赚钱的套利策略,一定是季节性、基本面、技术面三者共振的结果。这个道理,我花了三年才真正想明白。

专注资料整理