Moving Median

2025-03-30 公開 / 2025-03-31 更新

正規分布していないデータに対して標準偏差を当たり前のように使うのは、どうも気持ち悪いといつも感じています。そこで、データの分布形状を前提としないメジアン(中央値)を利用した統計量を使い始めています。

毎週末の日経平均株価のまとめで、移動メジアンのチャート作成に使用しているコードをベースにした JupyterLab 向けのサンプルを紹介します。

下記の OS 環境で動作確認をしています。

Fedora Linux 41 Workstation x86_64
Python 3.13.2
jupyterlab 4.3.5
matplotlib 3.10.1
mplfinance 0.12.10b0
pandas 2.2.3
yfinance 0.2.55

JupyterLab を起動して、最初に必要なサンプルをインポートします。

import datetime
 
import matplotlib.pyplot as plt
import mplfinance as mpf
import pandas as pd
import yfinance as yf

過去 3 年分の週足データを表示しますが、プロットする全域で移動メジアン線を欠けることなく描画するためには、さらに(26 週分の)古いデータが必要になります。そこで、まず過去 5 年分のデータを df0 で取得してから、過去 3 年分の週足表示用のデータフレーム df に分けています。

code = 'N225'
symbol = '^%s' % code
ticker = yf.Ticker(symbol)
 
# 週足で過去 5 年分のデータを取得
df0 = ticker.history(period='5y', interval='1wk')
 
# ローソク足のチャートには、そのうち過去 3 年分のみ使用する
dt_last = df0.index[len(df0) - 1]
tdelta_3y =  datetime.timedelta(days=365 * 3)
df = df0[df0.index >= dt_last - tdelta_3y]

mplfinance でローソク足チャートをプロットしていますが、細かい修飾などを Matplotlib 側で調節したかったので、mplfinance にプロット全てを任せずに、わざわざ Matplotlib の管理下でプロットしています。

移動メジアンは過去 5 年分のデータフレーム df0 で算出して、ローソク足のデータスコープ、すなわちデータフレーム df の日付インデックス (df.index) に合う行のみを表示しています。

fig, ax = plt.subplots(figsize=(12, 8))
 
# 移動メジアンの算出
mv_median_09 = df0['Close'].rolling(9).median()
mv_median_13 = df0['Close'].rolling(13).median()
mv_median_26 = df0['Close'].rolling(26).median()
mv_median_52 = df0['Close'].rolling(52).median()
 
apds  = [
    mpf.make_addplot(mv_median_09[df.index], width=0.75, label=' 9wk moving median', ax=ax),
    mpf.make_addplot(mv_median_13[df.index], width=0.75, label='13wk moving median', ax=ax),
    mpf.make_addplot(mv_median_26[df.index], width=0.75, label='26wk moving median', ax=ax),
    mpf.make_addplot(mv_median_52[df.index], width=0.75, label='52wk moving median', ax=ax),
]
 
mpf.plot(
    df, type='candle', style='default',
    addplot=apds,
    datetime_format='%y-%m-%d',
    xrotation=0,
    ax=ax,
)
 
ax.grid()
ax.legend(loc='best', fontsize=9)
 
# 銘柄によっては銘柄名を取得できない場合があるので、その際には銘柄コードのみ表示
try:
    ax.set_title('Weekly chart for %s (%s)\nwith moving median' % (ticker.info['longName'], symbol))
except KeyError:
    ax.set_title('Weekly chart for %s\nwith robust moving median' % (symbol, period))
 
plt.tight_layout()
plt.show()

下記のようなプロットが表示されます。

関連サイト

  1. 私の株日記: 標準偏差を使う気持ち悪さ [2025-03-16]
  2. mplfinance/README.md at master · matplotlib/mplfinance

0 件のコメント:

コメントを投稿