1. 上证50指数
上证50指数是根据科学客观的方法,挑选上海证券市场规模大、流动性好的最具代表性的50只股票组成样本股,以综合反映上海证券市场最具市场影响力的一批优质大盘企业的整体状况。上证50指数,指数简称为上证50。
2. 北上资金
在中国股市中,一般“北”指的是沪深两市的股票,“南”指的是指香港股票,因此,北上资金就是指从香港股票中流入大陆股市的资金,同时内地的股票也有流入香港股市的资金,而这个资金被称为南下资金。
3. 获取上证50指数数据
3.1. 从tushare获取数据(tushare地址)
import tushare as ts
import pandas as pd
ts.set_token('...')
pro = ts.pro_api()
def get_index_50(start, end):
index_df = pro.index_daily(ts_code='000016.SH', 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
index_50 = get_index_50(start = '20141117', end = '20200814')
print(index_50.tail(10))```
3.2 50指数的累计收益
all_ret = index_data / index_data.shift(1) - 1 # 将价格数据转为收益率
all_data = all_ret.join(north_money['north_money'], how='inner')
all_data.dropna(inplace=True)
corr = all_data.corr()
从图中可以就看出,现在50指数的点位,基本上已经和15年的牛市点位基本相同。
4.获取北上资金
import tushare as ts
import pandas as pd
ts.set_token('...')
pro = ts.pro_api()
def get_north_money(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.values
# 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
north_money = get_north_money(start = '20141117', end = '20200814')
print(north_money.tail(10))
5. 50指数和北上资金的相关性分析
5.1.获取相关系数
all_ret = index_data / index_data.shift(1) - 1 # 将价格数据转为收益率
all_data = all_ret.join(north_money['north_money'], how='inner')
all_data.dropna(inplace=True)
corr = all_data.corr()
print(corr)
从分析的数据可以看出,北上资金与50指数有一定的正相关关系,为0.27。因为北上资金的体量不大,所以,相关性比较小。所以,我们需要对北上资金做一下积分。
5.2.获取积分后的相关系数
# 我们获取120日的北上资金做积分
all_data.rolling(120).corr().tail(9)
从图中可以看出,相关性达到0.7,有一定实际的参考意义。
5.3. 线性拟合
对北上资金和50指数的散点图进行回归线拟合。图形再次支持了北上资金与50指数的正相关性。
import seaborn as sns
plt.figure(figsize=(10, 6))
sns.regplot(x=list(all_data["north_money"][-120:]),y=list(all_data["50"][-120:]))
plt.title('50 vs North',size=15)
plt.xlabel('North',size=12)
plt.ylabel('50 Rate',size=12)
plt.show()
5.4.北上资金与50指数的收益率相关性
final_data=all_data[['50','north_money']].dropna()
cors=final_data.rolling(120).corr()
cors=cors.dropna().iloc[1::2,0]
cors=cors.reset_index()
cors=cors.set_index('trade_date')
cors['50'].describe()
数据显示,2014年至2020年8月期间,二者相关系数均值为0.29,最大值为0.7。图形显示,二者的相关性近年来逐渐走高。
5.5.策略
策略思路如下:
1、当该日北向资金流入规模 > 过去 252 个交易日的北向资金均值 + 1.5 倍标准差, 则全仓买入50指数;
2、当该日北向资金流入规模 < 过去 252 个交易日的北向资金均值 - 1.5 倍标准差, 则清仓卖出50指数;
3、以第二天开盘价买入(研报是以收盘价来计量)。