北向资金能预示大盘涨跌?【附Python源码】

01

引言

中国证监会于 2014 年和 2016 年分别批准了沪港通和深港通,建立了大陆和香港股市的互联互通机制,市场通常把沪股通和深股通的合计流入资金称为北向资金。换句话说,北上资金就是指从香港流入大陆股市的资金,而内地流入香港股市的资金则被称为南下资金。市场广 泛认为北向资金是“聪明钱”,会对市场的短期走势有一定的指示作用,因此本文对该指标进行统计分析,并借鉴华泰金工研量化资产配置7月月报《北向资金走向预示市场短期或震荡》关于北上资金的择时思路,构建基于北向资金的股市择时策略,并进行历史回测。结果表明,北向资金对于判断沪深 300指数涨跌具有较好的预示作用

02

数据获取

本文所使用的指数数据和北上资金数据均来自tushare.pro。如果由于积分受限,可在公众号后台回复“北上资金”获取相应csv格式数据。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False

由于tushare对北上资金数据的单次提取有限制(300条/次),需要通过获取两个时间周期内的交易日历,分次提取数据。

import tushare as ts
token='输入你的token'
pro=ts.pro_api(token)
#获取交易日历
def get_cal_date(start,end):cal_date=pro.trade_cal(exchange='', start_date=start, end_date=end)cal_date=cal_date[cal_date.is_open==1]dates=cal_date.cal_date.valuesreturn dates

定义北向资金数据获取函数。

#获取北向资金数据
def get_north_money(start,end):#获取交易日历dates=get_cal_date(start,end)#tushare限制流量,每次只能获取300条记录df=pro.moneyflow_hsgt(start_date=start, end_date=end)#拆分时间进行拼接,再删除重复项for i in range(0,len(dates)-300,300):d0=pro.moneyflow_hsgt(start_date=dates[i], end_date=dates[i+300])df=pd.concat([d0,df])#删除重复项df=df.drop_duplicates()df.index=pd.to_datetime(df.trade_date)df=df.sort_index()return df

定义指数数据获取函数。

#获取指数数据
def get_index_data(code,start,end):index_df = pro.index_daily(ts_code=code, start_date=start,end_date=end)index_df.index=pd.to_datetime(index_df.trade_date)index_df=index_df.sort_index()return index_df

获取常用的几个指数2014-2020期间收盘价数据。

#获取指数数据
#常用大盘指数
indexs={'上证综指': '000001.SH','深证成指': '399001.SZ','沪深300': '000300.SH','创业板指': '399006.SZ','上证50': '000016.SH','中证500': '000905.SH','中小板指': '399005.SZ','上证180': '000010.SH'}
start='20141117'
end='20200812'
index_data=pd.DataFrame()
for name,code in indexs.items():index_data[name]=get_index_data(code,start,end)['close']
#index_data.tail()

03

探索性分析

理论上而言,股市的上涨离不开资金的推动,而市场的活跃又会反过来吸引更多资金加入博弈。近年来,北上资金受到市场的关注越来越大,被看作是短期市场风向标,与市场指数存在一定的正向关系。当然理论在现实中不一定成立,所以在利用北上资金构建择时策略前,有必要先对指数和北上资金的关系进行探索性分析。

#累计收益
(index_data/index_data.iloc[0]).plot(figsize=(14,6))
plt.title('A股指数累积收益率\n 2014-2020',size=15)
plt.show()

陆股通覆盖大部分宽基指数成分股,即北向资金可投资的股票池覆盖了上证 50、沪深 300、中证 500 的绝大多数指数成分股,下面对各大指数的收益率和北上资金进行相关性分析。

#将价格数据转为收益率
all_ret=index_data/index_data.shift(1)-1
north_data=get_north_money(start,end)
#north_data=pd.read_csv('north_data',index_col=0,header=0)
all_data=all_ret.join(north_data['north_money'],how='inner')
all_data.rename(columns={'north_money':'北向资金'},inplace=True)
all_data.dropna(inplace=True)
all_data.corr()

