• Admin

量化投资常用技能——绘图篇 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)

6 views0 comments

A leading day trading platform, specializing in U.S. equity markets with operations worldwide.

CONTACT US:

 

Mon - Fri 9:00 - 17:30 HK

‭+852 55745397

marketing@shewutrade.com

RM06,13A/F, South Tower, World Finance Centre, 17 Canton Road, Tsim Sha Tsui, HK.

Options involve risk and are not suitable for all investors. All investment strategies and investments involve risk of loss. Nothing contained in this website should be construed as investment advice. Any reference to an investment's past or potential performance is not, and should not be construed as, a recommendation or as a guarantee of any specific outcome or profit. Margin borrowing is only for experienced investors with high risk tolerance. You may lose more than your initial investment. Lower investment costs will increase your overall return on investment, but lower costs do not guarantee that your investment will be profitable. Any trading symbols displayed are for illustrative purposes only and are not intended to portray recommendations. Past performance is not necessarily indicative of future results.

  • Facebook
  • LinkedIn
  • Twitter
  • Instagram
  • TikTok
  • YouTube