File size: 5,387 Bytes
f38f2ab
58d4ba4
 
 
 
f38f2ab
58d4ba4
 
 
 
 
496ed86
 
58d4ba4
 
 
 
 
 
f38f2ab
 
58d4ba4
f38f2ab
58d4ba4
 
f38f2ab
496ed86
58d4ba4
 
 
 
496ed86
58d4ba4
 
 
 
 
 
496ed86
58d4ba4
 
 
f38f2ab
58d4ba4
 
 
 
 
f38f2ab
58d4ba4
f38f2ab
58d4ba4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f38f2ab
58d4ba4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f38f2ab
58d4ba4
 
 
 
496ed86
58d4ba4
 
 
 
 
 
 
 
 
 
 
 
 
 
496ed86
58d4ba4
 
 
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
import requests
from fastapi import FastAPI, Query
from fastapi.responses import FileResponse
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler
from fastapi.middleware.cors import CORSMiddleware
import uvicorn
from fastapi.responses import HTMLResponse

app = FastAPI()

# Configure CORS
origins = [
    "*",  # Allows all origins
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,  # Allows all origins
    allow_credentials=True,
    allow_methods=["*"],  # Allows all methods
    allow_headers=["*"],  # Allows all headers
)

# Constants for API access
API_KEY = 'U9ER11OA4VGEWV9K'
STOCK_SYMBOL = 'AAPL'
API_URL = f"https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol={STOCK_SYMBOL}&apikey={API_KEY}"

# Function to fetch stock data
def fetch_stock_data(symbol):
    url = f"https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol={symbol}&apikey={API_KEY}"
    response = requests.get(url)
    data = response.json()
    return data['Time Series (Daily)']

# Function to update stock data and plot
def fetch_and_update(symbol=STOCK_SYMBOL, graph_type="line"):
    daily_data = fetch_stock_data(symbol)
    
    dates = []
    close_prices = []
    for date, daily_info in sorted(daily_data.items()):
        dates.append(datetime.strptime(date, '%Y-%m-%d'))
        close_prices.append(float(daily_info['4. close']))
    
    plt.figure(figsize=(14, 7))
    
    if graph_type == "line":
        plt.plot(dates, close_prices, marker='o', linestyle='-')
    elif graph_type == "bar":
        plt.bar(dates, close_prices)
    elif graph_type == "scatter":
        plt.scatter(dates, close_prices)
    elif graph_type == "buy_sell":
        stock_data = pd.DataFrame({'Date': dates, 'Close': close_prices})
        stock_data['Short_MA'] = stock_data['Close'].rolling(window=40).mean()
        stock_data['Long_MA'] = stock_data['Close'].rolling(window=100).mean()

        buy_signals = stock_data[(stock_data['Short_MA'] > stock_data['Long_MA']) & (stock_data['Short_MA'].shift(1) <= stock_data['Long_MA'].shift(1))].index
        sell_signals = stock_data[(stock_data['Short_MA'] < stock_data['Long_MA']) & (stock_data['Short_MA'].shift(1) >= stock_data['Long_MA'].shift(1))].index

        plt.plot(stock_data['Date'], stock_data['Close'], label='Closing Price', alpha=0.5)
        plt.plot(stock_data['Date'], stock_data['Short_MA'], label='40-Day Moving Average', alpha=0.75)
        plt.plot(stock_data['Date'], stock_data['Long_MA'], label='100-Day Moving Average', alpha=0.75)
        plt.scatter(stock_data.loc[buy_signals]['Date'], stock_data.loc[buy_signals]['Close'], marker='^', color='g', label='Buy Signal', alpha=1)
        plt.scatter(stock_data.loc[sell_signals]['Date'], stock_data.loc[sell_signals]['Close'], marker='v', color='r', label='Sell Signal', alpha=1)

    plt.title(f'{symbol} Stock Prices Over Time')
    plt.xlabel('Date')
    plt.ylabel('Close Price ($)')
    plt.gcf().autofmt_xdate()
    plt.legend()
    plt.savefig("stock.png")  # Save the plot as a PNG file
    plt.close()
    return dates, close_prices

# Preprocess data for prediction
def preprocess_data(dates, close_prices):
    df = pd.DataFrame({'Date': dates, 'Close': close_prices})
    df['Date_ordinal'] = pd.to_datetime(df['Date']).apply(lambda date: date.toordinal())
    
    # Handle missing values (if any)
    df.fillna(method='ffill', inplace=True)
    df.fillna(method='bfill', inplace=True)
    
    # Feature scaling
    scaler = StandardScaler()
    df['Close_scaled'] = scaler.fit_transform(df[['Close']])
    
    return df, scaler

# Machine Learning Model for Prediction
def predict_stock_prices(dates, close_prices, interval_days=7):
    df, scaler = preprocess_data(dates, close_prices)
    
    model = LinearRegression()
    model.fit(df[['Date_ordinal']], df['Close_scaled'])
    
    last_date = df['Date'].max()
    future_dates = [last_date + timedelta(days=i) for i in range(1, interval_days+1)]
    future_ordinal = [date.toordinal() for date in future_dates]
    scaled_predictions = model.predict(pd.DataFrame(future_ordinal, columns=['Date_ordinal']))
    
    predictions = scaler.inverse_transform(scaled_predictions.reshape(-1, 1)).flatten()
    
    return future_dates, predictions


@app.get("/", response_class=HTMLResponse)
async def read_root():
    html= open("index.html","r")
    return HTMLResponse(content=html.read())

# FastAPI endpoint to serve the graph image
@app.get("/graph")
async def get_graph(symbol: str = STOCK_SYMBOL, graph_type: str = Query("line", enum=["line", "bar", "scatter", "buy_sell"])):
    dates, close_prices = fetch_and_update(symbol, graph_type)
    return FileResponse("stock.png")

# FastAPI endpoint to predict stock prices
@app.get("/predict")
async def predict(symbol: str = STOCK_SYMBOL, interval: int = 7):
    dates, close_prices = fetch_and_update(symbol)
    future_dates, predictions = predict_stock_prices(dates, close_prices, interval)
    
    prediction_data = {str(date): float(pred) for date, pred in zip(future_dates, predictions)}
    return prediction_data

# if __name__ == "__main__":
#     # Run the FastAPI app using uvicorn with automatic reloading
#     uvicorn.run(app, host="127.0.0.1", port=8000)