量化投资常用技能——绘图篇 2:绘制移动平均线


前言

上一篇文章“量化投资常用技能——绘图篇 1:绘制股票收盘价格曲线和ochl烛状图”介绍了如何使用python的matplotlib库和mpl_finance库来绘制股票收盘价曲线和股票烛状图,这一篇文章将在上一篇的基础上进一步学习移动平均线和黄金分割线的绘制。


大家可以关注我们的抖音号:“金融观察”(JRGC8888)了解更多

移动平均线

移动平均线(Moving Average)简称MA,通过将一定时期的值加起来求平均,并把不同时间的平均值连接起来形成一根MA。
例如: 一段证卷价格的列表 [40, 20, 60, 20, 20, 40],我们选取4天的移动平均线,那么计算得到的列表为 [35, 30, 35]

使用numpy库计算移动平均值

import numpy as np
import matplotlib.pyplot as plt

stork_data = np.array([116.5, 115.2, 118.9, 125.2, 117.4, 126.6, 130.1,
                       135.3, 142.6, 150.9, 158.2, 149.2, 136.9])
window = 4  # 绘制4日移动平均线

mean_data = [stork_data[i: i+window].mean() for i in range(len(stork_data) - window + 1)]
'''
# 这部分拆开写的话比较麻烦,建议按上面的写法
mean_data = np.zeros(len(stork_data) - window + 1)
for i in range(len(stork_data) - window + 1):
    mean_data[i] = stork_data[i: i+window].mean()
'''
# print(mean_data)

x = range(len(stork_data))

plt.plot(x, stork_data, 'r--', x[window-1:], mean_data, 'b-.')
plt.show()

最后绘制的图表如下:
在这里插入图片描述
大家可以根据自己的喜好,通过修改绘图的参数来修改图像样式。除了自己从计算到绘图来实现移动平均线,我们还可以使用一个封装好的第三方库来更快的实现这个功能。

量化投资第三方库:abupy

这个库是由“阿布量化“研发开源的,他的GitHub入口点这里,使用pip语句即可完成安装
pip install abupy

操作过程描述:通过abupy库调用pd_rolling_mean()函数即可实现移动平均线的计算,并返回计算结果的DataFrame数据类型,进一步使用DataFrame对象的 .plot()函数实现绘制移动平均线

  • 函数:pd_rolling_mean(data, window)
    • data参数需为DataFrame对象类型,一般为从证券数据的DataFrame提取出来的每日收盘价那一列
    • window参数为绘制的是几日移动平均线,控制每次求平均值的窗口大小

我们使用的数据为通过abupy库导入的tsla的历史数据

import abupy
import matplotlib.pyplot as plt
import mpl_finance as mpf
from matplotlib.dates import date2num
from abupy import ABuSymbolPd, pd_rolling_mean


# ———————————————————— #
# ———— 默认参数设置 ———— #
# ———————————————————— #
__colorup__ = "red"
__colordown__ = "green"

abupy.env.enable_example_env_ipython()  # 使用沙盒数据,目的是和书中一样的数据环境,不使用会报错
tsla_df = ABuSymbolPd.make_kl_df('usTSLA', n_folds=2)  # 固定导入tsla的行情数据
tsla_df = tsla_df[:200]  # 选取前200个,数据过多不易观察

print(tsla_df[:10])
# ———————————————————— #


def plot_ochl(data_df=tsla_df, axs=None, show=False):
    '''
    绘制烛状图
    :param data_df: 输入的数据,默认采用tsla的历史行情数据,输入的数据类型目前只支持DataFrame类型
    :param axs: 是否在子图上绘制
    :param show: 是否显示图像
    :return:
    '''

    drawer = plt if axs is None else axs
    fig, ax = drawer.subplots(figsize=(14, 7))

    qutotes = []

    for index, (d, o, c, h, l) in enumerate(
            zip(data_df.index, data_df.open, data_df.close,
                data_df.high, data_df.low)):

        d = date2num(d)  # 蜡烛图的日期要使用matplotlib.finance.date2num进行转换为特有的数字值
        val = (d, o, c, h, l)  # 日期,开盘,收盘,最高,最低组成tuple对象val
        qutotes.append(val)  # 加val加入qutotes

    # 使用mpf.candlestick_ochl进行蜡烛绘制,ochl代表:open,close,high,low
    mpf.candlestick_ochl(ax, qutotes, width=0.6, colorup=__colorup__, colordown=__colordown__)
    ax.autoscale_view()
    ax.xaxis_date()

    if show:
        plt.show()


def plot_avgline(data_df=tsla_df, axs=None, window=[30, 60, 90], show=False):
    '''
    绘制移动平均线
    :param data_df: 输入的数据,默认采用tsla的历史行情数据,输入的数据类型目前只支持DataFrame类型
    :param axs: 是否在子图上绘制
    :param window: 窗口大小,可以是列表或者单个数值
    :param show: 是否显示图像
    :return:
    '''

    # drawer = plt if axs is None else axs

	# 判断window是否为列表
    if isinstance(window, list):
        the_legend = []

        for w in window:
            if isinstance(w, int):
            	# 调用pd_rolling_mean()函数计算得到移动平均值
                pd_rolling_mean(data_df.close, window=w).plot()
                the_legend.append(str(w)+' mv')

            elif isinstance(w, str):
                pd_rolling_mean(data_df.close, window=int(w)).plot()
                the_legend.append(w + ' mv')

            else:
                try:
                    raise TypeError('the type of element in list [- window -] is not int or string!')
                except TypeError:
                    print('raise, try except')

        plt.legend(the_legend, loc='best')
	
	# 判断window是否为int
    elif isinstance(window, int):
        pd_rolling_mean(data_df.close, window=window).plot()
        plt.legend(window + ' mv', loc='best')

	# 提前捕获并输出异常
    else:
        try:
            raise TypeError('[- window -] type is not int or list!')
        except TypeError:
            print('raise, try except')

    if show:
        plt.show()


if __name__ == '__main__':
    plot_ochl()  # 绘制烛状图,会新建画布
    plot_avgline(show=True)  # 绘制移动平均图


最后的图像如下:
在这里插入图片描述

结合之前的绘图篇1,大家已经掌握了三个最常用的函数了,可以试着自己组合函数观察输出结果,下一节将带大家学习如何绘制黄金分割线,为我们的图表增添新的内容。

欢迎大家关注我们

我们的抖音号:金融观察(JRGC8888)

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值