从行情下载到收益率分析,中间至少隔着一次完整的数据校验。交易日缺失可能来自周末、节假日或停牌,价格突然跳变也可能是分红除权,而不一定是市场真实波动。
我做历史行情分析时,会先确认数据连续性和复权方式,再按证券代码分别计算收益率,避免把代码切换或日期错位当成行情变化。
先确定需要哪种行情数据
股票行情数据按时间粒度,大致可以分成三类。
- 日线数据:一行对应一个交易日,适合研究长期走势、收益率和波动率,也是最容易整理成 CSV 的类型。
- 分钟数据:常见粒度包括 1 分钟、5 分钟和 30 分钟,文件体积明显更大,对接口频率和存储要求也更高。
- 逐笔数据:记录成交或委托变化,数据量最大,通常还涉及单独的数据授权。
如果只是练习 pandas、回测基础指标或者制作行情图,我建议先从日线数据开始。直接上分钟线,很容易把时间花在下载失败和字段清洗上。
CSV 文件至少保留哪些字段
一份可以继续分析的日线 CSV,建议保留以下字段:
| 字段 | 含义 | 注意事项 |
|---|---|---|
| symbol | 证券代码 | 建议同时保留市场标识 |
| trade_date | 交易日期 | 统一为 YYYY-MM-DD |
| open | 开盘价 | 明确是否复权 |
| high | 最高价 | 应不低于开盘价和收盘价 |
| low | 最低价 | 应不高于开盘价和收盘价 |
| close | 收盘价 | 计算收益率的基础字段 |
| volume | 成交量 | 注意“股”“手”等单位差异 |
| amount | 成交额 | 确认币种和单位 |
| adj_factor | 复权因子 | 做长期序列时建议保留 |
文件名里最好也写清楚市场、周期和日期范围,例如:
cn_stock_daily_2025-01-01_2025-12-31.csv
半年后再打开文件,光看名字就能知道里面是什么,省得重新猜。
行情采集最常见的几个坑
第一个坑是复权口径混用。同一只股票的原始收盘价、前复权价和后复权价不能直接拼接。遇到分红、拆股等情况,错误的价格序列会产生一个并不存在的暴涨或暴跌。
第二个坑是交易日不连续。周末、节假日、停牌都可能导致日期缺口,不能看到日期缺失就自动补价格。是否填充,要看后续指标的计算方式。
第三个坑是证券代码被表格软件改写。以零开头的代码导入 Excel 后,可能被当成整数。保存 CSV 时,我一般把代码列明确设为字符串。
还有一个容易被忽略的问题是接口限频。批量采集几千个代码时,不要只盯着请求速度。设置合理间隔、失败重试和断点记录,往往比开大量并发更稳。如果采集公开网页,还要遵守网站条款,不绕过登录、验证码和付费授权。
我会怎样整理下载后的 CSV
拿到原始文件后,我通常先做一次标准化:
import pandas as pd
df = pd.read_csv("raw_quotes.csv", dtype={
"symbol": str})
df["trade_date"] = pd.to_datetime(
df["trade_date"],
errors="coerce"
)
price_cols = ["open", "high", "low", "close", "volume", "amount"]
df[price_cols] = df[price_cols].apply(
pd.to_numeric,
errors="coerce"
)
df = (
df.dropna(subset=["symbol", "trade_date", "close"])
.drop_duplicates(subset=["symbol", "trade_date"])
.sort_values(["symbol", "trade_date"])
)
df["daily_return"] = df.groupby("symbol")["close"].pct_change()
df.to_csv(
"stock_daily_clean.csv",
index=False,
encoding="utf-8-sig"
)
这里使用 utf-8-sig,主要是为了减少中文字段在部分表格软件中打开时出现乱码的情况。
分析前先做四项检查
我不会下载完就直接算指标,而是先检查:
- 同一个证券代码和交易日期是否重复;
- 最高价、最低价与开收盘价的关系是否合理;
- 成交量、成交额是否出现异常负数;
- 单日涨跌是否来自复权切换、代码变更或字段错位。
检查通过后,再计算收益率、均线、成交量变化和滚动波动率。这样得到的结果,至少能确认异常来自行情本身,而不是 CSV 在采集或合并时出了问题。
常见问题
Q:股票行情 CSV 可以直接用于回测吗?
不建议直接使用。还需要确认复权方式、停牌处理、退市样本、交易费用以及是否存在未来数据泄漏。
Q:CSV 和数据库应该怎么选?
少量日线数据用 CSV 足够直观。数据达到分钟级、多市场或多年增量更新时,更适合使用 Parquet 或数据库,查询和存储效率会更稳定。
Q:免费行情数据可靠吗?
可以用于学习和初步研究,但要核对授权范围、更新频率与字段口径。正式业务或对准确性要求较高的项目,应优先使用来源明确、许可清楚的数据服务。