【1. 株価時系列の基本構造】
1日ごとに以下のデータが記録される:
- $O_t$:Open(始値)
- $H_t$:High(高値)
- $L_t$:Low(安値)
- $C_t$:Close(終値)
- $V_t$:Volume(出来高)
これらをベクトルで表すと:
$$
\vec{x}_t =
\begin{bmatrix}
O_t \
H_t \
L_t \
C_t \
V_t
\end{bmatrix}
\in \mathbb{R}^5
$$
【2. 時系列の分類と特徴】
● 定常/非定常(統計特性)
-
定常時系列:平均・分散が時間に依存しない
$$
\mathbb{E}[x_t] = \mu,\quad \text{Var}(x_t) = \sigma^2
$$ -
非定常時系列:トレンドや季節性あり
$$
x_t = \mu + \beta t + \varepsilon_t
$$
● 離散/連続
- 離散時系列(通常の株価):$x_t$ at $t = 0, 1, 2, \ldots$
- 連続時系列(理論モデルや微分方程式):$x(t)$ for $t \in \mathbb{R}$
【3. Pythonでの読み込み例(yfinance
)】
import yfinance as yf
data = yf.download("AAPL", start="2022-01-01", end="2022-12-31")
print(data[['Open', 'High', 'Low', 'Close', 'Volume']].head())
【4. 株価データと線形代数学】
時系列データを行列として扱うことができる:
$$
X =
\begin{bmatrix}
O_1 & H_1 & L_1 & C_1 & V_1 \
O_2 & H_2 & L_2 & C_2 & V_2 \
\vdots & \vdots & \vdots & \vdots & \vdots \
O_n & H_n & L_n & C_n & V_n
\end{bmatrix}
\in \mathbb{R}^{n \times 5}
$$
これにより:
- 主成分分析(PCA)→ 次元圧縮
- 共分散行列 $\Sigma = \frac{1}{n} X^T X$
- 正規化:各列(価格系列)に対して平均・分散を調整
【5. 可視化(matplotlib / candlestick)】
● ローソク足チャートに必要なデータ形式:
from mplfinance.original_flavor import candlestick_ohlc
import matplotlib.dates as mdates
ohlc = data[['Open', 'High', 'Low', 'Close']].copy()
ohlc.reset_index(inplace=True)
ohlc['Date'] = ohlc['Date'].map(mdates.date2num)
● 描画
fig, ax = plt.subplots()
candlestick_ohlc(ax, ohlc.values, width=0.6, colorup='g', colordown='r')
ax.xaxis_date()
【ローソク足の線形解釈】
- 始値と終値が近い → 安定(低ボラティリティ)
- 高値−安値:価格変動幅 → ベクトルのノルムとして:
$$
||\vec{p}_t|| = \sqrt{(H_t - L_t)^2 + (C_t - O_t)^2}
$$
このように、ローソク足もベクトルの構成要素として捉えられる。
【第2章】移動平均とトレンド抽出
■ 目標
- ノイズの多い株価系列からトレンド成分を抽出する
- 移動平均(SMA, WMA, EMA)やボリンジャーバンドを数式で理解
- Python実装の基礎を準備
【2.1】単純移動平均(SMA: Simple Moving Average)
過去 $w$ 個のデータの算術平均:
$$
\hat{x}t = \frac{1}{w} \sum{i=0}^{w-1} x_{t-i}
$$
- $x_t$:時刻 $t$ の株価
- $w$:ウィンドウ幅(例:5日, 25日)
【2.2】加重移動平均(WMA: Weighted Moving Average)
過去データに重み $w_i$ を与える:
$$
\hat{x}t = \frac{\sum{i=0}^{w-1} w_i \cdot x_{t-i}}{\sum_{i=0}^{w-1} w_i}
$$
- 例:最近のデータに重みを大きく設定(線形加重、三角加重など)
【2.3】指数移動平均(EMA: Exponential Moving Average)
直近データに指数的な重みをつけて平滑化:
$$
\hat{x}t = \alpha x_t + (1 - \alpha) \hat{x}{t-1}
$$
- $\alpha \in (0, 1)$:平滑化係数(例:$\alpha = \frac{2}{w+1}$)
- 応答性が高く、SMAより変化を早く捉える
【2.4】ボリンジャーバンド(Bollinger Bands)
株価の標準偏差幅をもとに、価格の振れ幅を視覚化:
$$
\text{Middle Band} = \text{SMA}_t
$$
$$
\text{Upper Band} = \text{SMA}_t + k \cdot \sigma_t
$$
$$
\text{Lower Band} = \text{SMA}_t - k \cdot \sigma_t
$$
- $\sigma_t$:過去 $w$ 日間の標準偏差
- $k$:一般的に 2 を使用(±2σ)
【第3章】リターンと変動率
■ 目標
- 株価の変化量を「リターン(収益率)」として定式化
- 変動の大きさ(ボラティリティ)を定量的に評価
- リターンの正規性・分布の確認方法を理解
【3.1】リターンの定義
● 絶対リターン(差分)
$$
r_t = x_t - x_{t-1}
$$
- $x_t$:時刻 $t$ の株価(終値など)
- 簡単な差分だが、単位に依存するため比較に不便
● 対数リターン(log-return)
$$
r_t = \log x_t - \log x_{t-1} = \log\left(\frac{x_t}{x_{t-1}}\right)
$$
- 単位に依存せず、複利的な増加を加算可能
- 長期的な累積変化に強く、統計処理に適する
【3.2】リターン系列の分布と正規性
● ヒストグラム(Histogram)
- リターンの分布形状を視覚化
- 正規分布(平均0・分散σ²)と比較する
● QQプロット(Quantile-Quantile)
- リターンの理論分布(正規)との乖離を可視化
- 尖った裾(ファットテール)や歪度があれば非正規的
【3.3】ボラティリティ(Volatility)
価格の変動の大きさ(リスクの定量化)を表す指標:
● 標準偏差による定義(過去 $w$ 期間)
$$
\sigma_t = \sqrt{ \frac{1}{w - 1} \sum_{i=0}^{w-1} (r_{t-i} - \bar{r})^2 }
$$
- $\bar{r}$:リターンの平均値
- $\sigma_t$:時間 $t$ におけるヒストリカル・ボラティリティ
● 年率換算(252取引日)
$$
\sigma_{\text{annual}} = \sigma_{\text{daily}} \times \sqrt{252}
$$
【第4章】自己相関と定常性
■ 目標
- 時系列データの**依存構造(自己相関)**を数式的に把握
- 定常性の有無を判定することで、モデル化に適した形へ整形
- Pythonでの自己相関・単位根検定の実施方法を準備
【4.1】自己相関関数(ACF: AutoCorrelation Function)
時系列 $x_t$ に対するラグ $k$ の自己相関係数:
$$
\rho_k = \frac{\sum_{t=k+1}^T (x_t - \bar{x})(x_{t-k} - \bar{x})}{\sum_{t=1}^T (x_t - \bar{x})^2}
$$
- $\bar{x}$:全体の平均
- $\rho_k$:ラグ $k$ の相関係数
- Python:
statsmodels.graphics.tsaplots.plot_acf()
【4.2】偏自己相関(PACF: Partial AutoCorrelation Function)
- ラグ $k$ での直接的な相関(中間の影響を除去したもの)
- ラグ $k$ までのARモデルによって計算される:
$$
x_t = \phi_1 x_{t-1} + \phi_2 x_{t-2} + \dots + \phi_k x_{t-k} + \varepsilon_t
$$
- PACFは $\phi_k$(AR係数)の値を表す
- Python:
statsmodels.graphics.tsaplots.plot_pacf()
【4.3】ラグプロット(Lag Plot)
- $x_t$ と $x_{t-k}$ を散布図でプロットすることで、相関構造を視覚的に確認
【4.4】定常性(Stationarity)
弱定常性の定義:
- 平均が一定:$\mathbb{E}[x_t] = \mu$
- 分散が一定:$\text{Var}[x_t] = \sigma^2$
- 共分散が時刻差にのみ依存:$\text{Cov}(x_t, x_{t-k}) = \gamma_k$
非定常なデータは、予測に不向きかつ統計モデリングに適さない。
【4.5】単位根検定(ADF: Augmented Dickey-Fuller Test)
以下の回帰モデルで検定:
$$
\Delta x_t = \alpha + \beta t + \gamma x_{t-1} + \sum_{i=1}^{p} \phi_i \Delta x_{t-i} + \varepsilon_t
$$
- 帰無仮説:$\gamma = 0$(単位根あり=非定常)
- 対立仮説:$\gamma < 0$(定常)
Python:
from statsmodels.tsa.stattools import adfuller
result = adfuller(x)
【4.6】差分による定常化
1階差分:
$$
y_t = x_t - x_{t-1}
$$
2階差分:
$$
y_t = \Delta x_t - \Delta x_{t-1} = x_t - 2x_{t-1} + x_{t-2}
$$
差分後にADF検定で定常性を再確認する。
【第5章】予測モデル入門
■ 目標
- 株価などの時系列データに予測モデルを構築
- AR/MA/ARIMA を基礎から理解し、予測に活用
- モデルの良否は情報量規準(AIC/BIC)で評価
【5.1】ARモデル(AutoRegressive)
自己回帰モデル:現在の値は過去の値に依存
$$
x_t = \phi_1 x_{t-1} + \phi_2 x_{t-2} + \cdots + \phi_p x_{t-p} + \varepsilon_t
$$
- $\phi_i$:自己回帰係数
- $p$:次数(ラグ数)
- $\varepsilon_t$:ホワイトノイズ
【5.2】MAモデル(Moving Average)
移動平均モデル:現在の値は過去の誤差に依存
$$
x_t = \mu + \varepsilon_t + \theta_1 \varepsilon_{t-1} + \cdots + \theta_q \varepsilon_{t-q}
$$
- $\theta_i$:移動平均係数
- $q$:次数(誤差のラグ数)
- $\varepsilon_t$:誤差項
【5.3】ARMAモデル(AR + MA)
定常時系列に対して、ARとMAの両方を組み合わせ:
$$
x_t = \phi_1 x_{t-1} + \cdots + \phi_p x_{t-p} + \varepsilon_t + \theta_1 \varepsilon_{t-1} + \cdots + \theta_q \varepsilon_{t-q}
$$
※前提:データが定常(差分不要)
【5.4】ARIMAモデル(非定常データ対応)
ARMAに「差分」操作を加えたモデル:
$$
\Delta^d x_t = \text{ARMA}(p, q)
$$
- $d$:差分の回数(非定常性を除去)
- $\Delta x_t = x_t - x_{t-1}$(1階差分)
【5.5】SARIMAモデル(季節性あり)
季節要素を含んだARIMAモデル:
$$
SARIMA(p, d, q) \times (P, D, Q)_s
$$
- $s$:季節の周期(例:12ヶ月)
- $(P, D, Q)$:季節AR, 差分, MAの次数
【5.6】モデル選定指標(AIC / BIC)
モデルの当てはまりと複雑さを比較:
$$
\text{AIC} = -2 \log L + 2k
\quad,\quad
\text{BIC} = -2 \log L + k \log N
$$
- $L$:尤度(データに対するモデルの合致度)
- $k$:モデルのパラメータ数
- $N$:データ数
- 小さいほど良いモデルとされる
【第6章】株価とベイズ推定・カルマンフィルタ
■ 目標
- ノイズのある株価観測から真の価格変動を推定する
- 株価の変化を状態空間モデルで表現し、カルマンフィルタで推定
- ベイズ推定との関係と違いを理解する
【6.1】観測モデルと状態空間モデル
株価観測データはノイズを含むと仮定:
● 観測モデル(ベイズ/カルマン共通)
$$
y_t = x_t + \varepsilon_t, \quad \varepsilon_t \sim \mathcal{N}(0, R)
$$
- $x_t$:真の株価(未知)
- $y_t$:観測された株価(ノイズあり)
- $R$:観測ノイズの分散
● 状態遷移モデル(カルマン専用)
$$
x_t = x_{t-1} + w_t, \quad w_t \sim \mathcal{N}(0, Q)
$$
- $Q$:プロセスノイズの分散(価格変動の不確かさ)
【6.2】ベイズ推定による推論
目的:観測 $y_{1:t}$ をもとに、$x_t$ の事後分布を求める
● 式(1次元・逐次更新)
$$
p(x_t | y_{1:t}) \propto p(y_t | x_t) \cdot p(x_t | y_{1:t-1})
$$
- 観測尤度 $p(y_t | x_t)$ は正規分布(ノイズモデル)
- 予測分布 $p(x_t | y_{1:t-1})$ は状態遷移の結果
【6.3】カルマンフィルタの数式(線形・ガウス)
初期値:
$$
\hat{x}_0 = \mathbb{E}[x_0], \quad P_0 = \text{Var}[x_0]
$$
■ 予測ステップ:
$$
\hat{x}{t|t-1} = A \hat{x}{t-1}, \quad P_{t|t-1} = A P_{t-1} A^T + Q
$$
■ 更新ステップ:
$$
K_t = P_{t|t-1} H^T (H P_{t|t-1} H^T + R)^{-1}
$$
$$
\hat{x}t = \hat{x}{t|t-1} + K_t (y_t - H \hat{x}_{t|t-1})
$$
$$
P_t = (I - K_t H) P_{t|t-1}
$$
- $K_t$:カルマンゲイン
- $A$:状態遷移(例:$A=1$ならランダムウォーク)
- $H$:観測行列(通常 $H = 1$)
【6.4】Pythonコードでの例(シンプル株価推定)
# y_t = x_t + noise, x_t = x_{t-1} + noise
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1)
N = 100
x_true = np.cumsum(np.random.randn(N)) # 真の株価(ランダムウォーク)
y_obs = x_true + np.random.normal(0, 2, N) # 観測値(ノイズあり)
x_est = np.zeros(N)
P = 1.0
Q = 1e-2
R = 4
A = H = 1.0
for t in range(1, N):
# 予測
x_pred = A * x_est[t-1]
P_pred = A * P * A + Q
# 更新
K = P_pred * H / (H * P_pred * H + R)
x_est[t] = x_pred + K * (y_obs
【第7章】ブラウン運動・偏微分方程式と株価
■ 目標
- 株価の確率的な変動を連続時間の確率過程として捉える
- **ブラウン運動(ウィーナー過程)**を用いた株価モデルを理解する
- **確率微分方程式(SDE)とブラック・ショールズ方程式(PDE)**を導入する
【7.1】ブラウン運動(Wiener Process)
● 定義
$$
W(t)
\quad \text{with} \quad
W(0) = 0,\quad W(t) \sim \mathcal{N}(0, t),\quad W(t)\ \text{連続かつ独立増分}
$$
- 平均ゼロ、分散 $t$ の正規分布
- 株価モデルのランダム部分に使われる
【7.2】幾何ブラウン運動(Geometric Brownian Motion)
株価 $S(t)$ のモデル:
$$
dS(t) = \mu S(t) dt + \sigma S(t) dW(t)
$$
- $\mu$:期待成長率(ドリフト項)
- $\sigma$:変動率(ボラティリティ)
- $dW(t)$:ブラウン運動の微小変化
このSDEを解くと:
$$
S(t) = S(0) \exp \left[ \left(\mu - \frac{\sigma^2}{2} \right)t + \sigma W(t) \right]
$$
【7.3】株価の対数収益と正規分布
対数収益:
$$
r(t) = \log\frac{S(t)}{S(0)} \sim \mathcal{N} \left( \left( \mu - \frac{\sigma^2}{2} \right)t,\ \sigma^2 t \right)
$$
- 株価の対数リターンは正規分布に従う(対数正規性)
【7.4】ブラック・ショールズ方程式(PDE)
デリバティブ価格 $V(S, t)$ に関する偏微分方程式:
$$
\frac{\partial V}{\partial t} + \frac{1}{2} \sigma^2 S^2 \frac{\partial^2 V}{\partial S^2} + r S \frac{\partial V}{\partial S} - rV = 0
$$
- $S$:基礎資産価格
- $r$:無リスク利子率
- $\sigma$:ボラティリティ
この式は、金融工学においてオプション価格を決定する中心的な役割を果たす。
【第8章】深層学習と株価予測:Transformerによる時系列解析
■ 目的
- 時系列予測におけるLSTMの限界を克服する
- Attention 機構を活用して長期依存性のある株価データを効率的に予測
- Transformerの構造と数式、そして株価時系列データへの応用
【8.1】なぜ Transformer を使うのか?
● LSTM/RNN の課題
- 長期依存性の記憶に弱い
- 学習に時間がかかる(逐次処理)
● Transformer の特徴
- 並列計算が可能
- Self-Attention により全系列を同時参照
- 長期の関係を効率よく保持
【8.2】Self-Attention(自己注意機構)
入力系列:$X = [x_1, x_2, \ldots, x_T]$
各時刻のベクトル $x_t$ に対して以下を計算:
-
クエリ(Q)、キー(K)、バリュー(V)を線形変換:
$$
Q = XW^Q, \quad K = XW^K, \quad V = XW^V
$$ -
Attention スコア:
$$
\text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^T}{\sqrt{d_k}} \right)V
$$
- $d_k$:キーの次元数(スケーリング)
- 各 $x_t$ の文脈を全体から集約する
【8.3】Transformer Encoder による予測モデル
構成要素:
- ポジショナルエンコーディング:系列順序の情報付加
- Multi-Head Attention:異なる視点での注意
- Feed Forward Layer:全結合層による変換
- Layer Normalization / Residual:安定性と深層構造
【8.4】時系列予測モデル(株価)としての適用方法
● 入力
- 過去 $T$ ステップの OHLCV または終値系列
● 出力
- 次の $k$ ステップの予測値(回帰)
● 入力整形
# 例:ウィンドウサイズ T=30, 特徴数=1(終値)
X.shape = (サンプル数, 30, 1)
【8.5】株価データでのTransformer実装(概要)
from keras.models import Model
from keras.layers import Input, Dense, LayerNormalization, Dropout
from keras.layers import MultiHeadAttention, GlobalAveragePooling1D
input_layer = Input(shape=(30, 1))
att = MultiHeadAttention(num_heads=2, key_dim=32)(input_layer, input_layer)
att = LayerNormalization()(att + input_layer)
ff = Dense(64, activation='relu')(att)
ff = Dropout(0.1)(ff)
ff = LayerNormalization()(ff + att)
gap = GlobalAveragePooling1D()(ff)
output = Dense(1)(gap)
model = Model(inputs=input_layer, outputs=output)
model.compile(optimizer='adam', loss='mse')
【8.6】補足:ポジショナルエンコーディング
系列順を保持するために加えるベクトル:
$$
PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d}}\right), \quad
PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d}}\right)
$$
【8.7】注意点
- 大量データが必要
- 小データでは過学習に注意
- より高精度を狙うにはハイパーパラメータチューニングが重要
【8.8】実運用での使用例
- 株価予測
- 出来高予測
- 複数銘柄のマルチ系列処理