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 数据获取的完整流程
把上面的步骤串起来,就是一个完整的数据获取流程。我画了一张图,帮你理清逻辑:
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 拿到可转债的代码、名称、发行规模、剩余规模。看起来简单,但这是整个轮动策略的基石。
数据质量决定了策略的上限。我见过太多人,策略逻辑写得天花乱坠,结果数据源就有问题,最后回测结果全是错的。所以,别嫌这一步麻烦,把数据搞干净,后面才能省心。