4 数据清洗
4.1 单表清洗
对每只股票的原始数据执行以下清洗步骤:
4.1.1 缺失值检测与处理
- 统计每列缺失值的数量和比例
- 采用向前填充(ffill)处理,利用金融数据的时间序列连续性
- 剩余缺失值使用向后填充(bfill)
4.1.2 日期格式统一
- 统一为
datetime64格式 - 设置日期为索引
4.1.3 数据类型检查
- 确保价格、成交量列为数值型
- 对字符型数据进行转换
4.1.4 重复值处理
- 检测并删除重复行
- 记录删除数量
4.1.5 离群值标注
- 计算日收益率:\(r_t = \ln(P_t / P_{t-1})\)
- 对单日涨跌幅超过±20%的记录在
is_extreme列中标注
清洗后的数据示例:
| date | close | return | is_extreme | code | name | industry |
|---|---|---|---|---|---|---|
| 2020-01-02 | 29.43298 | False | sh.600036 | 招商银行 | 银行 | |
| 2020-01-03 | 29.82663 | 0.01329 | False | sh.600036 | 招商银行 | 银行 |
4.2 宽表与长表转换
宽表:日期为索引,每列一只股票的收盘价
- 适合横向比较多只股票
- 计算相关系数矩阵
- 可视化多只股票走势
长表:字段为date, code, close, name, industry
- 适合按股票分组统计
- 绘制分面图
- 进行回归分析
4.3 数据存储
4.3.1 方式A:CSV
所有原始数据和清洗后数据均保存为CSV格式,便于查看和交换。
4.3.2 方式C:SQLite
设计了以下表结构:
CREATE TABLE stock_price (
code TEXT,
date TEXT,
close REAL,
volume REAL,
PRIMARY KEY (code, date)
);
CREATE TABLE macro_data (
date TEXT,
indicator TEXT,
value REAL,
PRIMARY KEY (date, indicator)
);
CREATE TABLE stock_info (
code TEXT PRIMARY KEY,
name TEXT,
industry TEXT
);演示了跨表JOIN、成交量排名查询、行业年均收盘价对比等实用SQL查询。