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#获取交易日历
import datetime
def get_cal_date(start,end):dates= ak.tool_trade_date_hist_sina()dates['trade_date'] = dates['trade_date'].apply(lambda x:datetime.datetime.strptime(str(x),"%Y-%m-%d"))
#     start = datetime.datetime.strptime(start,"%Y-%m-%d")
#     end =datetime.datetime.strptime(end,"%Y-%m-%d")dates = dates.loc[(dates['trade_date']>=start) & (dates['trade_date']<=end)]return dates
#获取北向资金数据
def get_north_money(start,end):start = datetime.datetime.strptime(start,"%Y-%m-%d")end =datetime.datetime.strptime(end,"%Y-%m-%d")#获取交易日历dates=get_cal_date(start,end)#tushare限制流量,每次只能获取300条记录df= ak.stock_hsgt_north_net_flow_in_em(symbol="北上")df['value']=df['value'].astype(float)df['date']=df['date'].apply(lambda x:datetime.datetime.strptime(x,"%Y-%m-%d"))df = df.loc[(df['date']>=start) & (df['date']<=end)]return df
#获取指数数据
def get_index_data(code,start,end):start = datetime.datetime.strptime(start,"%Y-%m-%d")end =datetime.datetime.strptime(end,"%Y-%m-%d")index_df = ak.stock_zh_index_daily(symbol=code)index_df['date']=index_df['date'].apply(lambda x:datetime.datetime.strptime(str(x),"%Y-%m-%d"))index_df = index_df.loc[(index_df['date']>=start) & (index_df['date']<=end)]#index_df.index=pd.to_datetime(index_df.date)#index_df=index_df.sort_index()return index_df
#获取指数数据
#常用大盘指数
indexs={'上证综指': 'sh000001','深证成指': 'sz399001','沪深300': 'sh000300','创业板指': 'sz399006','上证50': 'sh000016','中证500': 'sh000905','中小板指': 'sz399005','上证180': 'sh000010'}
start='2014-11-17'
end='2022-08-12'
index_data=pd.DataFrame()
for name,code in indexs.items():index_data[name]=get_index_data(code,start,end)['close']
index_data.tail()
#累计收益
(index_data/index_data.iloc[0]).plot(figsize=(14,6))
plt.title('A股指数累积收益率\n 2014-2020',size=15)
plt.show()
#将价格数据转为收益率
all_ret=index_data/index_data.shift(1)-1
all_ret.tail()
north_data=get_north_money(start,end)
all_ret.reset_index()
#north_data.to_csv('north_data.csv')
#north_data=pd.read_csv('north_data',index_col=0,header=0)
all_data=pd.merge(all_ret,north_data,on='date')
all_data.rename(columns={'value':'北向资金'},inplace=True)
all_data.dropna(inplace=True)all_data.corr()
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
def performance(df):df1 = df.loc[:,['ret','capital_ret']]# 计算每一年(月,周)股票,资金曲线的收益year_ret = df1.resample('A').apply(lambda x: (x + 1.0).prod() - 1.0)month_ret = df1.resample('M').apply(lambda x: (x + 1.0).prod() - 1.0)week_ret = df1.resample('W').apply(lambda x: (x + 1.0).prod() - 1.0)#去掉缺失值year_ret.dropna(inplace=True)month_ret.dropna(inplace=True)week_ret.dropna(inplace=True)# 计算策略的年(月,周)胜率year_win_rate = len(year_ret[year_ret['capital_ret'] > 0]) / len(year_ret[year_ret['capital_ret'] != 0])month_win_rate = len(month_ret[month_ret['capital_ret'] > 0]) / len(month_ret[month_ret['capital_ret'] != 0])week_win_rate = len(week_ret[week_ret['capital_ret'] > 0]) / len(week_ret[week_ret['capital_ret'] != 0])#计算总收益率、年化收益率和风险指标total_ret=df[['策略净值','指数净值']].iloc[-1]-1annual_ret=pow(1+total_ret,250/len(df1))-1dd=(df[['策略净值','指数净值']].cummax()-\df[['策略净值','指数净值']])/\df[['策略净值','指数净值']].cummax()d=dd.max()beta=df[['capital_ret','ret']].cov().iat[0,1]/df['ret'].var()alpha=(annual_ret['策略净值']-annual_ret['指数净值']*beta)exReturn=df['capital_ret']-0.03/250sharper_atio=np.sqrt(len(exReturn))*exReturn.mean()/exReturn.std()TA1=round(total_ret['策略净值']*100,2)TA2=round(total_ret['指数净值']*100,2)AR1=round(annual_ret['策略净值']*100,2)AR2=round(annual_ret['指数净值']*100,2)MD1=round(d['策略净值']*100,2)MD2=round(d['指数净值']*100,2)S=round(sharper_atio,2)#输出结果print (f'策略年胜率为:{round(year_win_rate*100,2)}%' )print (f'策略月胜率为:{round(month_win_rate*100,2)}%' )print (f'策略周胜率为:{round(week_win_rate*100,2)}%' )print(f'总收益率:  策略:{TA1}%,沪深300:{TA2}%')print(f'年化收益率:策略:{AR1}%, 沪深300:{AR2}%')print(f'最大回撤:  策略:{MD1}%, 沪深300:{MD2}%')print(f'策略Alpha: {round(alpha,2)}, Beta:{round(beta,2)},夏普比率:{S}')
#对策略累计收益率进行可视化
def plot_performance(df,name):d1=df[['策略净值','指数净值','signal']]d1[['策略净值','指数净值']].plot(figsize=(15,7))for i in d1.index:v=d1['指数净值'][i]if d1.signal[i]==1:plt.scatter(i, v, c='r')if d1.signal[i]==0:plt.scatter(i, v, c='g')plt.title(name+'—'+'北向资金择时交易策略回测',size=15)plt.xlabel('')ax=plt.gca()ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')plt.show()
#将上述函数整合成一个执行函数
def main(code='sh000300',start='2015-12-08',end='2020-08-12',window=252,stdev_n=1.5,cost=0.01):hs300=get_index_data(code,start,end)north_data=get_north_money(start,end)result_df=pd.merge(hs300,north_data,on='date')#print(result_df)result_df=result_df.set_index('date')result_df.rename(columns={'value':'北向资金'},inplace=True)result_df=result_df[['close','open','北向资金']].dropna()df=North_Strategy(result_df,window,stdev_n,cost)name=list (indexs.keys()) [list (indexs.values()).index (code)]print(f'回测标的:{name}指数')#print(df.head())#df.set_index('date')startDate=df.index[0].strftime('%Y%m%d')print(f'回测期间:{startDate}—{end}')performance(df)plot_performance(df,name)
main(code='sh000300')

