Spaces:
Running
Running
import matplotlib.pyplot as plt | |
import chainlit as cl | |
import plotly.graph_objects as go | |
import pandas as pd | |
import numpy as np | |
from datetime import datetime, timedelta | |
import yfinance as yf | |
from plotly.subplots import make_subplots | |
def get_stock_price(stockticker: str) -> str: | |
ticker = yf.Ticker(stockticker) | |
todays_data = ticker.history(period='1d') | |
return str(round(todays_data['Close'][0], 2)) | |
def plot_candlestick_stock_price(historical_data): | |
"""Useful for plotting candlestick plot for stock prices. | |
Use historical stock price data from yahoo finance for the week and plot them.""" | |
df=historical_data[['Close','Open','High','Low']] | |
df.index=pd.to_datetime(df.index) | |
df.index.names=['Date'] | |
df=df.reset_index() | |
fig = go.Figure(data=[go.Candlestick(x=df['Date'], | |
open=df['Open'], | |
high=df['High'], | |
low=df['Low'], | |
close=df['Close'])]) | |
fig.show() | |
def historical_stock_prices(stockticker, days_ago): | |
"""Upload accurate data to accurate dates from yahoo finance.""" | |
ticker = yf.Ticker(stockticker) | |
end_date = datetime.now() | |
start_date = end_date - timedelta(days=days_ago) | |
start_date = start_date.strftime('%Y-%m-%d') | |
end_date = end_date.strftime('%Y-%m-%d') | |
historical_data = ticker.history(start=start_date, end=end_date) | |
return historical_data | |
def plot_macd2(df): | |
try: | |
# Debugging: Print the dataframe columns and a few rows | |
print("DataFrame columns:", df.columns) | |
print("DataFrame head:\n", df.head()) | |
# Convert DataFrame index and columns to numpy arrays | |
index = df.index.to_numpy() | |
close_prices = df['Close'].to_numpy() | |
macd = df['MACD'].to_numpy() | |
signal_line = df['Signal_Line'].to_numpy() | |
macd_histogram = df['MACD_Histogram'].to_numpy() | |
fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True, figsize=(10, 8), gridspec_kw={'height_ratios': [3, 1]}) | |
# Subplot 1: Candlestick chart | |
ax1.plot(index, close_prices, label='Close', color='black') | |
ax1.set_title("Candlestick Chart") | |
ax1.set_ylabel("Price") | |
ax1.legend() | |
# Subplot 2: MACD | |
ax2.plot(index, macd, label='MACD', color='blue') | |
ax2.plot(index, signal_line, label='Signal Line', color='red') | |
histogram_colors = np.where(macd_histogram >= 0, 'green', 'red') | |
ax2.bar(index, macd_histogram, color=histogram_colors, alpha=0.6) | |
ax2.set_title("MACD") | |
ax2.set_ylabel("MACD Value") | |
ax2.legend() | |
plt.xlabel("Date") | |
plt.tight_layout() | |
return fig | |
except Exception as e: | |
print(f"Error in plot_macd: {e}") | |
return None | |
def plot_macd(df): | |
# Create Figure | |
fig = make_subplots(rows=2, cols=1, shared_xaxes=True, row_heights=[0.2, 0.1], | |
vertical_spacing=0.15, # Adjust vertical spacing between subplots | |
subplot_titles=("Candlestick Chart", "MACD")) # Add subplot titles | |
# Subplot 1: Plot candlestick chart | |
fig.add_trace(go.Candlestick( | |
x=df.index, | |
open=df['Open'], | |
high=df['High'], | |
low=df['Low'], | |
close=df['Close'], | |
increasing_line_color='#00cc96', # Green for increasing | |
decreasing_line_color='#ff3e3e', # Red for decreasing | |
showlegend=False | |
), row=1, col=1) # Specify row and column indices | |
# Subplot 2: Plot MACD | |
fig.add_trace( | |
go.Scatter( | |
x=df.index, | |
y=df['MACD'], | |
mode='lines', | |
name='MACD', | |
line=dict(color='blue') | |
), | |
row=2, col=1 | |
) | |
fig.add_trace( | |
go.Scatter( | |
x=df.index, | |
y=df['Signal_Line'], | |
mode='lines', | |
name='Signal Line', | |
line=dict(color='red') | |
), | |
row=2, col=1 | |
) | |
# Plot MACD Histogram with different colors for positive and negative values | |
histogram_colors = ['green' if val >= 0 else 'red' for val in df['MACD_Histogram']] | |
fig.add_trace( | |
go.Bar( | |
x=df.index, | |
y=df['MACD_Histogram'], | |
name='MACD Histogram', | |
marker_color=histogram_colors | |
), | |
row=2, col=1 | |
) | |
# Update layout with zoom and pan tools enabled | |
layout = go.Layout( | |
title='MSFT Candlestick Chart and MACD Subplots', | |
title_font=dict(size=12), # Adjust title font size | |
plot_bgcolor='#f2f2f2', # Light gray background | |
height=600, | |
width=1200, | |
xaxis_rangeslider=dict(visible=True, thickness=0.03), | |
) | |
# Update the layout of the entire figure | |
fig.update_layout(layout) | |
fig.update_yaxes(fixedrange=False, row=1, col=1) | |
fig.update_yaxes(fixedrange=True, row=2, col=1) | |
fig.update_xaxes(type='category', row=1, col=1) | |
fig.update_xaxes(type='category', nticks=10, row=2, col=1) | |
fig.show() | |
#return fig | |
def calculate_MACD(df, fast_period=12, slow_period=26, signal_period=9): | |
""" | |
Calculates the MACD (Moving Average Convergence Divergence) and related indicators. | |
Parameters: | |
df (DataFrame): A pandas DataFrame containing at least a 'Close' column with closing prices. | |
fast_period (int): The period for the fast EMA (default is 12). | |
slow_period (int): The period for the slow EMA (default is 26). | |
signal_period (int): The period for the signal line EMA (default is 9). | |
Returns: | |
DataFrame: A pandas DataFrame with the original data and added columns for MACD, Signal Line, and MACD Histogram. | |
""" | |
df['EMA_fast'] = df['Close'].ewm(span=fast_period, adjust=False).mean() | |
df['EMA_slow'] = df['Close'].ewm(span=slow_period, adjust=False).mean() | |
df['MACD'] = df['EMA_fast'] - df['EMA_slow'] | |
df['Signal_Line'] = df['MACD'].ewm(span=signal_period, adjust=False).mean() | |
df['MACD_Histogram'] = df['MACD'] - df['Signal_Line'] | |
return df |