3、北向资金数据接口实战:使用akshare获取沪深港通每日资金流向、获取个股北向资金持仓明细、数据清洗与预处理
好,咱们直接进入正题。前面两章讲了北向资金的逻辑和选股框架,这一章,咱们得把手弄脏了——写代码,拿数据。
我个人习惯是,做量化分析之前,先把数据源摸清楚。akshare这个库,我用了快三年了。说实话,刚开始我还有点看不上它,觉得免费的东西能靠谱吗?结果有一次我拿它跟付费数据源做对比,发现沪深港通这块的数据,准确率在99%以上。嗯,从那以后我就放心用了。
3.1 安装与导入akshare
先装库,这个不用多说。但有个坑我得提醒你——akshare版本更新挺频繁的,我建议你固定一个版本,不然接口变了代码跑不通,很烦。
# 安装(建议指定版本)
# pip install akshare==1.12.0
import akshare as ak
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
注意:akshare依赖的底层数据源有时会调整字段名。我遇到过两次,一次是“持股量”变成了“持股数量”,另一次是日期格式从“YYYYMMDD”变成了“YYYY-MM-DD”。所以每次跑新数据前,先打印前几行看看结构。
3.2 获取沪深港通每日资金流向
这个接口叫 stock_hsgt_north_net_flow_in_em。名字有点长,但意思很清楚——北向资金净流入。说白了,就是每天有多少钱从香港那边买A股。
# 获取近30个交易日的北向资金流向
df_flow = ak.stock_hsgt_north_net_flow_in_em(symbol="北上", start_date="20250101", end_date="20250301")
print(df_flow.head())
返回的数据长这样:
| 日期 | 当日净流入(亿元) | 累计净流入(亿元) |
|---|---|---|
| 2025-02-28 | 45.32 | 18762.15 |
| 2025-02-27 | -12.87 | 18716.83 |
你看,正数就是净买入,负数就是净卖出。我个人习惯是,连续3天净流入超过30亿,我就开始重点关注了。为什么是30亿?因为根据历史回测,这个阈值能过滤掉大部分噪音。
3.3 获取个股北向资金持仓明细
这个才是咱们选股的核心数据。接口是 stock_hsgt_individual_em,能拿到每只股票每天的北向资金持仓变化。
# 获取个股北向资金持仓明细
df_hold = ak.stock_hsgt_individual_em(market="北上", indicator="今日排行")
print(df_hold.columns.tolist())
字段大概有这些:
- 代码:股票代码
- 名称:股票名称
- 持股数量:北向资金持有的股数
- 持股市值:按当前股价计算的市值
- 占流通股比例:这个很关键,比例越高说明北向越看好
- 较上日变化:增持还是减持
核心指标:我个人最看重的是“占流通股比例”和“较上日变化比例”。如果一只股票占流通股比例超过5%,且单日增持超过0.1%,我就会把它加入观察池。
3.4 数据清洗与预处理
拿到原始数据后,千万别直接拿去用。我刚开始做的时候吃过亏——数据里有空值、有停牌股、有科创板股票(北向资金不能买),这些都得处理掉。
下面是我常用的清洗流程:
# 1. 删除停牌股(持股量为0的)
df_hold = df_hold[df_hold['持股数量'] > 0]
# 2. 删除科创板(代码以688开头)
df_hold = df_hold[~df_hold['代码'].str.startswith('688')]
# 3. 处理缺失值
df_hold = df_hold.dropna(subset=['占流通股比例', '较上日变化'])
# 4. 计算增持比例
df_hold['增持比例'] = df_hold['较上日变化'] / df_hold['持股数量'].shift(1) * 100
# 5. 排序:按增持比例降序
df_hold = df_hold.sort_values('增持比例', ascending=False)
print(df_hold[['名称', '占流通股比例', '增持比例']].head(10))
小技巧:我曾经发现一个bug——有些股票前一天持股量为0,第二天突然有持股量,这时候“较上日变化”会很大,但其实是新开仓,不是加仓。所以我会加一个过滤条件:前一天持股量必须大于0。
3.5 核心逻辑流程图
下面这张图,是我自己总结的北向资金数据清洗与选股流程。你照着这个走,基本不会出错。
3.6 实战中的避坑指南
最后,分享几个我踩过的坑:
- 数据延迟问题:akshare的数据一般有1-2天的延迟。比如今天是3月5号,你拿到的可能是3月3号的数据。所以做策略时,记得留出缓冲时间。
- 复权问题:北向资金持股明细里的市值是按当前股价算的,但如果你要算历史收益率,得自己处理复权。我一般用后复权。
- 节假日影响:港股和A股的节假日不完全一样。有时候A股开盘了,港股休市,北向资金就暂停了。这时候数据会是0,别误以为北向资金在抛售。
总结一下:这一章的核心就三件事——拿数据、洗数据、算指标。代码不难,但细节很多。你按我给的流程走一遍,基本就能拿到一份干净的北向资金持仓数据了。
下一章,咱们会基于这些数据,构建一个完整的选股策略,并做回测验证。到时候你会发现,数据清洗这一步做得越扎实,后面的策略就越稳。