上图显示,2014年至2020年8月整个交易期间内,北上资金与各大指数收益率均存在一定的正相关,但相关系数较低,分布在0.23-0.29之间。由于北上资金相对整个A股市场来说,体量还是比较小的,因此该指标的指示作用可能体现在短期内。下面使用120日的滚动窗口考察下北上资金与指数的相关性。

all_data.rolling(120).corr().tail(9)

数据显示,北上资金与各大指数的滚动窗口120日相关系数均大于0.5,其中沪深300与北上资金相关系数最高(0.7),可见中短期内,北上资金的大小对指数收益率具有一定的指示作用。下面以沪深300指数为例,对二者的散点图进行回归线拟合。图形再次支持了北上资金与沪深300指数的正相关性。

import seaborn as sns
plt.figure(figsize=(10, 6))
sns.regplot(x=list(all_data["北向资金"][-120:]),y=list(all_data["沪深300"][-120:]))
plt.title('沪深300与北向资金拟合回归线',size=15)
plt.xlabel('北向资金',size=12)
plt.ylabel('沪深300收益率',size=12)
plt.show()

再来观察一下沪深300日收益率与北上资金的波动情况,二者具有一定的同步性。

#沪深300指数收益率与北向资金
final_data=all_data[['沪深300','北向资金']].dropna()
final_data.plot(secondary_y='北向资金',figsize=(12,6))
plt.title('沪深300日收益率 VS 北向资金',size=15)
plt.show()

#获取北向资金与沪深300收益率的滚动窗口相关系数
def cal_rol_cor(data,period=30):cors=data.rolling(period).corr()cors=cors.dropna().iloc[1::2,0]cors=cors.reset_index()cors=cors.set_index('trade_date')return cors['沪深300']

最后从纵向角度考察沪深300收益率与北上资金的相关性。数据显示,2014年至2020年8月期间,二者相关系数均值为0.33,最大值为0.7。图形显示,二者的相关性近年来逐渐走高。

cor=cal_rol_cor(final_data,period=120)
cor.describe()
count:1236  mean:0.335
std:0.219  min:-0.215
25%:0.219  50%:0.379
75%:0.525  max:0.706
cor.plot(figsize=(14,6),label='移动120日相关系数')
plt.title('沪深300与北向资金移动120日相关系数',size=15)
plt.axhline(cor.mean(), c='r',label='相关系数均值=0.33')
plt.legend(loc=2)
plt.show()

04

策略实例

从上面的探索性分析发现,北上资金与各大指数中短期内存在一定的正相关性,下面参考华泰金工研报的思路,基于北向资金变动数据构建布林带择时策略,并对择时模型进行回测分析。

策略思路如下:

(1) 当该日北向资金流入规模 > 过去 252 个交易日的北向资金均值 + 1.5 倍标准差, 则全仓买入沪深 300;

(2) 当该日北向资金流入规模 < 过去 252 个交易日的北向资金均值 - 1.5 倍标准差, 则清仓卖出沪深 300;

(3) 以第二天开盘价买入(研报是以收盘价来计量)。

定义策略函数:

