3、数据获取基础:使用 akshare 获取可转债基础数据

做量化回测,第一步就是搞定数据。

没有数据,再好的策略也是空中楼阁。我个人习惯先把数据源摸清楚,再动手写代码。今天我们就来聊聊,怎么用 akshare 这个库,把可转债的基础数据拿到手。

3.1 为什么选 akshare?

市面上能拿可转债数据的库不多。有的要钱,有的要注册,有的数据还不全。akshare 是开源的,免费,而且数据源直接对接国内主流财经网站。说白了,它就是咱们散户的瑞士军刀。

我在做第一个可转债策略时,试过手动从网页复制数据,那叫一个痛苦。后来换成 akshare,一行代码搞定。嗯,真香。

3.2 安装与导入

先装库,这个不用多说:

pip install akshare --upgrade

然后导入:

import akshare as ak
import pandas as pd

注意,akshare 更新挺频繁的。我建议你每次跑之前,先检查一下版本。我曾经因为版本太旧,接口返回的数据格式变了,排查了半天才发现是版本问题。

3.3 获取可转债列表

核心函数就一个:ak.bond_zh_cov()。它会返回一个 DataFrame,包含所有上市可转债的基本信息。

df = ak.bond_zh_cov()
print(df.head())

跑一下看看,你会得到类似这样的数据:

代码 名称 发行规模 剩余规模 转股价 正股价 ...其他字段
123456 XX转债 10.00亿 8.50亿 25.30 26.80 ...

这里我要提醒一句:akshare 返回的字段名可能会随着版本变化。你最好先 print(df.columns) 看一眼,确认字段名对不对得上。

3.4 提取我们需要的字段

题目要求的是四个字段:代码、名称、发行规模、剩余规模。我们直接筛选出来:

# 假设字段名是 '债券代码', '债券简称', '发行规模', '剩余规模'
# 实际字段名请以你打印出来的为准
df_basic = df[['债券代码', '债券简称', '发行规模', '剩余规模']].copy()
df_basic.columns = ['代码', '名称', '发行规模', '剩余规模']
print(df_basic.head())

你想想看,这一步其实就是在做数据清洗的预处理。把原始数据变成我们想要的格式,后面轮动策略才能直接用。

3.5 数据格式处理

这里有个坑:发行规模和剩余规模,akshare 返回的可能是字符串,比如 "10.00亿"。如果你要做计算,必须转成数值。

我曾经直接拿字符串去比较大小,结果排序全错了。后来才发现,字符串比较是按字典序,不是按数值。

正确的做法是:

# 去掉 '亿' 字,转成 float
df_basic['发行规模'] = df_basic['发行规模'].str.replace('亿', '').astype(float)
df_basic['剩余规模'] = df_basic['剩余规模'].str.replace('亿', '').astype(float)

这样处理之后,你就可以放心地做排序、筛选、计算了。

3.6 数据获取的完整流程

把上面的步骤串起来,就是一个完整的数据获取流程。我画了一张图,帮你理清逻辑:

可转债基础数据获取流程 安装 & 导入 akshare 调用 bond_zh_cov() 筛选4个核心字段 格式处理(字符串转数值) 最终得到干净的 DataFrame,可用于轮动策略

3.7 避坑指南

  • 网络问题akshare 需要联网获取数据。如果你在公司内网或者网络受限的环境,可能会超时。我建议加个 try-except 做异常处理。
  • 数据更新频率:可转债数据一般是交易日收盘后更新。如果你在盘中调用,部分字段可能是前一天的旧数据。
  • 字段名变化:前面说过,akshare 版本更新可能导致字段名变化。我的习惯是每次升级后,先跑一次 print(df.columns) 确认。
小技巧:如果你只需要部分字段,可以用 df.loc[:, ['债券代码', '债券简称']] 来选取,避免复制整个 DataFrame 造成内存浪费。
注意akshare 的数据源来自公开网站,仅供学习研究使用。如果你用于商业策略,建议使用更权威的数据源。

3.8 实战:把数据保存到本地

拿到数据后,我通常会保存一份到本地,方便后续分析:

# 保存为 CSV 文件
df_basic.to_csv('可转债基础数据.csv', index=False, encoding='utf-8-sig')

# 或者保存为 Excel
df_basic.to_excel('可转债基础数据.xlsx', index=False)

为什么要保存?因为每次调用 akshare 都要联网,如果网络不稳定,或者接口限流,你就拿不到数据。保存一份本地副本,至少能保证离线也能用。

3.9 小结

这一章我们只做了一件事:用 akshare 拿到可转债的代码、名称、发行规模、剩余规模。看起来简单,但这是整个轮动策略的基石。

数据质量决定了策略的上限。我见过太多人,策略逻辑写得天花乱坠,结果数据源就有问题,最后回测结果全是错的。所以,别嫌这一步麻烦,把数据搞干净,后面才能省心。

专注资料整理