File size: 4,794 Bytes
9175035 cbabd42 9175035 cbabd42 5d5dab0 cbabd42 5d5dab0 cbabd42 5d5dab0 b0f9ac3 cbabd42 b0f9ac3 cbabd42 b0f9ac3 9175035 5d5dab0 9175035 5d5dab0 9175035 cbabd42 5d5dab0 cbabd42 9175035 cbabd42 9175035 cbabd42 9175035 cbabd42 9175035 |
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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 |
import gradio as gr
import yfinance as yf
import numpy as np
import pandas as pd
import plotly.graph_objects as go
from datetime import datetime
def download_stock_data(ticker, start_date, end_date):
stock = yf.Ticker(ticker)
df = stock.history(start=start_date, end=end_date)
return df
def plot_interactive_logarithmic_stock_chart(ticker, start_date, end_date):
try:
stock = yf.Ticker(ticker)
data = stock.history(start=start_date, end=end_date)
if data.empty:
return "No data available for the specified date range."
x = (data.index - data.index[0]).days
y = np.log(data['Close'])
slope, intercept = np.polyfit(x, y, 1)
future_days = 365 * 10
all_days = np.arange(len(x) + future_days)
log_trend = np.exp(intercept + slope * all_days)
inner_upper_band = log_trend * 2
inner_lower_band = log_trend / 2
outer_upper_band = log_trend * 4
outer_lower_band = log_trend / 4
extended_dates = pd.date_range(start=data.index[0], periods=len(all_days), freq='D')
fig = go.Figure()
fig.add_trace(go.Scatter(x=data.index, y=data['Close'], mode='lines', name='Close Price', line=dict(color='#3366CC')))
fig.add_trace(go.Scatter(x=extended_dates, y=log_trend, mode='lines', name='Log Trend', line=dict(color='#DC3912')))
fig.add_trace(go.Scatter(x=extended_dates, y=inner_upper_band, mode='lines', name='Inner Upper Band', line=dict(color='#FF9900')))
fig.add_trace(go.Scatter(x=extended_dates, y=inner_lower_band, mode='lines', name='Inner Lower Band', line=dict(color='#FF9900')))
fig.add_trace(go.Scatter(x=extended_dates, y=outer_upper_band, mode='lines', name='Outer Upper Band', line=dict(color='#109618')))
fig.add_trace(go.Scatter(x=extended_dates, y=outer_lower_band, mode='lines', name='Outer Lower Band', line=dict(color='#109618')))
fig.update_layout(
title={
'text': 'Stock Log Charts',
'y': 0.95,
'x': 0.5,
'xanchor': 'center',
'yanchor': 'top'
},
xaxis_title='Date',
yaxis_title='Price (Log Scale)',
yaxis_type="log",
height=800,
legend=dict(x=0.01, y=0.99, bgcolor='rgba(255, 255, 255, 0.8)'),
hovermode='x unified',
plot_bgcolor='#F5F5F5',
paper_bgcolor='#F5F5F5',
font=dict(family="Arial", size=12, color="#333333")
)
fig.update_xaxes(
rangeslider_visible=True,
rangeselector=dict(
buttons=list([
dict(count=1, label="1m", step="month", stepmode="backward"),
dict(count=6, label="6m", step="month", stepmode="backward"),
dict(count=1, label="YTD", step="year", stepmode="todate"),
dict(count=1, label="1y", step="year", stepmode="backward"),
dict(step="all")
])
)
)
return fig
except Exception as e:
return f"An error occurred: {str(e)}"
# Get the current date
current_date = datetime.now().strftime("%Y-%m-%d")
# Custom CSS to make charts full-width and larger, and apply a theme
custom_css = """
.container {max-width: 100% !important; padding: 0 !important;}
.plot-container {height: 800px !important; width: 100% !important;}
.react-plotly-container {height: 100% !important; width: 100% !important;}
body {background-color: #F5F5F5; color: #333333; font-family: Arial, sans-serif;}
.gradio-container {background-color: #FFFFFF; border-radius: 10px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);}
.gr-button {background-color: #3366CC; color: white;}
.gr-button:hover {background-color: #254EDB;}
.gr-input {border: 1px solid #CCCCCC; border-radius: 4px;}
.gr-input:focus {border-color: #3366CC; box-shadow: 0 0 0 2px rgba(51, 102, 204, 0.2);}
"""
# Create Gradio interface
with gr.Blocks(css=custom_css, title="Stock Log Charts") as iface:
gr.Markdown("# Stock Log Charts", elem_id="main-title")
gr.Markdown("Enter a stock ticker and date range to generate a logarithmic chart.")
with gr.Row():
ticker = gr.Textbox(label="Stock Ticker", value="MSFT")
start_date = gr.Textbox(label="Start Date", value="2015-01-01")
end_date = gr.Textbox(label="End Date", value=current_date)
submit_button = gr.Button("Generate Chart")
with gr.Row():
log_plot = gr.Plot(label="Logarithmic Stock Chart")
submit_button.click(
plot_interactive_logarithmic_stock_chart,
inputs=[ticker, start_date, end_date],
outputs=[log_plot]
)
# Launch the app
iface.launch() |