Python实战:基于Pandas和Tushare的中国股票数据分析技能精要

1次阅读
没有评论

共计 1922 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

中国股票市场具有独特的交易机制,如 T + 1 交割制度、10% 涨跌停限制(ST 股为 5%)、盘中临时停牌规则等。这些特性使得数据分析时需要额外关注:

Python 实战:基于 Pandas 和 Tushare 的中国股票数据分析技能精要

  1. 停复牌股票会导致时间序列不连续
  2. 涨跌停板价格形成特殊的成交量模式
  3. 除权除息需进行复权处理
  4. 集合竞价阶段数据需单独处理

数据接口选型对比

主流 A 股数据接口各有特点:

  • Tushare Pro
  • 优势:数据质量高、接口稳定、文档完善
  • 不足:部分高频数据需要付费
  • 适合场景:基本面研究、日频以上数据分析

  • AKShare

  • 优势:完全免费、覆盖数据源广
  • 不足:接口变动频繁
  • 适合场景:多数据源验证

  • Wind/ 同花顺 i 问财

  • 优势:机构级数据质量
  • 不足:商业授权费用高

核心数据处理流程

OHLC 数据清洗实战

import pandas as pd
import numpy as np

def clean_ohlc(df):
    """处理股票行情数据常见问题"""
    # 处理停牌导致的缺失值
    df = df[df['volume'] > 0].copy()

    # 修复异常价格(如涨跌停时的无效报价)df['high'] = np.where(df['high'] == 0, df['close'], df['high'])
    df['low'] = np.where(df['low'] == 0, df['close'], df['low'])

    # 前复权处理
    df['adj_factor'] = df['close'] / df['pre_close']
    for col in ['open', 'high', 'low', 'close']:
        df[col] = df[col] * df['adj_factor']

    return df.dropna()

技术指标计算优化

使用 TA-Lib 时注意:

  1. 避免在循环中调用指标函数
  2. 预计算常用中间变量(如对数收益率)
  3. 对指标参数进行网格搜索时使用 Joblib 并行
from talib import RSI, MACD

def calc_tech_indicators(df):
    """批量计算技术指标"""
    closes = df['close'].values

    # 使用向量化计算
    df['rsi14'] = RSI(closes, timeperiod=14)
    macd, signal, _ = MACD(closes)
    df['macd_diff'] = macd - signal

    return df

大规模数据加速方案

Dask 使用技巧:

import dask.dataframe as dd

# 将 CSV 转换为 Parquet 格式提升 IO 性能
ddf = dd.read_csv('big_data.csv')
ddf.to_parquet('optimized.parquet', engine='pyarrow')

# 计算 20 日均线(自动并行化)ddf['ma20'] = ddf['close'].rolling(20).mean()

生产环境注意事项

API 调用优化

  • 使用 Redis 记录最后一次调用时间
  • 对不同的 API 配额分别维护计数器
  • 重要数据实现本地缓存
import redis
from datetime import datetime

r = redis.Redis()

def api_call_guard(api_name):
    last_call = r.get(f'last_call:{api_name}')
    if last_call and (datetime.now() - last_call).seconds < 1:
        time.sleep(1)
    r.set(f'last_call:{api_name}', datetime.now())

反爬策略应对

  1. 随机 User-Agent 轮换
  2. 代理 IP 池实现
  3. 模拟鼠标移动等人工操作特征
  4. 遵守 robots.txt 规则

存储方案选择

需求场景 MySQL ClickHouse
高频写入 一般(需分表) 优秀
复杂查询 优秀 中等
时序数据压缩 较差 极佳
开发成本 中等

完整代码示例

参见附件的 Jupyter Notebook 包含:

  1. 数据获取到存储的完整 pipeline
  2. 技术指标计算的单元测试
  3. 简单的回测框架示例
# 单元测试示例
def test_clean_ohlc():
    test_data = pd.DataFrame({'close': [10, 20, 0, 30],
        'volume': [100, 0, 200, 300]
    })
    cleaned = clean_ohlc(test_data)
    assert len(cleaned) == 2  # 应过滤掉零成交记录 

实际开发中还需要注意:

  • 滑点处理:使用 level2 数据估算真实成交价
  • 因子正交化:通过 PCA 消除多重共线性
  • 防止回测过拟合:采用 Walk Forward 验证

这套方案已经在我们量化系统中稳定运行 2 年,日均处理超过 500 万条行情数据。特别提醒:国内股票数据存在显著的幸存者偏差,使用退市股票数据验证策略非常重要。

正文完
 0
评论(没有评论)