当前位置: 首页 > 科技观察

十行代码画出漂亮的金融烛台图,你不能错过的神器_0

时间:2023-03-18 16:12:34 科技观察

Mplfinance是Matplotlib组织开源项目的一部分。与Matplotlib相比,Mplfinance这个金融行业垂直领域的模块,确实受到的关注较少,以至于很多朋友都不知道它的存在。事实上,它非常实用且易于使用。1.在开始之前,您需要确保您的计算机上已经成功安装了Python和pip。如果没有,可以访问这篇文章:超详细的Python安装指南进行安装。(可选1)如果使用Python进行数据分析,可以直接安装Anaconda:Anaconda,Python数据分析和挖掘的好帮手,内置Python和pip。(可选2)另外,推荐大家使用VSCode编辑器,它有很多优点:Python编程的最佳拍档——VSCode详解指南。请选择以下方式之一输入命令安装依赖项:1.Windows环境打开Cmd(开始-运行-CMD)。2.在MacOS环境下,打开Terminal(command+空格进入Terminal)。3.如果你使用的是VSCode编辑器或者Pycharm,可以直接使用界面下方的Terminal.pipinstall--upgrademplfinance。2.基本使用我们以沪深300分钟线为例,使用mplfinance绘制各种金融图形。先看数据结构:importpandasaspdmins=pd.read_csv('sh300_1min.csv',index_col=0,parse_dates=True)print(mins)结构如下:dayopenhighlowclosevolume02022-03-0710:47:004406.2234406.3524405.6624405.9225434540012022-03-0710:48:004406.1724406.1754403.8344403.9187080310022022-03-0710:49:004403.3334403.3334402.2354402.3404963250032022-03-0710:50:004402.3304402.5194401.8384402.51948159200我们用于mplfinance的数据必须是PandasDataFrame。按需提供字段,至少一个时间字段和一列数据。另外,如果原始数据是其他数据类型,必须先将其转换成DataFrame格式。另外,时间字段必须转为DatetimeIndex:#公众号:Erqialquantificationimportpandasaspdimportmplfinanceasmpfmins=pd.read_csv('sh300_1min.csv',index_col=0,parse_dates=True)mins["day"]=pd.to_datetime(mins["day"])mins=mins.set_index("day")mins.index.name='Time'print(mins)效果如下:openhighlowclosevolumeTime2022-03-0710:47:004406.2234406.3524405.6624405.922543454002022-03-0710:48:004406.1724406.1754403.8344403.918708031002022-03-0710:49:004403.3334403.3334402.2354402.340496325002022-03-0710:50:004402.3304402.5194401.8384402.51948159200准备完成后可以绘制图表:#公众号:erqialquantificationimportpandasaspdimportmplfinanceasmpfmins=pd.read_csv('sh300_1min.csv',index_col=0,parse_dates=True"day"]=pd.to_datetime(mins["day"])mins=mins.set_index("day")mins.index.name='Time'#绘制默认图像(美国线)mpf.plot(mins)绘制蜡烛图表(K线图),in为了避免图表太大,我这里只取了240根K线:#公众号:Erqialquantificationimportpandasaspdimportmplfinanceasmpfmins=pd.read_csv('sh300_1min.csv',index_col=0,parse_dates=True)mins["day"]=pd.to_datetime(mins["day"])mins=mins.set_index("day")mins.index.name='Time'candle_chart=分钟。tail(240)mpf.plot(candle_chart,type='candle')黑白颜色太单调,我们可以换成“yahoo”配色:mpf.plot(candle_chart,type='candle',style='yahoo')绘制折线图:#公众号:Erqialquantificationimportpandasaspdimportmplfinanceasmpfmins=pd.read_csv('sh300_1min.csv',index_col=0,parse_dates=True)mins["day"]=pd.to_datetime(mins["day"])mins=mins.set_index("day")mins.index.name='Time'mpf.plot(mins,type='line')除了美线,烛台图(K线),line除了图表,mplfinance还支持renko、pnf等图表有兴趣的同学可以换个类型看看效果:3.添加技术指标绘制简单移动平均线MA5,我们只需要再添加一个参数即可:read_csv('sh300_1min.csv',index_col=0,parse_dates=True)mins["day"]=pd.to_datetime(mins["day"])mins=mins.set_index("day")mins.index.name='Time'candle_chart=mins.tail(240)mpf.plot(candle_chart,type='candle',mav=5)如果你需要多个移动平均线,只需将mav更改为元组参数并传入你需要的Period参数:如果还需要显示体积(volume),mplfinance也可以实现:#公众号:Erqialquantificationimportpandasaspdimportmplfinanceasmpfmins=pd.read_csv('sh300_1min.csv',index_col=0,parse_dates=True)mins["day"]=pd.to_datetime(mins["day"])mins=mins.set_index("day")mins.index.name='Time'candle_chart=mins.tail(240)mpf.plot(candle_chart,type='candle',mav=(5,10,20),volume=True)如果您还想给蜡烛上色,改变线条颜色,添加其他指标,请看第三部分高级使用。4、着色的高级使用非常简单,就像我们之前改成雅虎颜色一样,只需要添加style参数就可以改成我们传统的技术指标颜色。如果你想自定义颜色,你也可以这样做。这里我设置前120列为蓝色和黄色,后120列保持原来的形状:#公众号:Erqialquantificationimportpandasaspdimportmplfinanceasmpfmins=pd.read_csv('sh300_1min.csv',index_col=0,parse_dates=True)mins["day"]=pd.to_datetime(mins["day"])mins=mins.set_index("day")mins.index.name='Time'candle_chart=mins.tail(240)mco=['yellow','blue']*60+[None]*120mpf.plot(candle_chart,volume=True,style='yahoo',type='candle',marketcolor_overrides=mco)效果如下:有的同学也想自己画技术指标,mplfinance也可以:上滑查看更多代码#公众号:二七阿尔量化#https://github.com/matplotlib/mplfinance/blob/master/examples/mpf_animation_macd.py#L28importpandasaspdimportmplfinanceasmpfimportmatplotlib.animationasanimationmins=pd.read_csv('sh300_1min.csv',index_col=0,parse_dates=True)mins["天"]=pd.to_datetime(mins["day"])mins=mins.set_index("day")mins.index.name='Time'candle_chart=mins.tail(240)df=candle_chartex12=df['close'].ewm(span=12,adjust=False).mean()exp26=df['close'].ewm(跨度=26,调整=假).mean()macd=exp12-exp26signal=macd.ewm(span=9,adjust=False).mean()histogram=macd-signalapds=[mpf.make_addplot(exp12,color='lime'),mpf.make_addplot(exp26,color='c'),mpf.make_addplot(直方图,type='bar',width=0.7,panel=1,color='dimgray',alpha=1,secondary_y=False),mpf.make_addplot(macd,panel=1,color='fuchsia',secondary_y=True),mpf.make_addplot(信号,panel=1,color='b',secondary_y=True),]s=mpf.make_mpf_style(base_mpf_style='classic',rc={'figure.facecolor':'lightgray'})fig,axes=mpf.plot(df,type='candle',addplot=apds,figscale=1.5,figratio=(7,5),title='\n\nMACD',style=s,volume=True,volume_panel=2,panel_ratios=(6,3,2),returnfig=True)mpf.show()mpf.make_addplot支持添加任意图形到任意面板,面板参数都是默认为0,如果设置为1,图形会添加到第二个图形中,color参数可以设置图形的颜色,secondary_y可以设置图形的值到y轴效果如下:另外,如果想动态看到整个绘制过程,只需要添加一个动画即可:向上滑动查看更多代码#公众号:Erqialquantificationimportpandasaspdimportmplfinanceasmpfimportmatplotlib.animationasanimationmins=pd.read_csv('sh300_1min.csv',index_col=0,parse_dates=True)mins["day"]=pd.to_datetime(mins["day"])mins=mins.set_index("day")mins.index.name='Time'candle_chart=mins.tail(240)df=candle_chartexp12=df['close'].ewm(span=12,adjust=False).mean()exp26=df['close'].ewm(span=26,adjust=False).mean()macd=exp12-exp26signal=macd.ewm(span=9,adjust=False).mean()histogram=macd-signalapds=[mpf.make_addplot(exp12,color='lime'),mpf.make_addplot(exp26,color='c'),mpf.make_addplot(直方图,type='bar',width=0.7,panel=1,color='dimgray',alpha=1,secondary_y=False),mpf.make_addplot(macd,panel=1,color='fuchsia',secondary_y=True),mpf.make_addplot(signal,panel=1,color='b',secondary_y=True),]s=mpf.make_mpf_style(base_mpf_style='经典',rc={'figure.facecolor':'lightgray'})fig,axes=mpf.plot(df,type='candle',addplot=apds,figscale=1.5,figratio=(7,5),title='\n\nMACD',样式=s,体积=真,体积面板=2,面板比例=(6,3,2),returnfig=真)mpf.show()ax_main=axes[0]ax_emav=ax_mainax_hisg=axes[2]ax_macd=axes[3]ax_sign=ax_macdax_volu=axes[4]defanimate(ival):if(20+ival)>len(df):print('nomoredatatoplot')ani.event_source.interval*=3ifani.event_source.interval>12000:exit()返回数据=df.iloc[0:(30+ival)]exp12=data['close'].ewm(span=12,adjust=False).mean()exp26=data['close'].ewm(span=26,adjust=False).mean()macd=exp12-exp26signal=macd.ewm(span=9,adjust=False).mean()直方图=macd-信号apds=[mpf.make_addplot(exp12,color='lime',ax=ax_emav),mpf.make_addplot(exp26,color='c',ax=ax_emav),mpf.make_addplot(直方图,type='bar',width=0.7,color='dimgray',alpha=1,ax=ax_hisg),mpf.make_addplot(macd,color='fuchsia',ax=ax_macd),mpf.make_addplot(signal,color='b',ax=ax_sign),]对于轴中的ax:ax.clear()mpf.plot(data,type='candle',addplot=apds,ax=ax_main,volume=ax_volu)ani=animation.FuncAnimation(fig,animate,interval=100)mpf.show()还有很多更有趣的玩法,可以阅读mplfinance的例子学习更多的使用技巧:https://github.com/matplotlib/mplfinance/tree/master/examples