Alpha安定分布の確率密度関数計算とMATLAB実装

Alpha安定分布(Alpha-Stable Distribution)は、確率密度関数(PDF)が解析的に表現できない分布である。ただし、ガウス分布やコーシー分布などの特殊ケースを除き、数値的手法や近似アルゴリズムによって計算可能である。

分布の基本パラメータ

Alpha安定分布は以下の4つのパラメータで特徴づけられる:

  • 安定性指数(α):分布の裾の厚さを調整する(0 < α ≤ 2)。α = 2 のとき、ガウス分布に一致する。
  • 歪度係数(β):分布の非対称性を表す(-1 ≤ β ≤ 1)。
  • 尺度パラメータ(γ):分散のような役割を持つが、厳密には異なる(γ > 0)。
  • 位置パラメータ(μ):分布の中心を示す。

この分布の確率密度関数は特性関数を通じて定義される。

MATLABによる実装手法

1. 外部ツールボックスの活用

Stable Distribution Toolbox を使用することで、PDFの評価が容易になる。

% Alpha=1.5, β=0, γ=1, μ=0におけるPDFの例
alpha = 1.5;
beta = 0;
gamma = 1;
mu = 0;
x = linspace(-5, 5, 1000);
pdf_vals = stable_pdf(x, alpha, beta, gamma, mu);  % ツールボックスが必要
plot(x, pdf_vals);

2. 自作数値積分関数

任意のパラメータに対応したPDFを求めるために、数値積分を用いた独自関数を構築する。

function pdf_result = stable_pdf_custom(x_point, alpha, beta, gamma, mu)
    if nargin < 5, mu = 0; end
    if nargin < 4, gamma = 1; end
    if nargin < 3, beta = 0; end
    if nargin < 2, alpha = 1.5; end

    % 積分区間設定
    t_vals = linspace(eps, 10, 1000);
    dt = t_vals(2) - t_vals(1);

    % 特性関数の被積分関数
    integrand_func = @(t) sin((x_point - mu) * t / gamma) ./ t .* ...
        exp(-abs(t).^alpha .* (1 - 1i * beta * sign(t) * tan(pi * alpha / 2)));

    % 台形則による積分
    integral_value = trapz(t_vals, integrand_func(t_vals));
    pdf_result = (1 / (pi * gamma)) * integral_value;
end

3. 近似アルゴリズムの適用

Nolanによる近似法を元にした簡易的なPDF計算関数。

function approx_pdf = fast_stable_pdf(x_input, alpha, beta, gamma, mu)
    assert(alpha > 0 && alpha <= 2, 'Alpha must be within (0, 2]');
    assert(abs(beta) <= 1, 'Beta must be within [-1, 1]');

    beta_mod = beta * tan(pi * alpha / 2) / (alpha ~= 1);
    t_domain = linspace(eps, 10, 1000);

    integrand_part = zeros(size(t_domain));
    for idx = 1:length(t_domain)
        t_current = t_domain(idx);
        integrand_part(idx) = exp(-1i * t_current * (x_input - mu) + ...
            abs(t_current)^alpha * (1 - 1i * beta_mod * sign(t_current)));
    end

    integrated_sum = trapz(t_domain, integrand_part);
    approx_pdf = (1 / (pi * gamma)) * real(integrated_sum);
end

全体コード例

% パラメータ指定
alpha_val = 1.3;
beta_val = 0.4;
gamma_val = 1.0;
mu_val = 0;
range_x = linspace(-5, 5, 1000);

% 各手法によるPDF計算
pdf_numerical = arrayfun(@(x) stable_pdf_custom(x, alpha_val, beta_val, gamma_val, mu_val), range_x);
pdf_fast = arrayfun(@(x) fast_stable_pdf(x, alpha_val, beta_val, gamma_val, mu_val), range_x);

% グラフ表示
figure;
plot(range_x, pdf_numerical, 'b-', 'LineWidth', 1.5);
hold on;
plot(range_x, pdf_fast, 'r--', 'LineWidth', 1.5);
xlabel('x'); ylabel('PDF');
legend('Numerical Integration', 'Fast Approximation');
title(sprintf('Alpha-Stable PDF (α=%.1f, β=%.1f)', alpha_val, beta_val));
grid on;

性能向上テクニック

  • 積分範囲の調整:αが小さい場合、より広い範囲での積分が必要。
  • ベクトル化処理arrayfunparfor を使用して高速化。
  • 数値安定性の確保:複素数の指数計算は対数領域で行うことで精度を向上。

応用例

金融データへの適合

株式収益率のような厚尾分布のモデリングに適している。

% 株価データ読み込み
data_table = readtable('stock_returns.csv');
returns_data = data_table.Returns;

% パラメータ推定(最尤推定などが必要)
[est_alpha, est_beta] = fit_alpha_stable_params(returns_data);

% 分布フィッティング結果のプロット
histogram(returns_data, 'Normalization', 'pdf');
hold on;
fit_range = linspace(min(returns_data), max(returns_data), 1000);
plot(fit_range, stable_pdf_custom(fit_range, est_alpha, est_beta, 1, mean(returns_data)), 'r');

信号処理におけるノイズモデル

レーダーのクラッターなど、重尾ノイズを考慮したシミュレーション。

% 信号生成
time_axis = 0:0.01:1;
signal_clean = sin(2 * pi * 5 * time_axis);
noise_alpha = generate_alpha_noise(1.5, 0, 0.5, 0, length(signal_clean));
signal_noisy = signal_clean + noise_alpha';

% ノイズ除去(ウェーブレット変換)
signal_denoised = wdenoise(signal_noisy, 4);

タグ: MATLAB Alpha-stable distribution probability density function numerical integration financial modeling

7月16日 20:39 投稿