第1章:数据获取实战——用Python拿下融资融券历史余额
做量化交易,数据是命根子。这话我常跟团队新人讲。
融资融券余额这个指标,说白了就是市场情绪的体温计。余额往上走,说明大家看好后市,敢借钱买股票;余额往下掉,说明资金在撤退,市场偏冷。但光看一天的数据没用,你得拿到历史数据,才能看出趋势。
这一章,我就带你手把手把沪深两市的融资融券历史余额数据拉下来。咱们用两个主流库——Tushare和Akshare,一个偏专业,一个偏易用,你都可以试试。
1.1 数据源选型:Tushare vs Akshare
先说说这两个库的区别。我个人的习惯是:
- Tushare:数据质量高,字段全,但需要注册获取token,而且有积分限制。适合做严肃研究。
- Akshare:开源免费,不用注册,上手快。适合快速验证想法。
你可能会问:「那我该用哪个?」嗯,我的建议是——都学。因为实际项目中,我经常两个混着用。比如Tushare拿不到某些历史数据时,Akshare能补上。
核心结论:Tushare适合深度分析,Akshare适合快速原型。两个都装,不亏。
1.2 环境准备与安装
先确保你的Python环境是3.8以上。我遇到过有人用Python 2.7跑Akshare,结果各种报错……嗯,别踩这个坑。
# 安装两个库
pip install tushare akshare pandas
# 验证安装
import tushare as ts
import akshare as ak
print("安装成功!")
小提示:如果你在国内,建议用清华镜像源安装,速度快很多:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tushare akshare
1.3 Tushare获取融资融券余额
Tushare获取数据需要先注册(https://tushare.pro),拿到你的token。注册完在个人中心就能看到。
import tushare as ts
import pandas as pd
# 设置token(换成你自己的)
ts.set_token('你的token')
pro = ts.pro_api()
# 获取融资融券每日汇总数据
# 接口:margin,字段包括融资余额、融券余额、融资买入额等
df_margin = pro.margin(
trade_date='20250110', # 单日查询
fields='trade_date, rzye, rzmre, rqye, rqmcl'
)
print(df_margin.head())
但单日查询太慢了。我一般用区间查询,一次拉一整段历史:
# 获取2024年全年数据
df_margin_history = pro.margin(
start_date='20240101',
end_date='20241231',
fields='trade_date, rzye, rzmre, rqye, rqmcl'
)
# 按日期排序
df_margin_history = df_margin_history.sort_values('trade_date').reset_index(drop=True)
print(df_margin_history.tail())
注意:Tushare的积分限制。免费用户每天只能调200次,每次最多返回5000条。如果你要拉多年数据,建议分批次拉,或者升级积分。我曾经因为没注意限制,跑到一半被限流,数据断了一截……后来老老实实分了三个月三个月地拉。
1.4 Akshare获取融资融券余额
Akshare就简单多了,不用注册,直接调函数。它提供的是沪深两市各自的融资融券余额数据。
import akshare as ak
# 获取上海证券交易所融资融券余额
df_sh = ak.stock_margin_szse_daily(
symbol="上海证券交易所",
start_date="20240101",
end_date="20241231"
)
# 获取深圳证券交易所融资融券余额
df_sz = ak.stock_margin_szse_daily(
symbol="深圳证券交易所",
start_date="20240101",
end_date="20241231"
)
print("上交所数据:")
print(df_sh.tail())
print("\n深交所数据:")
print(df_sz.tail())
你看,代码量少了很多。但Akshare有个小毛病——字段名是中文的,比如「融资余额」「融券余额」。做数据分析时,我习惯先重命名成英文,方便后续处理。
# 重命名字段
df_sh.rename(columns={
'融资余额': 'rzye_sh',
'融券余额': 'rqye_sh'
}, inplace=True)
df_sz.rename(columns={
'融资余额': 'rzye_sz',
'融券余额': 'rqye_sz'
}, inplace=True)
1.5 数据合并与清洗
拿到两个交易所的数据后,咱们得把它们合并成一张表。这样分析起来才方便。
# 合并沪深两市数据
df_merge = pd.merge(
df_sh[['日期', 'rzye_sh', 'rqye_sh']],
df_sz[['日期', 'rzye_sz', 'rqye_sz']],
on='日期',
how='outer'
)
# 计算两市合计
df_merge['rzye_total'] = df_merge['rzye_sh'] + df_merge['rzye_sz']
df_merge['rqye_total'] = df_merge['rqye_sh'] + df_merge['rqye_sz']
# 按日期排序
df_merge = df_merge.sort_values('日期').reset_index(drop=True)
print(df_merge.head())
避坑指南:我曾经发现两个交易所的日期不完全对齐——比如某天深交所休市但上交所正常交易。用how='outer'可以保留所有日期,缺失值用前一天的填充。具体用df_merge.fillna(method='ffill')。
1.6 知识体系总览
下面这张图,帮你理清本章的核心逻辑:
1.7 完整代码示例
最后,给你一个可以直接跑的完整脚本。我建议你把它保存成 get_margin_data.py,以后每次用直接改日期范围就行。
import pandas as pd
import akshare as ak
def get_margin_data(start_date='20240101', end_date='20241231'):
"""
获取沪深两市融资融券历史余额数据
"""
# 获取上交所数据
df_sh = ak.stock_margin_szse_daily(
symbol="上海证券交易所",
start_date=start_date,
end_date=end_date
)
df_sh = df_sh[['日期', '融资余额', '融券余额']]
df_sh.columns = ['date', 'rzye_sh', 'rqye_sh']
# 获取深交所数据
df_sz = ak.stock_margin_szse_daily(
symbol="深圳证券交易所",
start_date=start_date,
end_date=end_date
)
df_sz = df_sz[['日期', '融资余额', '融券余额']]
df_sz.columns = ['date', 'rzye_sz', 'rqye_sz']
# 合并
df = pd.merge(df_sh, df_sz, on='date', how='outer')
df['rzye_total'] = df['rzye_sh'] + df['rzye_sz']
df['rqye_total'] = df['rqye_sh'] + df['rqye_sz']
# 排序并填充缺失值
df = df.sort_values('date').reset_index(drop=True)
df = df.fillna(method='ffill')
return df
# 运行
df_margin = get_margin_data('20240101', '20241231')
print(df_margin.head())
print(f"共获取 {len(df_margin)} 条数据")
我的经验:拿到数据后,第一件事不是分析,而是画个折线图看看有没有异常值。我曾经发现某天融资余额突然跳升10倍,后来发现是数据源把单位搞错了——亿和万混了。可视化能帮你快速发现这种低级错误。
好了,数据已经到手。下一章咱们就用这些数据,开始计算融资融券余额的择时信号。你准备好了吗?