量化投資常用技能——繪圖篇 2
- 前言
- 移動平均線
- 使用numpy庫計算移動平均值
- 量化投資第三方庫:abupy
- 歡迎大家關注我們
- 我們的抖音號:金融觀察(JRGC8888)
前言
上一篇文章“量化投資常用技能——繪圖篇 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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/229185.html
標籤:python
