北向資金運作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.pswp.cn/news/449684.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449684.shtml
英文地址,請注明出處:http://en.pswp.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…