【量化分析】绘制指标线EWM和MACD(1)

news2024/12/29 11:03:58

目录

一、说明

二、使用mplfinance的前提

2.1 mplfinance生态圈

2.1 安装mplfinance

三、mplfinance绘图

3.1 单变量图

3.2 将用户自己生成的曲线添加到 mplfinance plot()

四、显示EWM和MACD



一、说明

        在做量化分析的时候,需要有能力计算种种曲线,如EWM和MACD,或布林线等。经过多年研究,我们发现pandas和Mplfinance搭配是目前的最佳选择。然而,初学者对Mplfinance知道不多,因此,本系列文档将举出Mplfinance的开发潜力,并辅助一些实验演示给大家。

二、使用mplfinance的前提

2.1 mplfinance生态圈

使用mplfinance之前,首先了解mplfinance所依赖的环境,基本如下:

  • python生态环境
  •  matplotlib 和 pandas生态环境
  • Tushare应用包
  • numpy环境
  • QT5也需要额外安装

2.1 安装mplfinance

pip install --upgrade mplfinance

三、mplfinance绘图

3.1 单变量图

1)函数原型:

mpf.plot(data, type, title, ylabel, style, volume, ylabel_lower, show_nontrading, figratio, mav)

2)参数表: 

参数名称参数意义性质
data

data为一个DataFrame对象,要保证其有Open, High, Low, Close四个列。且行索引的名称必须是’Date‘,此外还有一列是’Volume’,这一列不是必须的(如果要同时绘制成交量柱状图,则还需要该列名为Volume的列。)

type

type为绘制图线的类型,可以的选择有* ‘ohlc’, ‘candle’(蜡烛图), ‘line’(直线,仅绘制收盘价时序图时用), ‘renko’, ‘pnf’。

title title 即图片标题 默认不能有汉字和其他一些特殊字符,如果想使用汉字,需要加一些修改。
ylabel

ylabel: 纵轴的标签

style样式,这是我认为最赞的两个参数之一(另一个是mav,直接绘出均线,下边有介绍)。取值有‘binance’,
‘blueskies’,
‘brasil’,
‘charles’,
‘checkers’,
‘classic’,
‘default’,
‘mike’,
‘nightclouds’,
‘sas’,
‘starsandstripes’,
‘yahoo’
volume

volume: True表示添加成交量,默认False。

ylabel_lower

ylabel_lower: 成交量的Y轴标签。

show_nontrading

show_nontrading: True显示非交易日,默认False。(这个一般不怎么常用。)

figratio

figratio: 控制图表大小的元组。

mav

mav: 整数或包含整数的元组,是否在图表中添加移动平均线。如mav=(5, 10)表示添加5日均线和10日均线。

savefig:

如果要保存生成的图片,则加入savefig参数,参数值为要保存的路径+文件名。

注意:这里mplfinance专门针对股票,因此,这里默认dataframe是pandas对象,其中数据是包含开盘价(Open)、最高价(High)、最低价(Low)和收盘价(Close)数据的 Pandas DataFrame 对象,以及 Pandas的DatetimeIndex索引(name=“Date”)。

# 从tushare调取 平安银行(000001 ) 股价数据
import tushare as ts
import pandas as pd
import mplfinance as mpf

df = ts.get_k_data("000001")
# print(df.columns)   Index(['date', 'open', 'close', 'high', 'low', 'volume', 'code']

# 然后 将该DataFrame对象处理为适合我们使用的格式
df = df.loc[:, ['date', 'open', 'close', 'high', 'low', 'volume', 'code']]
df.rename(
    columns={
        'date': 'Date', 'open': 'Open','close': 'Close',
        'high': 'High', 'low': 'Low', 'volume': 'Volume'},
    inplace=True)       # 重定义列名,方便统一规范操作。
