58 lines
No EOL
1.5 KiB
Python
58 lines
No EOL
1.5 KiB
Python
from datetime import datetime
|
|
import os
|
|
|
|
import pandas as pd
|
|
from dotenv import load_dotenv
|
|
|
|
from alpaca.data.historical import StockHistoricalDataClient
|
|
from alpaca.data.requests import StockBarsRequest
|
|
from alpaca.data.timeframe import TimeFrame
|
|
|
|
|
|
load_dotenv()
|
|
|
|
API_KEY = os.getenv("ALPACA_API_KEY")
|
|
SECRET_KEY = os.getenv("ALPACA_SECRET_KEY")
|
|
|
|
|
|
def fetch_stock_data(symbol, start_date, end_date):
|
|
client = StockHistoricalDataClient(API_KEY, SECRET_KEY)
|
|
|
|
request = StockBarsRequest(
|
|
symbol_or_symbols=symbol,
|
|
timeframe=TimeFrame.Day,
|
|
start=datetime.fromisoformat(start_date),
|
|
end=datetime.fromisoformat(end_date),
|
|
)
|
|
|
|
bars = client.get_stock_bars(request)
|
|
df = bars.df.reset_index()
|
|
|
|
return df
|
|
|
|
|
|
def analyze_stock(df):
|
|
df["Return"] = df["close"].pct_change()
|
|
df["MA_3"] = df["close"].rolling(window=3).mean()
|
|
|
|
print("\nFirst rows:")
|
|
print(df.head())
|
|
|
|
print("\nStock analysis:")
|
|
print(f"Highest price: {df['close'].max():.2f}")
|
|
print(f"Lowest price: {df['close'].min():.2f}")
|
|
print(f"Average price: {df['close'].mean():.2f}")
|
|
print(f"Average return: {df['Return'].mean():.4f}")
|
|
|
|
print("\nClose, Return, MA_3:")
|
|
print(df[["timestamp", "close", "Return", "MA_3"]])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
symbol = input("Enter stock symbol, for example AAPL: ").upper()
|
|
|
|
start_date = input("Start date YYYY-MM-DD: ")
|
|
end_date = input("End date YYYY-MM-DD: ")
|
|
|
|
df = fetch_stock_data(symbol, start_date, end_date)
|
|
analyze_stock(df) |