前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python获取北向资金持股数据

Python获取北向资金持股数据

作者头像
量化小白
发布2023-04-03 20:36:07
1.6K1
发布2023-04-03 20:36:07
举报

本篇介绍如何用Python批量获取北向资金的持股数据,全文包括4个部分:

一、A股资金流数据

二、北向数据来源

三、爬虫代码逻辑

四、北向数据怎么用

全文阅读大约需要10分钟,觉得不错可以点个好看支持一下

01

A股资金流数据

资金流向是观测股票市场的一个重要指标,目前A股市场可以获取到的资金流数据主要包括:

1. 公募基金持仓:季度披露,季报只披露前10大重仓股,半年报、年报披露全部持仓,可通过Python获取,获取方式见上篇推文《Python爬取全市场基金持仓,扒一扒基金经理们的调仓选股思路》,优点:跟着靠谱的基金经理抄作业,稳稳地,缺点:季度,略滞后;

2. 机构持仓:QFII、社保、券商、信托等持仓,优缺点基本同上;

3. 按照成交单金额划分的资金流动数据:WIND/东方财富都有披露,如下图。优点:当天个股流入流出的全部资金流,频率高且完整,缺点:大小单话分固定金额划分,不是按比例划分,可能存在一定问题,这部分数据爬取后面可以安排上;

4. 事件型资金变动:包括大股东增减持、管理层持股变动、大宗交易、上龙虎榜的异常交易等等,这种没有固定频率,除了龙虎榜这个,其他的按照监管规定,一般会事前披露,偶尔也有铤而走险的,比如之前推文提到的某个龙头。龙虎榜则是事后披露。

5. 北向资金:北向严格来说也可以归为第二类,分开主要是北向有日度公布的数据,高频且完整,指示意义很强。

今天来写一下如何获取北向持股数据。获取源码和数据样例请在后台回复“北向持股”。

02

北向数据来源

北向最最最原始的数据要从港交所里去找,感兴趣可以去官网搜一搜,我们这里不这么麻烦,直接从东方财富的网站上爬取。

网站:http://data.eastmoney.com/hsgtcg/list.html/

网站整理非常详尽,我们这里主要关注北向每天持有的个股数据,数据格式大概这样,包括当天北向总的持股和占比情况,以及相对之前的增减持比例,披露包括当天、过去3天、5天、10天、1个月、1个季度、1年的。这里我们都会爬下来

网站也披露了其他口径的数据,比如指数的、行业的、地域的,也可以用本文类似的方式爬取,这里不赘述。

先来看下网站提供的数据结构,还是上面这张图

整体分三层:

1. 资金流维度上,包括北向、沪股通、深股通三个,北向=沪股通+深股通,爬下来北向可以自己拆分沪股通和深股通,所以只爬北向这部分;

2. 频率上:包括当天、过去3天、5天、10天、一个月、1个季度、1年,这个就所有频率全部都爬下来了。这里遗憾的是只提供当天的数据,想要历史数据就没办法了,想要积累数据需要把这个代码设置成定时的每天跑一次。

3. 数据上:我们只保留和北向相关的一些维度,包括北向持股数、持股市值、增持股数、增持市值等等。像今日收盘价这种在哪都拿得到,就没有保留,当然代码中可以获取到,想要保留的可以自行调整代码。

03

爬虫代码

爬的过程不复杂,这部分介绍逻辑和代码,对实现过程感兴趣的童鞋可以参考着自己写一写,对代码不感兴趣的可以直接看下一部分。我们最终提供的代码也是直接可以运行的。

可以先用开发者工具观察下数据,我这边用的chrome,其他的也类似。打开开发者工具,调到network。然后点击第二页。

如果没有操作失误的话,你能看到多了这样一条请求

点击打开并选择preview,可以看到,返回的正是页面上的数据,

点击小三角打开折叠,可以看到一个个数据,是字典格式的,这就非常好办了。

接下来看看怎么获取这些数据,点击header,看看请求头的相关信息

重点已标出,get方法,网址的各项参数,网址中有一个参数HdDate 是20210820,也就是上周五。

再往下看,

request header的相关参数,cookie这里后来试了一下,不加也可以爬的到,referer这个参数比较重要,如果不加,可能会爬不到,referer表示的是来源,也就是你是从哪个网站转到这个页面来的。再往下

这就是网址里的那些参数了,大部分参数不用改,照抄即可,需要改的参数包括:p:页码,我们刚刚是跳转到第二页,所以这里显示2,另外还有filter里的日期,这个每次需要调整为当天才能爬。

还有DateTtpe=’1',这里1表示的当天,我们跳转到季度维度上

再看这个参数,就变成了'jd‘。

同样的方式,我们把所有的频率都点一遍,就知道了每个频率对应的参数值。

接下来是代码,header用fake_useragent生成一个,加入刚才必须的那些参数。

