跳到主要内容

OHLCV 数据结构与 pandas 时间序列

直觉

金融行情最标准的数据结构是 OHLCV:每个时间点一行,含「开盘、最高、最低、收盘、成交量」。pandasDatetimeIndex 处理这类「按时间排好序」的数据非常顺手——这一节把它的基本操作过一遍。

OHLCV 含义

含义
open开盘价
high区间最高价
low区间最低价
close收盘价(最常用)
volume成交量

内置 spy_daily.csv 就是标准 OHLCV(外加前复权 adj_close),前几行长这样:

/data/spy_daily.csv

pandas 时间序列三板斧

  1. 解析日期 + 设为索引pd.read_csv(..., parse_dates=['date']).set_index('date')
  2. 按时间切片df.loc['2020':'2021'] 直接按年份取;
  3. 重采样:把高频聚合成低频(如日→周),用 .resample(...) + 聚合函数。

把日 OHLCV 聚合到周

把一周内若干交易日的「开高低收量」合成一根周 K:

周开=首日开, 周高=max日高, 周低=min日低, 周收=末日收, 周量=日量\text{周开}=\text{首日开},\ \text{周高}=\max\text{日高},\ \text{周低}=\min\text{日低},\ \text{周收}=\text{末日收},\ \text{周量}=\sum\text{日量}

可运行案例:从日 K 合成周 K

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv('/data/spy_daily.csv', parse_dates=['date']).set_index('date')

# 按时间切片示例:只取 2020 年
df_2020 = df.loc['2020']
print("2020 年交易日数:", len(df_2020))
print(df_2020.head(3).round(2))

# 日 K → 周 K 的标准聚合规则
weekly = df.resample('W').agg({
  'open': 'first', 'high': 'max', 'low': 'min',
  'close': 'last', 'volume': 'sum'
}).dropna()
print("\n合成周 K 行数:", len(weekly))

plt.figure(figsize=(9, 3.6))
plt.plot(df_2020.index, df_2020['close'], color="#2563eb", lw=1, label="日收盘")
weekly_2020 = weekly.loc['2020']
plt.plot(weekly_2020.index, weekly_2020['close'], color="crimson",
       lw=0, marker='o', ms=3, label="周末收盘")
plt.title("日收盘 vs 周收盘(2020)"); plt.xlabel("日期"); plt.ylabel("价格")
plt.legend(); plt.tight_layout(); plt.show()

小结

  • OHLCV 是行情的标准五列;
  • pandas:解析日期→设索引→按时间切片→.resample().agg() 聚合;
  • 周K 聚合规则:开=first、高=max、低=min、收=last、量=sum。

下一节处理数据里最烦人的部分:缺失、复权、异常值