北向资金运作akshare相关推荐

  1. 北向资金进行股票、期货指数、基金策略

    #%%导入包 import tushare as ts import datetime import pandas as pd import numpy as np import akshare as ...

  2. python 北上资金_如何查看北向资金? 什么是北向资金 在股市里面,南代表的是HK,北代表的是大陆。北向 = 从南向北流动,那么北向资金就很好理解了,就是HK的... - 雪球...

    来源:雪球App,作者: 用Python的小赌徒,(https://xueqiu.com/4141575809/131525135) 什么是北向资金 在股市里面,南代表的是HK,北代表的是大陆.北向 ...

  3. 北上资金 python_股票数据抓取——北上基金持股数据(selenium抓取数据),爬取,之,北向,资金,通过...

    目前很多网站对爬虫都有防范措施,传统的爬数据方法不一定有效.我们只能曲线救国,通过模拟网页浏览方式爬取数据,虽然速度慢,既能达到目标又不会网站服务器增加压力,双赢吧. Python环境要先下载sele ...

  4. python 北上资金_python爬虫技术:北向资金数据自动爬取!

    好久不见!今天我们继续python的话题啦.python现在势头凶得很,没事刷抖音.刷朋友圈.看公众号,弹出的广告总少不了python."python带你发家致富,财富自由!"广告 ...

  5. 基于北向资金指数择时策略验证与思考

    基于北向资金指数择时策略验证与思考 本文思路华泰金工研量化资产配置7月月报<北向资金走向预示市场短期或震荡>关于北上资金的择时思路,构建基于北向资金的股市择时策略,并进行历史回测.结果表明 ...

  6. 拉伯证券|A股延续强势格局 北向资金开年以来净买入超1500亿元

    周四,A股商场整体延续强势格局,沪指贴合5日均线震动向上.科技板块仍是干流热点,半导体板块大面积飘红,创新药.CRO等生长赛道均涨势杰出. 到收盘,上证综指报3285.67点,涨0.02%:深证成指报 ...

  7. 基于北向资金的择时买入卖出策略复现

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 位卑未敢忘忧国,事定犹须待阖棺. ...

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

    01 引言 中国证监会于 2014 年和 2016 年分别批准了沪港通和深港通,建立了大陆和香港股市的互联互通机制,市场通常把沪股通和深股通的合计流入资金称为北向资金.换句话说,北上资金就是指从香港流 ...

  9. 金融知识小科普 - 北向资金

    --------------------------------------- 本文仅作为知识科普,无任何投资倾向,投资有风险,投资需谨慎. ----------------------------- ...

最新文章

  1. RecycleView 动画实现
  2. 谁能够在萧条中生存?历史总是惊人相似的(转)
  3. Spring构造注入
  4. 【全国动态】服务器列表
  5. java soot_正确执行3个地址代码的SOOT API
  6. 计算机网络——物理层基本概念
  7. Effective_STL 学习笔记(四) 用 empty 来代替检查 size() 是否为0
  8. 云原生2.0时代:企业更应了解一下容器安全
  9. vue scss @font-face 路径问题
  10. Mysql允许root用户远程访问
  11. 浅谈前后端分离与实践 之 nodejs 中间层服务
  12. MVC的优点及不足之处
  13. CSUST-2018区域赛选拔个人赛-1019 看直播(二分+DP)
  14. WIFI和蓝牙无线模块的应用小结
  15. K8S还没用,又出个K9S,什么鬼?
  16. 专利挖掘和撰写(京东技术资质申请和创造专利挖掘)
  17. msdia80.dll 是干什么的?这个文件可以删除吗?
  18. matlab的kron函数(kronecker乘积)
  19. VirtualBox安装Mac OS 10.11——虚拟机安装黑苹果
  20. SQL Server安装和修改身份验证方式

热门文章

  1. Linux内核 scatterlist介绍
  2. STL源码剖析 关联式容器
  3. 使用openssl开源AES算法,实现aes、aes-cbc和aes-ecb对字符串的加解密
  4. uninitialized_copy测试代码示例
  5. Java基础——深入理解Java线程池
  6. C语言typedef关键字—伟大的缝纫师
  7. Linux目录架构详解
  8. 程序员:开汽车,难道我要知道汽车的原理才能把车开好吗?
  9. FFmpeg的C++封装:FFmpegWrapper
  10. Visual Studio 使用说明文档、VScode 使用手册