北向资金运作akshare

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')

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络性能测试工具iperf详细使用图文教程【转载】

原文&#xff1a;https://www.cnblogs.com/yingsong/p/5682080.html 转载于:https://www.cnblogs.com/luo30zhao/p/10512042.html

代码审查:程序员内炼之道

摘要&#xff1a;“关注并弄清楚桥梁修建细节&#xff0c;否则你建起来的桥梁有可能坍塌。”代码审查更重要的是一种技术分享或者代码共享。程序员如何提升自我修炼之道&#xff0c;欢迎来支招。 代码审查更重要的是一种技术分享或者代码共享。在审查过程中&#xff0c;通过被…

扎实的基础是成功的法宝

转载链接&#xff1a;https://baijiahao.baidu.com/s?id1610187127874738836&wfrspider&forpc好基础是好成绩的根本,无论做任何事情,基本功的训练是成功的前提:“还没有学会走,就想学跑,那不行,肯定会摔跟头。”这是成功人士的经验之谈。要建成高楼大厦,地基必须打好。…

发送qq邮件

import smtplib from email.mime.text import MIMEText from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication# 写成了一个通用的函数接口&#xff0c;想直接用的话&#xff0c;把参数…

排序代码(python,c++) 及 基本算法复杂度

0.导语 本节为手撕代码系列之第一弹&#xff0c;主要来手撕排序算法&#xff0c;主要包括以下几大排序算法&#xff1a; 直接插入排序 冒泡排序 选择排序 快速排序 希尔排序 堆排序 归并排序 1.直接插入排序 【算法思想】 每一步将一个待排序的记录&#xff0c;插入到前面…

TCP/IP四层模型与OSI参考模型

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 TCP/IP四层模型&#xff1a; 1.链路层&#xff08;数据链路层/网络接口层&#xff09;&#xff1a;包括操作系统中的设备驱动程序、计算…

Metal日记:使用步骤指南

本文参考资料&#xff1a; juejin.im/post/5b1e8f… xiaozhuanlan.com/topic/04598… developer.apple.com/videos/play… github.com/quinn0809/G… cloud.tencent.com/developer/a… devstreaming-cdn.apple.com/videos/wwdc… Metal处理逻辑 无论是CoreImage、GPUImage框架&…

还驾驭不了4核? 别人已模拟出百万核心上的并行

摘要&#xff1a;不管是台式机还是笔记本&#xff0c;四核双核都已经不是新鲜的事了。计算机领域的你可能已经认识到了给电脑选配4核的处理器完全是一种浪费&#xff0c;因为大多数的程序都不支持多核心的并行处理。然而斯坦福的计算机科学家最近公布&#xff0c;他们已经模拟出…

docker安装并运行ubuntu

拉取镜像 docker pull dorowu/ubuntu-desktop-lxde-vnc 运行容器&#xff1a; docker run -p 6080:80 dorowu/ubuntu-desktop-lxde-vnc 之后就可以http://localhost:6080/

Django内置权限扩展案例

当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统&#xff0c;Django内置权限系统基于model层做控制&#xff0c;新的model创建后会默认新建三个权限&#xff0c;分别为&#xff1a;add、change、delete&#xff0c;如果给…

Java 从入门到高级学习路线

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Java 从入门到高级学习路线《一》1.Jvm 部分Jvm 内存模型、Jvm 内存结构、Jvm 参数调优、Java 垃圾回收《二》Java 基础部分1.必须会使用…

Flutter Mac iOS 环境配置

官方文档&#xff1a;flutter.io/docs/get-st… 1.需要的命令行工具 bash curl git 2.x mkdir rm unzip which 2.SDK下载地址 flutter_macos_v1.0.0-stable.zip storage.googleapis.com/flutter_inf… 3.解压Flutter SDK cd ~/Flutter/SDK $ unzip ~/Downloads/flutter_macos_v…

多线程研究1

单线程&#xff1a; from urllib.request import urlretrieve import time import random starttime.time() fopen(E:\Python\py\web\hh.txt,r)#打开存放URL的文件 af.readlines() f.close() for i in a:brandom.randint(0,30)urlretrieve(i,%d.png%b) endtime.time() print(…

android viewpage预加载和懒加载问题

1、本人理解懒加载和预加载问题某种情况下可以归结为一类问题&#xff0c;下面我就说一下我遇到的预加载问题和懒加载问题及解决的相应方法&#xff1a; - [1 ] 预加载问题 描述&#xff1a;我用到了三个fragment、viewpage及tablayout实现点击切换、滑动切换。 …

大数据,且行且思

“大数据”概念于20世纪90年代被提出&#xff0c;最初只是对一些在一定时间内无法用传统方法进行抓取、管理和处理的数据的统称。随着时间的推移和科技的发展以及物联网、移动互联网、SNS的兴起&#xff0c;每年产生的数据量都以几何级数增长&#xff0c;《IDC Digital Univers…

IntelliJ IDEA中新建JAVA WEB项目、maven项目

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 在IntelliJ IDEA 中新建一个Web应用项目。 1、 在主界面顶部菜单栏依次“File”-"New"-"Project..." 2、在对话框中…

S/4HANA业务角色概览之订单到收款篇

2019独角兽企业重金招聘Python工程师标准>>> 大家好我叫Sean Zhang&#xff0c;中文名张正永。目前在S/4HANA产品研发部门任职产品经理&#xff0c;而这一阶段要从2017年算起&#xff0c;而在那之前接触更多还是技术类的&#xff0c;比如做过iOS、HANA、ABAP、UI5等…

掘金量化的一个代码,对本人写策略避免入坑有重要意义

# codingutf-8from __future__ import print_function, absolute_import, unicode_literalsfrom gm.api import *import numpy as npdef init(context):# 选择的两个合约context.symbol [DCE.j1901, DCE.jm1901]# 订阅历史数据subscribe(symbolscontext.symbol,frequency1d,co…

C++ STL学习笔记

C STL学习笔记一 为何要学习STL&#xff1a; 数据结构与算法是编程的核心&#xff0c;STL中包含各种数据结构和优秀的算法&#xff0c;确实值得深入学习&#xff0c;本文中虽然着重使用&#xff0c;但希望有心的朋友能多看看相关数据结构的实现&#xff0c;对于C语言确实会有较…

ItelliJ IDEA开发工具使用—创建一个web项目

转自&#xff1a;https://blog.csdn.net/wangyang1354/article/details/50452806概念需要明确一下IDEA中的项目&#xff08;project&#xff09;与eclipse中的项目&#xff08;project&#xff09;是不同的概念&#xff0c;IDEA的project 相当于之前eclipse的workspace,IDEA的M…