def North_Strategy(data,window,stdev_n,cost):'''输入参数:data:包含北向资金和指数价格数据window:移动窗口stdev_n:几倍标准差cost:手续费'''# 中轨df=data.copy().dropna()df['mid'] = df['北向资金'].rolling(window).mean()stdev = df['北向资金'].rolling(window).std()# 上下轨df['upper'] = df['mid'] + stdev_n * stdevdf['lower'] = df['mid'] - stdev_n * stdevdf['ret']=df.close/df.close.shift(1)-1df.dropna(inplace=True)#设计买卖信号#当日北向资金突破上轨线发出买入信号设置为1df.loc[df['北向资金']>df.upper, 'signal'] = 1#当日北向资金跌破下轨线发出卖出信号设置为0df.loc[df['北向资金']<df.lower, 'signal'] = 0df['position']=df['signal'].shift(1)df['position'].fillna(method='ffill',inplace=True)df['position'].fillna(0,inplace=True)#根据交易信号和仓位计算策略的每日收益率df.loc[df.index[0], 'capital_ret'] = 0#今天开盘新买入的position在今天的涨幅(扣除手续费)df.loc[df['position'] > df['position'].shift(1), 'capital_ret'] = \(df.close/ df.open-1) * (1- cost) #卖出同理df.loc[df['position'] < df['position'].shift(1), 'capital_ret'] = \(df.open / df.close.shift(1)-1) * (1-cost) # 当仓位不变时,当天的capital是当天的change * positiondf.loc[df['position'] == df['position'].shift(1), 'capital_ret'] = \df['ret'] * df['position']#计算标的、策略、指数的累计收益率df['策略净值']=(df.capital_ret+1.0).cumprod()df['指数净值']=(df.ret+1.0).cumprod()return df

受篇幅所限,策略评价指标、可视化函数和主函数代码省略,完整代码见知识星球“Python金融量化”上分享(扫描下方二维码即可加入)。

def performance(df):pass
#对策略累计收益率进行可视化
def plot_performance(df,name):pass
#将上述函数整合成一个执行函数
def main(code='000300.SH',start='20141117',end='20200812',window=252,stdev_n=1.5,cost=0.00):pass

首先以沪深300指数进行回测,滚动窗口默认250日,手续费默认为0。回测结果显示,基于北上资金的择时策略表现较好,年化收益率17.8%,高于基准的5.3%,最大回撤17%低于基准32%,夏普比率为2.2。

main(code='000300.SH')
回测标的:沪深300指数
回测期间:20151208—20200812
策略年胜率为:80.0%
策略月胜率为:64.58%
策略周胜率为:60.98%
总收益率:  策略:106.36%,沪深300:26.03%
年化收益率:策略:17.81%, 沪深300:5.37%
最大回撤:  策略:17.28%, 沪深300:32.46%
策略Alpha: 0.15, Beta:0.46,夏普比率:2.2

考虑到北上资金2016年后才开始备受关注,而且前文的探索性分析也显示相关性是2016年后逐年攀高,因此将回测起始时间改为2016年,交易手续费设置为1%(有点高)。结果显示,这一期间(实际上是2017年至今)的择时策略表现更佳,年化收益率达到24%。

main(code='000300.SH',start='20161117',cost=0.01)
回测标的:沪深300指数
回测期间:20171205—20200812
策略年胜率为:50.0%
策略月胜率为:65.52%
策略周胜率为:61.86%
总收益率:  策略:72.01%,沪深300:15.65%
年化收益率:策略:23.93%, 沪深300:5.92%
最大回撤:  策略:17.29%, 沪深300:32.46%
策略Alpha: 0.21, Beta:0.45,夏普比率:2.1


最后以创业板为标的进行历史回测,结果显示,策略效益整体优于基准,与沪深300指数相比,除了年化收益率外,其最大回撤和夏普比率相对差些。

main(code='399006.SZ')
回测标的:创业板指指数
回测期间:20151208—20200812
策略年胜率为:80.0%
策略月胜率为:54.17%
策略周胜率为:54.88%
总收益率:  策略:133.88%,沪深300:-3.75%
年化收益率:策略:21.19%, 沪深300:-0.86%
最大回撤:  策略:37.17%, 沪深300:57.57%
策略Alpha: 0.22, Beta:0.5,夏普比率:1.92

05

结语

