第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 知识体系总览

下面这张图,帮你理清本章的核心逻辑:

融资融券余额数据获取流程 数据源选择 Tushare 需注册/积分限制 Akshare 免费/无需注册 数据获取 margin接口 单日/区间查询 stock_margin_szse_daily 沪深分别获取 数据处理 合并 → 清洗 → 填充缺失值 pd.merge + fillna + 排序 历史余额DataFrame

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倍,后来发现是数据源把单位搞错了——亿和万混了。可视化能帮你快速发现这种低级错误。

好了,数据已经到手。下一章咱们就用这些数据,开始计算融资融券余额的择时信号。你准备好了吗?

专注资料整理