| import streamlit as st |
| import pandas as pd |
| import numpy as np |
| import statsmodels.api as sm |
| import matplotlib.pyplot as plt |
|
|
| |
| def generate_data(days=252): |
| np.random.seed(0) |
| dates = pd.date_range(start='2023-01-01', periods=days, freq='B') |
| |
| initial_values = { |
| 'stock_index': 1000, |
| 'swap_rate': 0.25, |
| 'fx_rate': 110, |
| 'credit_spread': 10 |
| } |
| |
| daily_volatility = { |
| 'stock_index': 0.01, |
| 'swap_rate': 0.0001, |
| 'fx_rate': 0.001, |
| 'credit_spread': 0.1 |
| } |
| |
| data = pd.DataFrame(index=dates) |
| for key, value in initial_values.items(): |
| daily_changes = np.random.normal(loc=0, scale=daily_volatility[key], size=days) |
| data[key] = value * (1 + np.cumsum(daily_changes)) |
| |
| return data |
|
|
| |
| data = generate_data() |
|
|
| |
| st.title("インパルス応答とモンテカルロシミュレーション") |
|
|
| |
| variable = st.selectbox("変数を選択してください", data.columns) |
|
|
| |
| model = sm.tsa.VAR(data) |
| results = model.fit(maxlags=5) |
|
|
| |
| sigma = results.sigma_u |
| epsilon = 1e-10 |
| sigma += epsilon * np.eye(sigma.shape[0]) |
|
|
| |
| irf = results.irf(10) |
| st.write(f"インパルス応答関数: {variable}") |
| fig = irf.plot(orth=True, impulse=variable) |
| st.pyplot(fig) |
|
|
| |
| simulations = [] |
| num_simulations = 100 |
| for _ in range(num_simulations): |
| simulated_data = results.simulate_var(steps=252) |
| simulations.append(simulated_data) |
|
|
| |
| simulations = np.array(simulations) |
| mean_simulation = np.mean(simulations, axis=0) |
| std_simulation = np.std(simulations, axis=0) |
|
|
| |
| st.write("モンテカルロシミュレーション結果") |
| fig, ax = plt.subplots(figsize=(12, 8)) |
| for i, column in enumerate(data.columns): |
| ax.plot(data.index, mean_simulation[:, i], label=f'Mean Simulation - {column}') |
| ax.fill_between(data.index, mean_simulation[:, i] - 1.96*std_simulation[:, i], |
| mean_simulation[:, i] + 1.96*std_simulation[:, i], alpha=0.2) |
| ax.legend() |
| st.pyplot(fig) |
|
|
|
|