本文对各大指数与北上资金的相关性进行了探索性分析,并借鉴华泰金工研报关于利用北上资金来构建择时策略的思路,对沪深300和创业板指数进行了历史回测。回测结果表明,北上资金的流动规模具有一定的实战指示意义,短期内可用于对对大盘的走向进行研判,同时可用于对指数进行择时,指导股指期货交易。本文最后的历史回测与研报原文并未完全吻合,但策略表现上大同小异,可能与回测环境的配置有关,感兴趣的读者可试试采用回测框架(如backtrader)或量化平台进行更严谨的回测。本文的分析仅供学习参考,不构成任何投资建议!

参考资料:

 华泰证券·《北向资金走向预示市场短期或震荡》2020.08

关于Python金融量化

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1620397.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

利用随机森林预测股票大盘涨跌

本文仅从实战角度去观察&#xff0c;利用机器学习算法中&#xff0c;随机森林模型预测股票市场指数涨跌的准确率。 适合入门玩家 首先&#xff0c;我们导入所需要的模块 import numpy as np import pandas as pd import talib as ta #金融数据计算 import datetime,pickle …

大盘涨跌预测及仓位控制思考

今天分享一篇个人在大盘涨跌上的预测及通过涨跌预测延伸的仓位控制思考。 大盘的择时个人一直认为是股票量化中最重要的部分&#xff08;普通的策略&#xff09;。一个好的择时方法&#xff0c;虽然可能会让部分盈利变少&#xff0c;但能够大大的降低回撤。很多策略虽然有很高…

[第七届蓝帽杯全国大学生网络安全技能大赛 蓝帽杯 2023]——Web方向部分题 详细Writeup

Web LovePHP 你真的熟悉PHP吗&#xff1f; 源码如下 <?php class Saferman{public $check True;public function __destruct(){if($this->check True){file($_GET[secret]);}}public function __wakeup(){$this->checkFalse;} } if(isset($_GET[my_secret.flag]…

想要买一款手机!得先用爬虫爬取一下他的评论是否值得买!

1. 网站分析 本文实现的爬虫是抓取京东商城指定苹果手机的评论信息。使用 requests 抓取手机评论 API 信息&#xff0c;然后通过 json 模块的相应 API 将返回的 JSON 格式的字符串转换为 JSON 对象&#xff0c;并提取其中感兴趣的信息。读者可以点击此处打开 京东商城&#xf…

Web前端期末大作业-在线手机商城网站设计(HTML+CSS+JS)

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

优秀网站看前端 —— 小米Note介绍页面

刚开始经营博客的时候&#xff0c;我写过不少“扒皮”系列的文章&#xff0c;主要介绍一些知名站点上有趣的交互效果&#xff0c;然后试着实现它们。后来开始把注意力挪到一些新颖的前端技术上&#xff0c;“扒皮”系列便因此封笔多时。今天打算重开“扒皮”的坑&#xff0c;不…

爬取五大平台621款手机,告诉你双十一在哪买最便宜!

↑关注置顶~ 有趣的不像个技术号 今晚0点&#xff0c;相约剁手 大家好&#xff0c;我是朱小五 明天就是双十一了&#xff0c;看了看自己手里的卡的像IE浏览器的手机&#xff0c;感觉可能等不到5G普及了。 我&#xff01;要&#xff01;换&#xff01;手&#xff01;机&#xff…

宁花4000买手机 不花6元买游戏

宁花4000买手机 不花6元买游戏 2012-03-22 09:17 0评论 阅读数&#xff1a;1005 单独窗口打印放大字号缩小字号 千变万变&#xff0c;国情不变。曾经毁了中国PC游戏市场的那些东西&#xff0c;如今又在iOS游戏市场一一重现&#xff1a;盗版、外挂、抄袭、强制消费、恶意竞争………

买手机选择困难症,Python数据分析帮你解决

每年各大品牌旗舰机发布都是一大热点&#xff0c;特别是前几天发布的iPhone Xs Max算是手机界的大新闻了&#xff0c;新款iPhone的价格也再度刷新了手机定价的记录。看完发布会&#xff0c;相信很多人的心情是这样的&#xff08;文末爬虫资料赠送&#xff09; 我一朋友鱼哥之前…