df['Date'] = pd.to_datetime(df['Date'])  # 转换日期列的格式,便于作图
df.set_index(['Date'], inplace=True)  # 将日期列作为行索引
df = df.sort_index()  # 倒序,因为Tushare的数据是最近的交易日数据显示在DataFrame上方,倒序后方能保证作图时X轴从左到右时间序列递增。

mpf.plot(df.loc['2020-11': '2020-12'], type='candle', ylabel="price", style='charles', title='No_stock-000001', mav=(5, 10), volume=True, ylabel_lower="volume(shares)")

图1 蜡烛图以及五-十日浮动平均线

3.2 将用户自己生成的曲线添加到 mplfinance plot()

mplfinance/addplot.ipynb at master · matplotlib/mplfinance · GitHub

        有时您可能希望在与基本 OHLC 或Candle图相同的图形中绘制其他数据。例如,您可能想要添加技术研究的结果或一些额外的市场数据,比如,Ema线或Macd。

        因为 mplfinance.plot()是唯一绘制函数,因此,这是通过使用 addplot(“附加图”)关键字将信息传递到对 mplfinance.plot() 的调用来完成的。

        addplot 关键字需要一个字典。该字典必须包含键“数据”:其值是要绘制的实际附加数据。此附加数据可能是List、numpy.ndarray、pandas.Series 或 pandas.DataFrame。如果它是一个 DataFrame,那么将绘制该数据框中的所有列。

        强烈建议调用者使用辅助函数 mplfinance.make_addplot() 构造 addplot 字典(参见下面的示例)。这个辅助函数:

  •         简化了指定附加图的语法
  •         确保字典包含所有可能的可配置关键字的默认值
  •         对关键字值进行一些基本检查以确保它们的类型正确。

        addplot 关键字还可以接受字典列表,作为在基本 OHLCV 数据之上绘制多个附加数据集的一种可能方式。请参阅以下示例中的具体详细信息。

        我们知道,使用matplotlib.pyplot绘图的时候,采用的是面向对象绘图的思想。首先要有一个figure,即一个面板,然后我们只要在这个面板上添加各种对象,这个图像就会越来越完美。(理解面向对象绘图点击链接:Python–Matplotlib库与数据可视化③)。
        matplotlib可以一句一句地逐句给图形添加元素。

        有那么一点不同的是,mplfinance库把这一切都给封装起来了。最后把这一切对象全都集中在了一个mpf.plot()函数中,我们只需要为此传入合规的参数。

        假设我们想要绘制下布林带以及基本的 OHLCV 图。我们使用 make_addplot() 创建 addplot 字典,并将其传递给 plot() 函数:

1)添加一条线'LowerB'

apdict = mpf.make_addplot(df['LowerB'])
mpf.plot(df,volume=True,addplot=apdict)

2)在创建 addplot 字典时,我们可以指定我们想要一个散点图:

apd = mpf.make_addplot(df['LowerB'],type='scatter')
mpf.plot(df,addplot=apd)

四、显示EWM和MACD

        直到目前,我们已经有足够知识生成和显示EWM和MACD线了。值得注意的是,EWM不是Mplfinance的功能,而是pandas功能,其函数原型是:

Series.ewm(span,adjuest).mean()

下面代码将介绍EWM的计算,以及MACD的曲线: 


import pandas as pd
import mplfinance as mpf
import matplotlib.animation as animation

mins = 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_chart

exp12     = df['close'].ewm(span=12, adjust=False).mean()
exp26     = df['close'].ewm(span=26, adjust=False).mean()
macd      = exp12 - exp26
signal    = macd.ewm(span=9, adjust=False).mean()
histogram = macd - signal

