Wednesday, November 30, 2022

Python - Project - Stock Trading News App (Day 36)

This is a 100 Days challenge to learn a new language (Python). 100 Days of Code - The Complete Python Pro Bootcamp 

I will post some notes to motivate myself to finish this challenge.


Goal



If the target stock price is up or down 5% between yesterday, then get the top three relating news and send those result to your phone number.




Web API List
    Twilio

Ex: 
import requests
import os
from twilio.rest import Client
from dotenv import load_dotenv

# Load Environmental Variables from .env
load_dotenv()

# Stock Price Web API
ALPHA_VANTAGE_URL = "https://www.alphavantage.co/query"
ALPHA_VANTAGE_API_KEY = os.environ.get("ALPHA_VANTAGE_API_KEY")

# News Web API
NEWS_API_URL = "https://newsapi.org/v2/everything"
NEWS_API_KEY = os.environ.get("NEWS_API_KEY")

# SMS Web API
TWILIO_ACCOUNT_SID = os.environ.get("TWILIO_ACCOUNT_SID")
TWILIO_AUTH_TOKEN = os.environ.get("TWILIO_AUTH_TOKEN")

# Company to monitor
COMPANY = "AXSM"

def get_stock_price_history_data_by_company(company):
    # Prepare parameters for API
    parameters = {
        "function": "TIME_SERIES_DAILY_ADJUSTED",
        "symbol": company,
        "apikey": ALPHA_VANTAGE_API_KEY
    }

    # Sends a GET request.
    response = requests.get(ALPHA_VANTAGE_URL, params=parameters)
    # Raises HTTPError, if one occurred.
    response.raise_for_status()
    # Returns the json-encoded content of a response, if any.
    res = response.json()

    # Get Daily Time Series Dictionary
    time_series_daily = res["Time Series (Daily)"]
    # Get all keys
    time_series_daily_key = list(time_series_daily.keys())
    # Get close price of yesterday
    yesterday_close_price = float(
        time_series_daily[time_series_daily_key[0]]["4. close"])
    # Get close price of the day before yesterday
    the_day_before_yesterday_close_price = float(
        time_series_daily[time_series_daily_key[1]]["4. close"])
    # Calculate
    return {
"yesterday": yesterday_close_price,
"the_day_before_yesterday": the_day_before_yesterday_close_price
}


def get_first_three_news_by_company(company):
    # Prepare parameters for API
    parameters = {
        "q": company,
        "apiKey": NEWS_API_KEY
    }

    # Sends a GET request.
    response = requests.get(NEWS_API_URL, params=parameters)
    # Raises HTTPError, if one occurred.
    response.raise_for_status()
    # Returns the json-encoded content of a response, if any.
    res = response.json()

    # Get the top three news
    return res["articles"][:3]


def send_sms(text: str):
    client = Client(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN)

    message = client.messages.create(
        body=text,
        from_='twilio test number',
        to='your_phone_number'
    )

    # If there is a sid, SMS was sent successfully
    print(message.sid)

  
stock_price_historical_data = get_stock_price_history_data_by_company(COMPANY)
chagne_rate = round(
(stock_price_historical_data["yesterday"] -
                  stock_price_historical_data["the_day_before_yesterday"]
)/stock_price_historical_data["yesterday"] * 100, 2)

if abs(chagne_rate) >= 5:
    first_three_news = get_first_three_news_by_company(COMPANY)
    text = f"{COMPANY}: {'🔺' if chagne_rate > 0 else '🔻'} {chagne_rate}%\n\n"

    # Loop through news
    for news in first_three_news:
        text += f"Headine: {news['title']}\nBrief: {news['description']}\n\n"

    send_sms(text)


No comments:

Post a Comment