Spaces:
Sleeping
Sleeping
File size: 6,023 Bytes
1a2a035 cb954a2 1a2a035 |
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 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 |
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 |