代码语言:javascript
复制
headers = {
    'Accept': '*/*',
    'Accept-Encoding': 'gzip, deflate',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Connection': 'keep-alive',
    'Host':'dcfm.eastmoney.com' ,
    'Referer': 'http://data.eastmoney.com/',
    "User-Agent": UserAgent(verify_ssl=False).random}

get函数必须的参数,根据上面的说明

代码语言:javascript
复制
params = {'callback':'jQuery112301421292556627114_1629211416180',
              'st':'ShareSZ_Chg_One',
             'sr':'-1',
              'ps':50,
              'p':1,
              'type':'HSGT20_GGTJ_SUM',
              'token':'894050c76af8597a853f5b408b759f5d',
              'js':'{"data":(x),"pages":(tp),"font":(font)}',
              'filter':"(DateType='{}')(HdDate='{}')".format(freq,dt) }

这里的dt是日期,比如今天来讲就是上周五,填'2021-08-20',freq是频率,当天填1,季度填’jd'。

用request.get获取数据看看

代码语言:javascript
复制
url = 'http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/'
    response_comment = requests.get(url,params = params,headers = headers )
    res_temp = response_comment.text

返回值如下

返回出来是一个很长的文本,可以明显看出,后面是一个字典,里面是我们需要的数据,用json.load转成字典后变成这样

代码语言:javascript
复制
res = json.loads(res_temp)

有3个key,第一个是data,里面是我们需要的数,第二个key是总的页码数,可以根据这个来写虚幻,第三个是字体,没啥用了。

接下来就很easy了,根据总的页数写一个循环,把所有的数据拼接到一起。

代码语言:javascript
复制
d = []
    
    for i in tqdm(range(pagenum)):
        params['p'] = i + 1
        
        response_comment = requests.get(url,params = params,headers = headers )
        
        res_temp = response_comment.text
        res_temp = '{' + re.split('\(\{',res_temp)[1][:-1] 
        res = json.loads(res_temp) 
        a = pd.DataFrame(res['data'])
        
        d.append(a)
    
    d = pd.concat(d,axis = 0).reset_index(drop = True)

爬下来之后可以根据网站上的名称对字段的名称进行调整,我这边只保留了这几个

最后一步是对所有的频率进行循环,包括当天、3天、5天、1个月、1个季度、1年的。全部拼接到一起,最后得到的数据长成这样

最后一列freq表示频率,所有的数据加起来有八千多条。这部分数据和代码一并提供。

以上是数据获取的全过程。如果想要每天自动的去爬数据,可以用任务调度计划设置一个自动运行,收盘后跑一遍即可

04

北向数据怎么用

以上我们获取到的北向的个股数据,那么如何来用这个数据呢,我们这里提供两个简单的维度,其他更多观测的角度可以找一找相关的研究报告看看。

我们爬到的数据整体是两部分,一个是存量信息,目前持有的总数,另一个是增量信息,相比于之前,增加或减少了多少。很明显增量信息要更重要一些。对于最近一段时间北向增持很多或者减持很多的股票,我们都需要重点关注。

并且,对于不同维度下的增减持都要考虑到,比如如果发现某只个股短期(1、3、5天)、中期(1月、1季度)、长期(1年)频率来看,都是增持的,那肯定是非常好的信号。如果短中长期信号出现背离,需要思考一下原因。

这里我们统计每个频率下增持、减持最多的10只股票

代码语言:javascript
复制
alld = alld.sort_values(by = ['freq','增持占流通股比例'],ascending = False)
zctop10 = alld.groupby('freq').head(10)[['code','stockname','ind','freq','增持占流通股比例']]
jctop10 = alld.groupby('freq').tail(10)[['code','stockname','ind','freq','增持占流通股比例']]

各个频率下增持最多的股票如下

各个频率下减持最多的股票如下

可以看出最近一段时间减持比较多的股票里医药、食品饮料比较多,而增持的基本上是电子、周期板块等等。

另外我们也可以看一看各个行业北向资金的增减持情况,这里我们就直接用爬下来的行业吧,这个行业更像是概念板块。我们统计每个行业市值加权的平均增持比例。这里我们以北向资金持有的股票池为基准,也可以以全市场行业内所有个股为基准。

代码语言:javascript
复制
alld['w'] = alld.流通市值.groupby([alld.freq,alld.ind]).apply(lambda x:x/x.sum())

indpct = alld.groupby([alld.freq,alld.ind]).apply(lambda x:(x['增持占流通股比例']*x['w']).sum())
indpct = indpct.unstack()

结果如下,按照月度排序

以上是本文的全部内容,谢谢支持。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量化小白躺平记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CLI 工具
云开发 CLI 工具(Cloudbase CLI Devtools,CCLID)是云开发官方指定的 CLI 工具,可以帮助开发者快速构建 Serverless 应用。CLI 工具提供能力包括文件储存的管理、云函数的部署、模板项目的创建、HTTP Service、静态网站托管等,您可以专注于编码,无需在平台中切换各类配置。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档