akshare做mfi策略

#!/usr/bin/env python
# coding: utf-8#先引入后面可能用到的包(package)
import pandas as pd  
import numpy as np
import matplotlib.pyplot as plt#正常顯示畫圖時出現的中文和負號
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False#引入TA-Lib庫
import talib as ta
import time
from datetime import datetime, timedelta
# import tushare as ts
# df=ts.get_k_data('sh',start='2000-01-01')
# df.index=pd.to_datetime(df.date)
# df=df.sort_index()
# df['ret']=df.close/df.close.shift(1)-1
# df.head()
import akshare as ak
from_date = '2010-01-01'
from_date = datetime.strptime(from_date,"%Y-%m-%d")
day_nums = 1
current_dt = time.strftime("%Y-%m-%d", time.localtime())
current_dt = datetime.strptime(current_dt, '%Y-%m-%d')
df = ak.stock_zh_a_daily(symbol='sh000001',start_date = from_date,end_date =  current_dt)
df.index=pd.to_datetime(df.date)
df=df.sort_index()
df['ret']=df.close/df.close.shift(1)-1high,low,close,volume=df.high.values,df.low.values,df.close.values,df.volume.values
df['mfi']=ta.MFI(high, low, close, volume, timeperiod=14)
plt.figure(figsize=(16,14))
plt.subplot(211)
df['close'].plot(color='r')
plt.xlabel('')
plt.title('上證綜指走勢',fontsize=15)
plt.subplot(212)
df['mfi'].plot()
plt.title('MFI指標',fontsize=15)
plt.xlabel('')
plt.show()# 計算方法  
# 
# 1.典型價格(TP)=當日最高價、最低價與收盤價的算術平均值  
# 
# 2.貨幣流量(MF)=典型價格(TP)×N日內成交量  
# 
# 3.如果當日MF>昨日MF,則將當日的MF值視為正貨幣流量(PMF)  
# 
# 4.如果當日MF<昨日MF,則將當日的MF值視為負貨幣流量(NMF)  
#  
# 5.MFI=100-[100/(1+PMF/NMF)]  
# 
# 6.參數N一般設為14日。  
# 
# 應用法則  
# 
# 1.顯示超買超賣是MFI指標最基本的功能。當MFI>80時為超買,在其回頭向下跌破80時,為短線賣出時機。
# 
# 2.當MFI<20時為超賣,當其回頭向上突破20時,為短線買進時機。
# 
# 3.當MFI>80,而產生背離現象時,視為賣出信號。
# 
# 4.當MFI<20,而產生背離現象時,視為買進信號。
# 
# 注意要點
# 
# 1.經過長期測試,MFI指標的背離訊號更能忠實的反應股價的反轉現象。一次完整的波段行情,至少都會維持一定相當的時間,反轉點出現的次數并不會太多。
# 
# 2.將MFI指標的參數設定為14天時,其背離訊號產生的時機,大致上都能和股價的頂點吻合。因此在使用MFI指標時,參數設定方面應盡量維持14日的原則。
# 熔融流動指數:MFI,無紡布熔融噴絲中常用參數。# In[186]:#當前日的MFI<20,而當日的MFI>20時,買入信號設置為1
for i in range(15,len(df)):if df['mfi'][i]>20 and df['mfi'][i-1]<20:df.loc[df.index[i],'收盤信號']=1if df['mfi'][i]<80 and df['mfi'][i-1]>80:df.loc[df.index[i],'收盤信號']=0#計算每天的倉位,當天持有上證指數時,倉位為1,當天不持有上證指數時,倉位為0
pd.options.mode.chained_assignment = None
df['當天倉位']=df['收盤信號'].shift(1)
df['當天倉位'].fillna(method='ffill',inplace=True)from datetime import datetime,timedelta
d=df[df['當天倉位']==1].index[0]-timedelta(days=1)
df_new=df.loc[d:]
df_new['ret'][0]=0
df_new['當天倉位'][0]=0#當倉位為1時,買入上證指數,當倉位為0時,空倉,計算資金指數
df_new['資金指數']=(df_new.ret*df['當天倉位']+1.0).cumprod()
df_new['指數凈值']=(df_new.ret+1.0).cumprod()df.close.plot(figsize=(16,7))
for i in range(len(df)):if df['收盤信號'][i]==1:plt.annotate('買',xy=(df.index[i],df.close[i]),arrowprops=dict(facecolor='r',shrink=0.05))if df['收盤信號'][i]==0:plt.annotate('賣',xy=(df.index[i],df.close[i]),arrowprops=dict(facecolor='g',shrink=0.1))    
plt.title('上證指數2000-2019年MFI買賣信號',size=15)
plt.xlabel('')
ax=plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.show()#查看最近兩年情況
df1=df.loc['2016-01-01':,]
df1.close.plot(figsize=(16,7))
for i in range(len(df1)):if df1['收盤信號'][i]==1:plt.annotate('買',xy=(df1.index[i],df1.close[i]),arrowprops=dict(facecolor='r',shrink=0.05))if df1['收盤信號'][i]==0:plt.annotate('賣',xy=(df1.index[i],df1.close[i]),arrowprops=dict(facecolor='g',shrink=0.1))    
plt.title('上證指數2016-2019年MFI買賣信號',fontsize=15)
plt.xlabel('')
ax=plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.show()df1['策略凈值']=(df1.ret*df1['當天倉位']+1.0).cumprod()
df1['指數凈值']=(df1.ret+1.0).cumprod()df1['策略收益率']=df1['策略凈值']/df1['策略凈值'].shift(1)-1
df1['指數收益率']=df1.ret
total_ret=df1[['策略凈值','指數凈值']].iloc[-1]-1
annual_ret=pow(1+total_ret,250/len(df_new))-1
dd=(df1[['策略凈值','指數凈值']].cummax()-df1[['策略凈值','指數凈值']])/df1[['策略凈值','指數凈值']].cummax()
d=dd.max()
beta=df1[['策略收益率','指數收益率']].cov().iat[0,1]/df1['指數收益率'].var()
alpha=(annual_ret['策略凈值']-annual_ret['指數凈值']*beta)
exReturn=df1['策略收益率']-0.03/250
sharper_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'累計收益率:策略{TA1}%,指數{TA2}%;\n年化收益率:策略{AR1}%,指數{AR2}%;\n最大回撤:  策略{MD1}%,指數{MD2}%;\n策略alpha: {round(alpha,2)},策略beta:{round(beta,2)}; \n夏普比率:  {S}')df1[['策略凈值','指數凈值']].plot(figsize=(15,7))
plt.title('上證指數與MFI指標策略\n2016年1月1日至今',size=15)bbox = dict(boxstyle="round", fc="w", ec="0.5", alpha=0.9)plt.text('2017-05-01', 0.75, f'累計收益率:策略{TA1}%,指數{TA2}%;\n年化收益率:策略{AR1}%,指數{AR2}%;\n最大回撤:  策略{MD1}%,指數{MD2}%;\n策略alpha: {round(alpha,2)},策略beta:{round(beta,2)}; \n夏普比率:  {S}',         size=13,bbox=bbox)  
plt.xlabel('')
ax=plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
plt.show()def get_data(code,date):#df=ts.get_k_data(code,start=date)from_date = '2010-01-01'from_date = datetime.strptime(from_date,"%Y-%m-%d")day_nums = 1current_dt = time.strftime("%Y-%m-%d", time.localtime())current_dt = datetime.strptime(current_dt, '%Y-%m-%d')df = ak.stock_zh_a_daily(symbol='sh000001',start_date = from_date,end_date =  current_dt)df.index=pd.to_datetime(df.date)df=df.sort_index()df['ret']=df.close/df.close.shift(1)-1return df#關掉pandas的warnings
pd.options.mode.chained_assignment = None
def strategy(code,date,L,H):df=get_data(code,date)high,low,close,volume=df.high.values,df.low.values,df.close.values,df.volume.valuesdf['mfi']=ta.MFI(high, low, close, volume, timeperiod=14)for i in range(14,len(df)):if df['mfi'][i]>L and df['mfi'][i-1]<L:df.loc[df.index[i],'收盤信號']=1if df['mfi'][i]<H and df['mfi'][i-1]>H:df.loc[df.index[i],'收盤信號']=0df['當天倉位']=df['收盤信號'].shift(1)df['當天倉位'].fillna(method='ffill',inplace=True)d=df[df['當天倉位']==1].index[0]-timedelta(days=1)df1=df.loc[d:]df1['ret'][0]=0df1['當天倉位'][0]=0#當倉位為1時,買入上證指數,當倉位為0時,空倉,計算資金指數df1['策略凈值']=(df1.ret.values*df1['當天倉位'].values+1.0).cumprod()df1['指數凈值']=(df1.ret.values+1.0).cumprod()df1['策略收益率']=df1['策略凈值']/df1['策略凈值'].shift(1)-1df1['指數收益率']=df1.rettotal_ret=df1[['策略凈值','指數凈值']].iloc[-1]-1annual_ret=pow(1+total_ret,250/len(df_new))-1dd=(df1[['策略凈值','指數凈值']].cummax()-df1[['策略凈值','指數凈值']])/df1[['策略凈值','指數凈值']].cummax()d=dd.max()beta=df1[['策略收益率','指數收益率']].cov().iat[0,1]/df1['指數收益率'].var()alpha=(annual_ret['策略凈值']-annual_ret['指數凈值']*beta)exReturn=df1['策略收益率']-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)df1[['策略凈值','指數凈值']].plot(figsize=(15,7))plt.title('上證指數與MFI指標策略\n'+date+'至今',size=15)bbox = dict(boxstyle="round", fc="w", ec="0.5", alpha=0.9)plt.text(df1.index[int(len(df1)/5)], df1['指數凈值'].max()/1.5, f'累計收益率:策略{TA1}%,指數{TA2}%;\n年化收益率:策略{AR1}%,指數{AR2}%;\n最大回撤:  策略{MD1}%,指數{MD2}%;\n策略alpha: {round(alpha,2)},策略beta:{round(beta,2)}; \n夏普比率:  {S}',size=13,bbox=bbox)  plt.xlabel('')ax=plt.gca()ax.spines['right'].set_color('none')ax.spines['top'].set_color('none')plt.show()strategy('sh','2009-05-12',20,80)strategy('sh','2009-04-12',20,90)strategy('sh','2009-04-12',20,95)strategy('sh','2009-04-12',30,95)strategy('sh','2009-04-12',15,95)strategy('sh','2016-01-01',20,90)strategy('sh','2000-01-01',20,80)strategy('sh','2000-01-01',20,92)strategy('sh','2017-04-12',20,80)strategy('sh','2017-04-12',20,92)strategy('cyb','2017-04-01',20,80)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449569.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449569.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449569.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第二章學習小結