基于JAVA的盛卖手机销售网站的设计

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;

HTML/CSS/Javascript注册登陆界面全模版(表单验证/验证码生成/敏感词屏蔽/炫酷动画/账号信息储存)

作为前端初学者&#xff0c;我在自学过程中发现了许多自己难以解决的问题&#xff0c;而在搜索相关内容时由于许多资料过于分散&#xff0c;使用起来十分麻烦&#xff0c;所以我在完成相关内容编写后将其整理为一个模块来进行逐个分析。 示例源码&#xff1a;https://download…

小程序如何写一个优美的tab选项卡

小程序如何写一个优美的tab选项卡&#xff1f; 最近有位朋友刚学小程序&#xff0c;于是乎给我传了他写的一个tab选项卡&#xff0c;昨天晚上恰有空闲&#xff0c;于是改了一下 写选项卡的方法有很多&#xff0c;方法也特别简单&#xff0c;本文就介绍一下就客户体验而言如何让…

css html5布局方式_创建新HTML5 / CSS3单页布局–艺术主题

css html5布局方式 HTML5/CSS3 single page layout – Art theme. Today I will like to product new great masterpiece – new template with codename: ‘Art theme’. This will nice HTML5 template with nice gray colors. Hope that you will like new styles and you w…

android popWindow组件微信式实现(较完整版)

效果 PopWinLayout package com.coral3.common_module.components;import android.content.Context; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.Gravity; import android.view.LayoutInflater; import a…

前端学习第四周

目录 一.position定位1.1定位的用法&#xff08;写法&#xff09;1.2relative相对定位1.2.1特性1.2.2实际案例 1.3absolute绝对定位1.3.1特性1.3.2实际案例 1.4fixed&#xff1a;固定定位1.4.1特性1.4.2实际案例 1.5sticky粘性定位1.5.1特性1.5.2实际案例 1.6z-index定位层级1.…

Web前端4

一、relative相对定位 position定位 1.position特性 css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则决定了该元素的最终位置。 2.position取值 static(默认) relative absolute fixed sticky relative相对定位 1.如果没有定位偏移量&am…

Flutter 城市/通讯录列表字母索引联动效果实现

前言 在像通讯录&#xff0c;联系人列表&#xff0c;城市选择列表等数据量比较多的长列表页面中&#xff0c;我们经常会留意到产品设计会在页面的右侧区域提供一个竖向的字母索引列表&#xff0c;供用户点击选择快速定位到长列表中的指定索引位置&#xff0c;以便于用户快速定位…

快给你的Vue项目添加一个编辑图片组件吧

一款功能极其强大的图片编辑插件 tui.image-editor 快速体验 首选在你的前端项目中安装&#xff1a; npm i tui-image-editor // or yarn add tui-image-editor现在你就去新建一个.vue文件&#xff0c;复制进去下面这段代码&#xff1a; <template><div id"t…

QTableWidget表格控件的用法(非常详细)

QTableWidget表格控件的用法&#xff08;非常详细&#xff09; [1] QTableWidget表格控件的用法&#xff08;非常详细&#xff09;[2] QTableWidget详解1.常用API设置自动调整行高和列宽设置表格内容是否可编辑设置行表头、列表头是否显示 2.添加子项3.右键弹出菜单4.设置风格5…

如果你觉得自己对 CSS 变量不熟悉,那么可以补充这个!

作者&#xff1a; Ahmad Shadeed 译者&#xff1a;前端小智 来源&#xff1a;ishadeed 点赞再看&#xff0c;养成习惯 本文 GitHub https://github.com/qq449245884/xiaozhi 上已经收录&#xff0c;更多往期高赞文章的分类&#xff0c;也整理了很多我的文档&#xff0c;和教程资…