4. 金融时间序列特征:OHLCV数据解读、复权处理、成交量分析、时间序列可视化
各位同学,咱们今天聊点实在的。做量化择时,尤其是用LSTM这种深度学习模型,你喂进去的数据质量,直接决定了模型是“神算子”还是“算命先生”。我个人习惯,拿到任何金融数据,第一件事不是跑模型,而是先把它“盘”一遍——理解它的结构、清洗它的杂质、感受它的波动。
说白了,金融时间序列就是市场的“心电图”。OHLCV就是最基础的那几个导联。咱们一个一个来看。
4.1 OHLCV数据:市场的四维快照
OHLCV,全称是Open, High, Low, Close, Volume。中文叫开盘价、最高价、最低价、收盘价、成交量。这五个字段,构成了我们分析市场的最基本单元。
你想想看,每一根K线,其实就是这五个数字的“合影”。
- 开盘价(Open):多空双方在单位时间开始时的“起跑线”。
- 最高价(High):多头当天最猛烈的冲锋位置,也是空头的“高压线”。
- 最低价(Low):空头砸盘的极限,多头的“底线”。
- 收盘价(Close):最重要的一个。市场经过一天博弈后的“最终共识”。LSTM模型里,收盘价通常是我们预测的核心目标。
- 成交量(Volume):市场的“燃料”。没有成交量的价格变动,就像没有观众的独角戏。
核心观点: 在量化择时中,收盘价是“果”,成交量是“因”。LSTM模型不仅要学习价格路径,更要学习成交量背后的“资金态度”。
我在项目中遇到过,有人直接把原始OHLCV数据扔进LSTM,结果模型学了一堆“噪音”。为什么?因为不同股票的价格量级差太多——茅台2000块,农业银行3块钱,模型根本没法统一处理。所以,数据标准化是必须的。
4.2 复权处理:别让分红“骗”了你的模型
嗯,这里要注意。股票会分红、送股、配股。这些事件会导致价格出现“断崖式”下跌或跳空。比如一只股票100块,每10股派10元,除息日开盘价就变成了99块。如果你用原始数据训练LSTM,模型会以为“跌了1%”,其实你账户里的钱一分没少。
这就是复权处理要解决的问题。主要有两种方式:
| 复权类型 | 计算方法 | 适用场景 |
|---|---|---|
| 前复权 | 调整历史价格,使当前价格不变。历史价格按比例缩小。 | 看当前价格是否合理,做技术分析常用。 |
| 后复权 | 调整当前价格,使历史价格不变。当前价格被放大。 | 看股票真实涨幅,长期投资分析常用。 |
我的建议: 做LSTM择时,我个人习惯用前复权数据。因为模型预测的是“未来”,而前复权保证了“当前”的价格是真实的。后复权会让当前价格变得很大,模型训练时容易梯度爆炸。
我曾经踩过一个坑:用后复权数据训练模型,结果模型预测出的买卖点全是错的。后来一查,后复权把茅台的价格变成了几万块,模型直接懵了。从那以后,我每次拿到数据,第一件事就是检查复权方式。
4.3 成交量分析:价格的“燃料”与“刹车”
成交量,很多人只看个热闹。但在量化里,它是判断趋势“真伪”的关键。
- 价涨量增:健康的上涨,资金在持续流入。
- 价涨量缩:上涨乏力,可能是“诱多”。
- 价跌量增:恐慌性抛售,也可能是“洗盘”。
- 价跌量缩:下跌动能衰竭,可能见底。
在LSTM模型中,我通常会把成交量作为一个独立的特征输入,而不是简单地和价格拼在一起。为什么?因为成交量的分布和价格完全不同——价格是相对平稳的,成交量却经常出现“尖峰”(比如开盘、收盘、突发消息)。
我常用的处理方式是:对成交量做对数变换,或者计算成交量移动平均比(当前成交量 / 过去N日均量)。这样能有效平滑极端值。
# 示例:成交量对数变换
import numpy as np
import pandas as pd
df['volume_log'] = np.log(df['volume'] + 1) # 加1防止log(0)
# 示例:成交量相对强弱
df['volume_ratio'] = df['volume'] / df['volume'].rolling(20).mean()
注意: 千万不要把原始成交量直接喂给LSTM。不同股票的成交量量级差异巨大(茅台一天几十亿,小盘股几千万),模型会优先学习“量级”而不是“模式”。一定要做标准化或归一化。
4.4 时间序列可视化:用眼睛“感受”数据
做量化,我有个习惯:先画图,再建模。可视化不是给老板看的,是给自己看的。它能帮你发现数据中的“异常点”和“模式”。
比如,你画个收盘价曲线,一眼就能看出有没有“跳空缺口”、有没有“长期停牌”、有没有“数据缺失”。这些在表格里很难发现。
下面这张图,是我用SVG画的一个典型金融时间序列结构图。它展示了OHLCV数据如何一步步变成LSTM的输入特征。
你看,从原始数据到LSTM输入,中间要经过好几道“关卡”。每一关处理不好,模型效果都会打折扣。
我个人常用的可视化工具是matplotlib和plotly。对于快速检查,我会画一个四合一图:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
fig, axes = plt.subplots(4, 1, figsize=(12, 10), sharex=True)
# 1. 收盘价
axes[0].plot(df.index, df['close'], color='#4A90D9', linewidth=1)
axes[0].set_ylabel('Close Price')
axes[0].grid(True, alpha=0.3)
# 2. 成交量
axes[1].bar(df.index, df['volume'], color='#FF9800', width=0.8)
axes[1].set_ylabel('Volume')
axes[1].grid(True, alpha=0.3)
# 3. 对数成交量
axes[2].plot(df.index, df['volume_log'], color='#4CAF50', linewidth=1)
axes[2].set_ylabel('Log Volume')
axes[2].grid(True, alpha=0.3)
# 4. 成交量比率
axes[3].plot(df.index, df['volume_ratio'], color='#E91E63', linewidth=1)
axes[3].axhline(y=1.0, color='gray', linestyle='--', alpha=0.5)
axes[3].set_ylabel('Volume Ratio')
axes[3].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
一个小技巧: 画图时,把成交量异常放大的日子标记出来。比如成交量超过过去60日均量的3倍,用红点标在价格图上。这些日子往往是“变盘”的前兆。LSTM如果能学到这个模式,择时准确率会明显提升。
好了,这一章的内容就到这里。记住:数据是模型的“食物”,你给它吃什么,它就长成什么样。把OHLCV理解透、把复权处理好、把成交量分析到位、把可视化做扎实——你的LSTM模型,就已经赢在了起跑线上。