第二章學習小結 對比于上學期所學的知識&#xff0c;能切實感覺到這個學期的課程更加深入和抽象&#xff0c;在學習上難度也有所增加&#xff0c;雖然上個學期就聽老師推薦過博客園&#xff0c;但是真正開始寫博客還是第一次&#xff0c;最直觀的感受就是在完成博客的過程中&am…

翁同龢后人向上海博物館捐贈兩件重要家藏

1月24日&#xff0c;翁萬戈先生捐贈書畫儀式在上海博物館內舉行。 上海博物館 供圖 1月24日&#xff0c;翁萬戈先生捐贈書畫儀式在上海博物館內舉行。 上海博物館 供圖 中新網上海1月24日電 (王笈)翁同龢后人翁以鈞24日攜夫人柳至善&#xff0c;代表翁萬戈將兩件翁氏家族的重要…

mysql數據庫操作

連接mysql from sqlalchemy import create_engine import pandas as pd import numpy as np import matplotlib.pyplot as plt import pymssql from scipy.interpolate import interp1dfrom datetime import timedelta #正常顯示畫圖時出現的中文和負號 from pylab import mpl…

AutoHotkey調用VBA實現批量精確篩選數據透視表某字段內容。

如上圖&#xff0c;想在數據透視表中只顯示紅色區域的內容&#xff0c;手動勾選就比較繁瑣。 實現思路&#xff1a; 先復制紅色的內容。鼠標停留在數據透視表【型號】列的任意數據上&#xff08;通過該單元格可以獲取數據透視表和字段&#xff09;由于數據透視表的字段不能全部…

