从数据抓取到可视化:Python实战中国股票分析技能

1次阅读
没有评论

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

image.webp

背景痛点:中国股票数据获取的难点

在中国股票市场数据分析中,数据获取往往是第一个拦路虎。不同于美国市场有 Yahoo Finance、Alpha Vantage 等开放接口,国内股票数据面临着以下几个典型问题:

从数据抓取到可视化:Python 实战中国股票分析技能

  • 数据源限制:很多免费数据源不稳定,经常变更接口或停止服务
  • 权限门槛:高质量数据通常需要付费或申请 API 权限(如 Tushare Pro)
  • 格式混乱:不同数据源返回的字段名、时间格式、数据单位不统一
  • 历史数据缺失:特别是早期上市股票的分红送配数据常有缺失

技术选型:主流数据接口对比

目前主流的 Python 金融数据接口有以下几种:

  1. Tushare Pro(推荐)
  2. 优势:数据全面(包含财务、基本面等),社区活跃,文档完善
  3. 缺点:免费版有调用频率限制,需要注册获取 token

  4. AKShare

  5. 优势:完全免费,数据源来自公开网站
  6. 缺点:接口稳定性依赖第三方网站,可能突然失效

  7. BaoStock

  8. 优势:支持实时数据,提供 Level2 行情
  9. 缺点:需要安装客户端,学习曲线较陡

对于大多数分析场景,我们推荐使用 Tushare Pro 作为主要数据源,它的数据质量和稳定性更适合生产环境。

核心实现流程

1. 数据获取:Tushare Pro 基础配置

首先安装必要库并配置 API:

pip install tushare pandas matplotlib seaborn

注册 Tushare Pro 账号获取 token 后初始化:

import tushare as ts

pro = ts.pro_api('你的 token')

2. 获取股票日线数据

以下代码获取贵州茅台 (600519) 的日线数据:

df = pro.daily(ts_code='600519.SH', start_date='20200101', end_date='20231231')

# 转换日期格式并设为主键
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
df.sort_index(inplace=True)

3. 数据清洗与特征工程

使用 Pandas 进行基础数据处理:

# 处理缺失值
df.fillna(method='ffill', inplace=True)

# 计算 5 日、20 日均线
df['ma5'] = df['close'].rolling(5).mean()
df['ma20'] = df['close'].rolling(20).mean()

# 计算每日收益率
df['daily_return'] = df['close'].pct_change()

4. 专业可视化实现

K 线图 + 均线组合

import mplfinance as mpf

# 准备 mplfinance 专用格式
df_k = df[['open', 'high', 'low', 'close', 'vol']]
df_k.columns = ['Open', 'High', 'Low', 'Close', 'Volume']

# 添加均线
add_plot = [mpf.make_addplot(df['ma5'], color='blue'),
            mpf.make_addplot(df['ma20'], color='orange')]

# 绘制 K 线
mpf.plot(df_k, type='candle', style='charles',
         addplot=add_plot, volume=True,
         title='贵州茅台 K 线图(2020-2023)',
         ylabel='价格(元)')

收益率分布直方图

import seaborn as sns

sns.displot(df['daily_return'].dropna(), kde=True,
            bins=50, color='green')
plt.title('贵州茅台日收益率分布')
plt.xlabel('日收益率')
plt.ylabel('频次')

性能优化技巧

当处理全市场数据时,需要注意:

  1. 分块获取数据

    # 按年分块获取
    years = ['2020', '2021', '2022', '2023']
    dfs = []
    for year in years:
        df = pro.daily(ts_code='600519.SH', 
                      start_date=f'{year}0101', 
                      end_date=f'{year}1231')
        dfs.append(df)
    full_df = pd.concat(dfs)

  2. 并行处理 :使用concurrent.futures 并行获取多只股票数据

  3. 本地缓存:将常用数据保存为 HDF5 格式

    df.to_hdf('stock_data.h5', key='600519')

常见问题解决方案

  • API 限速:免费版每分钟 200 次,建议:
  • 添加 time.sleep(0.3) 控制调用频率
  • 重要数据获取后立即本地存储

  • 复权数据缺失

    # 获取复权因子
    df_adj = pro.adj_factor(ts_code='600519.SH')
    # 合并到主数据
    df = df.merge(df_adj, on='trade_date')

  • 非交易日数据:先获取交易日历

    trade_cal = pro.trade_cal(exchange='SSE', 
                            start_date='20200101',
                            end_date='20201231')

扩展应用:量化策略示例

简单的双均线策略实现:

df['signal'] = 0
# 5 日均线上穿 20 日均线
df.loc[df['ma5'] > df['ma20'], 'signal'] = 1
# 5 日均线下穿 20 日均线
df.loc[df['ma5'] < df['ma20'], 'signal'] = -1

# 计算策略收益
df['strategy_return'] = df['signal'].shift(1) * df['daily_return']

# 绘制收益曲线
(1 + df[['daily_return', 'strategy_return']].dropna()).cumprod().plot()

总结与建议

通过本文的完整流程,你已经能够:

  1. 可靠获取中国股票市场数据
  2. 进行专业级的清洗与特征工程
  3. 实现机构级别的可视化分析

建议下一步:

  • 尝试分析不同行业的股票特征差异
  • 加入成交量、MACD 等技术指标
  • 连接券商 API 实现实盘交易(需注意风险)

完整的示例代码已上传 GitHub 仓库(假设链接),包含更多高级功能实现。在实际应用中,记得始终遵守数据服务商的调用规范,并做好异常处理。

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