apds = [mpf.make_addplot(exp12,color='lime'),
        mpf.make_addplot(exp26,color='c'),
        mpf.make_addplot(histogram,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='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()

五、滚屏显示移动K线

如果你希望能动态看到整个绘制过程,增加个animation即可:

# 公众号:二七阿尔量化
import pandas as pd
import mplfinance as mpf
import matplotlib.animation as animation

mins = 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_chart

exp12     = df['close'].ewm(span=12, adjust=False).mean()
exp26     = df['close'].ewm(span=26, adjust=False).mean()
macd      = exp12 - exp26
signal    = macd.ewm(span=9, adjust=False).mean()
histogram = macd - signal

apds = [mpf.make_addplot(exp12,color='lime'),
        mpf.make_addplot(exp26,color='c'),
        mpf.make_addplot(histogram,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='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()

ax_main = axes[0]
ax_emav = ax_main
ax_hisg = axes[2]
ax_macd = axes[3]
ax_sign = ax_macd
ax_volu = axes[4]


def animate(ival):
    if (20+ival) > len(df):
        print('no more data to plot')
        ani.event_source.interval *= 3
        if ani.event_source.interval > 12000:
            exit()
        return
    data = 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 - exp26
    signal    = macd.ewm(span=9, adjust=False).mean()
    histogram = macd - signal
    apds = [mpf.make_addplot(exp12,color='lime',ax=ax_emav),
            mpf.make_addplot(exp26,color='c',ax=ax_emav),
            mpf.make_addplot(histogram,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),
           ]

    for ax in axes:
        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/addplot.ipynb at master · matplotlib/mplfinance · GitHub

mplfinance/examples at master · matplotlib/mplfinance · GitHub 

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

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

相关文章

ShowMeBug 持续升级,提供高信效度支撑的技术招聘方案

去年年底,全新升级版的 ShowMeBug ——一款支持实战编程的技术能力评估平台,首次揭开了它神秘的面纱。 而近日,ShowMeBug 再次迎来一系列产品更新,它将以全新的面貌,提供高信效度支撑的技术招聘方案,持续助…

chatgpt赋能python:Python人脸登录:这项技术将颠覆传统的登录方式

Python人脸登录:这项技术将颠覆传统的登录方式 简介 在互联网时代,登录是每个人使用网站或软件的第一步,但是传统的用户名和密码登录已经不能满足用户的需求。不断的爆出各种账户泄露事件、密码猜测和密码被盗等问题,导致用户的…

cleanmymac要不要下载装机?好不好用

当我们收到一台崭新的mac电脑,第一步肯定是找到一款帮助我们管理电脑运行的“电脑管家”,监控内存运行、智能清理系统垃圾、清理Mac大文件旧文件、消除恶意软件、快速卸载更新软件、隐私保护、监控系统运行状况等。基本在上mac电脑防护一款CleanMyMac就够…

生成程序片段(程序依赖图PDG)

生成程序片段(程序依赖图PDG) 生成程序片段 标准方法是: 基于依赖性分析的切片。 使用程序依赖图表示依赖。 从中生成切片。 我们将专注于这种方法。但是,还有其他选择。 程序依赖图 The Program Dependence Graph (PDG) 表示数据和控制依赖项&#xf…

Servlet的常用Api—HttpServletResponse

Servlet的常用Api—HttpServletResponse 🔎核心方法setContentType && setCharacterEncodingsendRedirect关于Keep-Alive关于状态码 && Body 🔎结尾 🔎核心方法 方法描述(void) setStatus(int sc)为该响应设置状态码(void) s…

2023年4月和5月随笔

1. 回头看 为了不耽误学系列更新,4月随笔合并到5月。 日更坚持了151天,精读完《SQL进阶教程》,学系统集成项目管理工程师(中项)系列更新完成。 4月和5月两月码字114991字,日均码字数1885字,累…

python的AutoGui库(1)获取鼠标实时位置

1.安装AutoGui库,与库的导入 PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,多平台支持(Windows,OS X,Linux)。可以用pip安装,Github上有源码。 使用命令…

Ceph应用

//存储类型 块存储 一对一,只能被一个主机挂载使用,数据以块为单位进行存储,典型代表: 硬盘 文件存储 一对多,能被多个主机同时挂载使用,数据以文件的形式存储的(元数据和实际数据是分开存储的),并且有…

Python学习笔记 - 探索33个保留关键字

Python编程语言中有33个保留关键字,这些关键字在Python语法中有特殊含义,不能用作变量名、函数名或其他标识符。 33个保留字(关键字) 不能冲突的关键词 33 个 来看看都有哪些关键字。 import keyword print(",…

面试专题:java多线程(3)---关于 Atomic 原子类

1.介绍一下Atomic 原子类Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开…

cpolar内网穿透创建实现远程办公---无需公网IP

文章目录 前言1.本地访问简介2. cpolar内网穿透3. 公网远程访问4. 固定公网地址 转发自cpolar极点云的文章:外网远程访问公司内网用友畅捷通T财务软件 – 远程办公 前言 用友畅捷通T适用于异地多组织、多机构对企业财务汇总的管理需求;全面支持企业对远…

JavaScript 客户端脚本语言 选择器、事件

JavaScript发展史 JavaScript介绍 JavaScript ( 简称 JS): 是一种轻量级客户端脚本语言,通常被直接嵌入 HTML 页面,在浏览器上执 行。 JavaScript 的主要用途 : 使网页具有交互性(如果不去使用js,只是使用html css那么只是…

chatgpt赋能python:Python主网站的SEO优化

Python主网站的SEO优化 作为一名有10年Python编程经验的工程师,我一直非常关注Python官方网站的SEO优化,因为官方网站对于传播Python语言的影响至关重要。在这篇文章中,我将介绍一些Python主网站的SEO优化策略,并总结一些结论&am…

程序切片(定义+用途)

程序切片(定义用途) 介绍 让我们假设我们测试了一个程序 p 并失败了(错误的 输出)。然后我们想找出导致失败(故障)的原因。 现在假设我们要更改程序的一部分。我们可能会问:程序的哪些其他部分受到影响 我们想找到导致…

1728_c语言标准库memcpy函数的简单使用

全部学习汇总: GreyZhang/c_basic: little bits of c. (github.com) 欢迎路过的YUAN类朋友相互交流,以下是我的联系方式: Email:greyzhang126.com 微信:grey0612 静态代码检测遇到了一处memcpy函数使用的错误&#…

如何DIY项目资源私有检测规则

本地资源检测是UWA推出的、面向于静态资源的全量分析。可以全面自动检测项目静态工程内各项资源、代码和设置,能够帮助项目组制定合理的资源与代码标准,及时发现潜在的性能问题和异常错误,建立有效的开发规范。 为了在游戏优化过程中持续与U…

计网之HTTPS的安全机制

文章目录 一. 什么是HTTPS?二. HTTPS中的加密机制(SSL/TLS)1. HTTP的安全问题2. 对称加密3. 非对称加密4. 中间人问题5. 证书 一. 什么是HTTPS? 在网络传输过程中, 存在着运营商劫持和一些黑客入侵这样的危险, 在之前只有HTTP的明文传输数据环境下, 这样的问题是有些泛滥的,…

java 利用poi根据excel模板导出数据(二)

本文是 java 利用poi根据excel模板导出数据(一) 的续篇 经常有poi的开发一定会碰到三个名词: HSSFWorkbook 、 XSSFWorkbook、SXSSFWorkbook; 这三个都是导出excel的形式,具体区别: HSSFworkbook,XSSF…

bert中文文本摘要代码(1)

bert中文文本摘要代码 写在最前面关于BERT使用transformers库进行微调 load_data.py自定义参数collate_fn函数BertDataset类主函数 tokenizer.py创建词汇表encode函数decode函数 写在最前面 熟悉bert+文本摘要的下游任务微调的代码,方便后续增加组件实现…

Vue.js+nodejs高校水电费缴费设备维修管理系统

本大学城水电管理系统管理员功能有个人中心,用户管理,领用设备管理,消耗设备管理,设备申请管理,设备派发管理,状体汇报管理,领用报表管理,消耗报表管理,班组报表管理&…