SQL中的case when then else end用法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Case具有兩種格式。簡單Case函數和Case搜索函數。 --簡單Case函數 CASE sexWHEN 1 THEN 男WHEN 2 THEN 女 ELSE 其他 END --Case搜索函數…

HEVC/H265 性能分析

HEVC/H265 標準中的目標是&#xff1a;H264的碼率一般&#xff0c;質量一樣&#xff0c;是否達到&#xff0c;數據說話。 下面是視頻編解碼大師測試數據&#xff1a; HEVC: is it really twice as good as H.264? The new standard for video compression, High Efficiency V…

“90后”臺灣籍乘務長的第一個大陸春運

中新網上海1月25日電 題&#xff1a;“90后”臺灣籍乘務長的第一個大陸春運 中新網記者 李佳佳 黃佳瑩&#xff0c;“90后”的臺北妹子。年紀雖小&#xff0c;資歷卻不淺&#xff0c;2018年她晉升為春秋航空客艙部乘務長&#xff0c;成為大陸首批臺灣籍乘務長之一。“90后”臺灣…

mysql+tushare搭建本地數據庫

創建股票數據庫 #!/usr/bin/env python # -*- coding: utf-8 -*- # Date : 2018-09-04 14:34:59 # Author : Michael Li # Version : $V2.0$import pandas as pd import numpy as np import datetime import random import pymssql from sqlalchemy import create_engine …

hbase單機搭建

