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.mzph.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 Efficiency 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…