Spaces:
Runtime error
Runtime error
File size: 3,787 Bytes
a723fe7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | import yfinance as yf
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import gradio as gr
def get_data(symbol, start_date, end_date):
data = yf.download(symbol, start=start_date, end=end_date)
return data['Close']
def monte_carlo_simulation(data, num_simulations, num_days):
log_returns = np.log(1 + data.pct_change())
mean = log_returns.mean()
variance = log_returns.var()
drift = mean - (0.5 * variance)
stdev = log_returns.std()
daily_returns = np.exp(drift + stdev * np.random.normal(size=(num_days, num_simulations)))
price_paths = np.zeros_like(daily_returns)
price_paths[0] = data.iloc[-1]
for t in range(1, num_days):
price_paths[t] = price_paths[t - 1] * daily_returns[t]
return price_paths
def sigma_confidence_interval(price_paths, confidence_level=0.95):
final_prices = price_paths[-1]
lower_bound = np.percentile(final_prices, (1 - confidence_level) / 2 * 100)
upper_bound = np.percentile(final_prices, (1 + confidence_level) / 2 * 100)
return lower_bound, upper_bound
def plot_simulation(price_paths, title):
plt.figure(figsize=(10, 5))
plt.plot(price_paths)
plt.title(title)
plt.xlabel('Days')
plt.ylabel('Price')
plt.grid(True)
plt.show()
def plot_correlation(nifty_data, sensex_data):
correlation = nifty_data.corr(sensex_data)
plt.figure(figsize=(10, 5))
plt.scatter(nifty_data, sensex_data)
plt.title(f'Correlation between NIFTY and SENSEX: {correlation:.2f}')
plt.xlabel('NIFTY')
plt.ylabel('SENSEX')
plt.grid(True)
plt.show()
def simulate(start_date, end_date, num_simulations, num_days):
nifty_data = get_data('^NSEI', start_date, end_date)
sensex_data = get_data('^BSESN', start_date, end_date)
nifty_paths = monte_carlo_simulation(nifty_data, num_simulations, num_days)
sensex_paths = monte_carlo_simulation(sensex_data, num_simulations, num_days)
nifty_lower_bound, nifty_upper_bound = sigma_confidence_interval(nifty_paths)
sensex_lower_bound, sensex_upper_bound = sigma_confidence_interval(sensex_paths)
fig, axs = plt.subplots(1, 3, figsize=(40, 10))
for path in nifty_paths.T:
axs[0].plot(path)
axs[0].set_title('Monte Carlo Simulation - NIFTY')
axs[0].set_xlabel('Days')
axs[0].set_ylabel('Price')
axs[0].grid(True)
for path in sensex_paths.T:
axs[1].plot(path)
axs[1].set_title('Monte Carlo Simulation - SENSEX')
axs[1].set_xlabel('Days')
axs[1].set_ylabel('Price')
axs[1].grid(True)
correlation = nifty_data.corr(sensex_data)
axs[2].scatter(nifty_data, sensex_data)
axs[2].set_title(f'Correlation between NIFTY and SENSEX: {correlation:.2f}')
axs[2].set_xlabel('NIFTY')
axs[2].set_ylabel('SENSEX')
axs[2].grid(True)
plt.tight_layout()
return fig, f'NIFTY Sigma Confidence Interval at 0.95: [{nifty_lower_bound:.1f} : {nifty_upper_bound:.1f}], SENSEX Sigma Confidence Interval at 0.95: [{sensex_lower_bound:.1f} : {sensex_upper_bound:.1f}]'
def gradio_app(start_date, end_date, num_simulations, num_days):
fig, interval = simulate(start_date, end_date, num_simulations, num_days)
return fig, interval
iface = gr.Interface(
fn=gradio_app,
inputs=[
gr.Textbox(placeholder="YYYY-MM-DD", label="Start Date"),
gr.Textbox(placeholder="YYYY-MM-DD", label="End Date"),
gr.Slider(minimum=100, maximum=10000, step=100, label="Number of Simulations"),
gr.Slider(minimum=10, maximum=365, step=10, label="Number of Days for Forecast")
],
outputs=[gr.Plot(label="Simulation Plots and Correlation Plot"), gr.Textbox(label="Sigma Confidence Interval")],
title="Monte Carlo Simulation for NIFTY and SENSEX"
)
iface.launch()
|