一、下載 https://hbase.apache.org/downloads.html  2.1.3版本 解壓&#xff0c;拷貝到文件夾 /hbase/hbase-2.1.3 設置HBASE_HOME環境變量&#xff0c;把它加到path環境變量中去 source /etc/profile 二、配置 &#xff11;.在/data下創建目錄 mkdir /data/hbase mkdir /d…

mysql查詢報錯: ORDER BY clause is not in GROUP BY..this is incompatible with sql_mode=only_full_group_by

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 我的情況 &#xff1a; Mysql 5.7.21 版本運行sql 報錯如題&#xff0c;同樣的 sql 直接本地運行不報錯。 但是當連接的是服務器上的 …

多股票投資組合+馬科維茨計算組合

import matplotlib.pyplot as plt from pandas import read_excel import numpy as np import tushare as ts import pandas as pd import datetime token prots.pro_api(token) 獲取財務數據 #獲取財務數據 ticker_list [601318.SH,601336.SH,601398.SH,601888.SH,603993.S…

并發編程(十六)——java7 深入并發包 ConcurrentHashMap 源碼解析

以前寫過介紹HashMap的文章&#xff0c;文中提到過HashMap在put的時候&#xff0c;插入的元素超過了容量&#xff08;由負載因子決定&#xff09;的范圍就會觸發擴容操作&#xff0c;就是rehash&#xff0c;這個會重新將原數組的內容重新hash到新的擴容數組中&#xff0c;在多線…

[邊分治+線段樹合并]「CTSC2018」暴力寫掛

題目梗概 給出兩棵1為根的樹,求\(d[x]d[y]-d[lca(x,y)]-d[lca(x,y)]\)的最大值 解題思路 套路化簡之后\((d[x]d[y]dis(x,y)-2*d[lca(x,y)])/2\) 第二棵樹上的lca化不掉,所以考慮在第二棵上枚舉lca 先說說這題的解法,邊分樹的合并. 邊分和點分有什么區別,邊分在合并類似\(d[x]d[…

HEVC/H265 文檔獲得

HEVC/H265文檔是很重要的標準&#xff0c;因為代碼有時由于效率問題而修改&#xff0c;這是最重要的參考&#xff1a; HEVC approved by ITU-T and ISO/IEC "Geneva, 25 January 2013 – A new video coding standard building on the PrimeTime Emmy award winning IT…

期權計算隱含波動率

牛頓迭代法 from scipy.stats import norm import numpy as np def bscall(S,K,r,sigma,t):d1(np.log(S/K)(r0.5*sigma**2)*t)/(sigma*np.sqrt(t))d2d1-sigma*np.sqrt(t)return S*norm.cdf(d1)-K*np.exp(-r*t)*norm.cdf(d2) def bsput(S,K,r,sigma,t):d1(np.log(S/K)(r0.5*sigm…

進擊的二維碼 | ArcBlock 課堂預告

ArcBlock Technical Learning Series 第十七期進擊的二維碼本周三&#xff0c;1 月 30 日下午 1:30 時 &#xff08;美國太平洋時間 29日下午 21:30 時&#xff09;&#xff0c;由 ArcBloc 后端工程師孫博山 授課。復制代碼二維碼源于日本,如今世界各國都在使用。一張簡單的二維…

期權數據計算

判斷是否為調倉日 ef is_adjust_day(self, dom1):判斷是否是每月的調倉日。 :params int dom: 每月第幾個交易日進行調倉&#xff0c;缺省是第1個交易日。:return: 如果是調倉日&#xff0c;返回True&#xff0c;否則返回False。ret Falsetoday self.datetime.date()…

由Docker的MySQL官方鏡像配置的容器無法啟動問題解決辦法(修改配置后無法啟動)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 為了方便閱讀&#xff0c;我在原文基礎上加了一些批注&#xff0c;說明我自己的情況&#xff0c;用紅色標示。 這篇文章記錄了我在使用…

HEVC/H265 主要設計者談HEVC/H265

Overview of the High Ef?ciency Video Coding (HEVC) Standard Gary J. Sullivan, Fellow, IEEE, Jens-Rainer Ohm, Member, IEEE, Woo-Jin Han, Member, IEEE, and Thomas Wiegand, Fellow, IEEE Gary J. Sullivan是H263&#xff…

阿里云 Aliplayer高級功能介紹(九):自動播放體驗

基本介紹經常會碰到客戶詢問&#xff0c;為什么我設置了autoplay為true&#xff0c;但是沒有自動播放&#xff0c;每次都要向客戶解釋這個是瀏覽器從用戶體驗角度考慮做的限制&#xff0c;客戶會繼續詢問那我要怎么做&#xff1f; 針對這個問題Aliplayer也專們做過優化&#xf…