投資信託の値段はと呼ばれます。株価と同じように時系列で並べられるので、同じ道具で扱えそうに見えます。ところが性質がいくつか違い、そのまま同じ計算をすると誤った結果が出ます。
違いは大きく3つあります。更新の頻度、分配金の扱い、取得経路の少なさです。どれも「株式では起きないこと」なので、株価の処理をそのまま流用すると気づかないまま誤った系列ができあがります。順に見ていきます。
株式の処理をそのまま使い回せると考えていると、どこで間違えたか分からないまま結果だけが合わない、という状態になります。違いを先に把握してから設計するほうが、結局は早く済みます。
1日1回しか動かない
株価は取引時間中ずっと動きますが、基準価額は1日1回しか算出されません。しかも当日の値が公表されるのは、その日の夜になってからです。当日中に最新の値を取ろうとしても、まだ存在しません。
これは取得処理の設計に影響します。日中に走らせても前日の値しか取れないので、夜間に実行するか、当日ぶんが無いことを前提にした作りにする必要があります。「今日のデータが無い」を異常として扱うと、毎日誤検知します。
公表の時刻も運用会社によって差があります。全銘柄が同じ時刻に出そろうわけではないので、一律の時刻に取りに行くと、一部だけ前日のままということが起きます。取得した値がいつ時点のものかを、データ側に持たせておくと後で判別できます。
from datetime import date, timedelta
def check_nav_freshness(latest: date, today: date, max_lag_days: int = 3) -> str | None: """基準価額は前日ぶんまでしか無いのが普通なので、1 日の遅れは正常とする。 休日をまたぐと 3 日程度空くため、そこまでは許容する。""" lag = (today - latest).days if lag <= max_lag_days: return None return f"最新の基準価額が {lag} 日前({latest})。取得経路の確認が必要"分配金を出すと下がる
これが最も間違えやすい点です。投資信託が分配金を出すと、その分だけ基準価額が下がります。資産の一部を払い出しているので当然の動きですが、価格の系列だけを見ると下落に見えます。
この状態で騰落率を計算すると、分配金を出した日に大きなマイナスが立ちます。株式のと同じ構図で、企業側・運用側の行為が値動きとして混ざっているわけです。
正しく比べるには、分配金を再投資したと仮定した系列を使います。多くの提供元が「分配金再投資基準価額」といった名前で用意しています。運用成績を比較するなら、こちらを使ってください。
| 項目 | 株式 | 投資信託 |
|---|---|---|
| 更新の頻度 | 取引時間中ずっと | 1日1回・夜に公表 |
| 価格を下げる行為 | 株式分割・配当落ち | 分配金 |
| 調整済みの系列 | 調整後終値 | 分配金再投資基準価額 |
| 識別子 | 証券コード・ティッカー | 協会コード(ISIN も併用) |
import pandas as pd
def reinvested_series(nav: pd.Series, dividends: pd.Series) -> pd.Series: """分配金を再投資したと仮定した系列を作る。
nav : 基準価額(分配金落ち後の値) dividends : 分配日を索引、1口あたりの分配金額を値とする系列 """ df = pd.DataFrame({"nav": nav}).sort_index() df["div"] = dividends.reindex(df.index).fillna(0.0)
# 分配前の価格 = 分配後の価格 + 分配金。その比率で口数が増えたとみなす prev = df["nav"].shift(1) ratio = (df["nav"] + df["div"]) / prev ratio.iloc[0] = 1.0
return df["nav"].iloc[0] * ratio.cumprod()分配金を出す頻度は商品によって違い、毎月出すものもあれば年1回のものもあります。毎月分配型は、価格の系列だけを見ると右肩下がりに見えます。実際には分配金を受け取っているので損をしているとは限りませんが、価格だけで判断すると誤ります。
分配金の記録は、価格とは別に取得することになる場合が多いです。両方を突き合わせて系列を作るので、日付の粒度とを揃えておく必要があります。片方が受渡日、片方が計算日だと、1日ずれた状態で結合されます。
取得できる経路が少ない
株価と違い、投資信託の基準価額を無料で網羅的に配信しているは多くありません。運用会社が個別に公開している場合、業界団体がまとめて公開している場合、証券会社の画面にしかない場合。銘柄によって経路が違うことも珍しくありません。
経路が分かれると、取得処理も分かれます。共通の形に揃える層を先に作っておくと、あとで経路が増えても下流を変えずに済みます。銘柄・日付・基準価額・分配金、という最小の形に揃えるだけでも効果があります。配信の形式も だったり画面だったりと揃わないので、この層で吸収します。
投資信託には証券コードがありません。協会コードや ISIN といった別の体系を使います。株式と同じ表に入れるなら、識別子の種類も一緒に持たせてください。番号だけを鍵にすると、別の商品と衝突します。
識別子が違えば、株式のデータと同じ表に入れたときに突き合わせができません。ここは設計の最初に決めておかないと、後から直すのが高くつく部分です。識別子の突き合わせについては次々回で詳しく扱います。次回は、24時間動き続ける市場のデータを見ます。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。