Вступ
У швидкоплинному світі торгівлі акціями ціни постійно змінюються. Уявіть, що ви отримуєте повідомлення про ціни акцій у реальному часі, гарантуючи, що ніколи не пропустите важливу зміну. Завдяки AWS ви можете створити корисну систему сповіщень про акції, що дозволяє вам завжди бути в курсі цін на ваші улюблені акції.
Огляд проєкту
Мій проєкт сповіщень про акції допомагає користувачам тримати руку на пульсі постійно змінюваного фондового ринку. Було створено скрипт, який використовується в функції AWS Lambda для отримання та трансформації даних фондового ринку. Він надсилає оновлення про ваші улюблені акції безпосередньо на вашу електронну пошту або через текстові повідомлення за допомогою AWS SNS. Крім того, ви можете використовувати EventBridge для налаштування графіка отримання сповіщень.
Необхідні умови
- Знайомство з AWS та Python
- Обліковий запис AWS
- API ключ від Alpha Vantage або будь-якого іншого API для фондового ринку
- Редактор коду/тексту
Послуги та інструменти:
Amazon Web Services (AWS) — онлайн-постачальник послуг у хмарі.
AWS Lambda — безсерверна хмарна обчислювальна служба, яка виконує код у відповідь на події.
AWS SNS — використовується для налаштування, конфігурації та надсилання сповіщень з хмари.
AWS Identity and Access Management (IAM) — керує доступом до різних служб AWS безпечно.
Python — мова програмування, яку ми використовуємо для створення коду, що потім буде вставлено в функцію Lambda.
Alpha Vantage — надає фінансові дані ринку за допомогою API.
API (інтерфейс програмування додатків) — дозволяє зберігати фінансові дані та взаємодіяти між системами, використовуючи набір визначень і протоколів.
Налаштування
1. Отримайте API ключ від Alpha Vantage.
Натисніть тут, щоб зареєструватися.
2. Створіть тему в Amazon SNS
Перейдіть до Simple Notification Service в AWS. Перейдіть до тем і натисніть «створити нову тему». Виберіть стандартний тип. Дайте йому ім'я. (наприклад, stock_topic). Можна додати відображення для персоналізації.
Після створення обов'язково збережіть ARN вашої теми, щоб використати його пізніше в проєкті.
3. Створіть політику для SNS, яка буде використовуватися Lambda.
Перейдіть до Identity and Access Management (IAM). Клацніть на політики та натисніть «створити нову політику». В редакторі політик виберіть JSON замість Visual. Скопіюйте цей код в редактор.
{
“Version”: “2012–10–17”,
“Statement”: [
{
“Effect”: “Allow”,
“Action”: “sns:Publish”,
“Resource”: “arn:aws:sns:REGION:ACCOUNT_ID:stock_topic”
}
]
}
Замість “arn:aws:sns:REGION:ACCOUNTID:stocktopic” використайте ARN вашої теми SNS. Натисніть «далі» і дайте вашій політиці ім'я.
4. Створіть нову роль
Використовуйте існуючу політику ASWLambdaBasicExcusable та нову політику, яку ви створили, щоб створити роль, яка надасть права доступу до функції Lambda, яку буде створено пізніше.
5. Створіть функцію Lambda
Створимо нову функцію Lambda. Виберіть Python 3.xx як середовище виконання та x86_64 як архітектуру. Прикріпіть створену роль до неї.
6. Створіть підписку для SNS і підпишіться на неї
Ви можете підписатися за допомогою електронної пошти та/або SMS.
Потім ви отримаєте повідомлення і повинні підтвердити підписку.
7.
Додавання коду та змінних середовища до функції Lambda
Потім ми додамо цей код до функції, коли вона буде створена:
import os
import json
import urllib.request
import boto3
from datetime import datetime, timezone
def format_stock_data(stock, symbol):
price = stock.get("05. price", "N/A")
change = stock.get("09. change", "N/A")
change_percent = stock.get("10. change percent", "N/A")
high_52_week = stock.get("03. high", "N/A")
low_52_week = stock.get("04. low", "N/A")
timestamp = stock.get("07. latest trading day", "Unknown")
return (
f"Stock Symbol: {symbol}\n"
f"Current Price: ${price}\n"
f"Change: {change}\n"
f"Change Percent: {change_percent}\n"
n"
f"52-Week Low: ${low_52_week}\n"
f"Timestamp: {timestamp}\n"
)
def lambda_handler(event, context):
# Get environment variables
api_key = os.getenv("ALPHA_VANTAGE_API_KEY")
sns_topic_arn = os.getenv("SNS_TOPIC_ARN")
sns_client = boto3.client("sns")
# Add the stock symbols you want to monitor
stock_symbols = ["AAPL", "GOOGL", "AMZN"]
messages = []
for symbol in stock_symbols:
# Fetch data from the API
api_url = f"https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol={symbol}&apikey={api_key}"
try:
with urllib.request.urlopen(api_url) as response:
data = json.loads(response.read().decode())["Global Quote"]
print(json.dumps(data, indent=4)) # Debugging: log the raw data
messages.append(format_stock_data(data, symbol))
except Exception as e:
print(f"Error fetching data from API for {symbol}: {e}")
return {"statusCode": 500, "body": "Error fetching data"}
final_message = "\n---\n".join(messages) if messages else "No stock data available."
# Publish to SNS
try:
sns_client.publish(
TopicArn=sns_topic_arn,
Message=final_message,
Subject="Stock Market Updates"
)
print("Message published to SNS successfully.")
except Exception as e:
print(f"Error publishing to SNS: {e}")
return {"statusCode": 500, "body": "Error publishing to SNS"}
return {"statusCode": 200, "body": "Data processed and sent to SNS"}
(Якщо ви хочете протестувати за допомогою інших акцій, змініть цей рядок коду на символи акцій, які хочете побачити)
8. Тестування та деплой
Додайте змінні середовища до функції Lambda, щоб функція могла комунікувати з API та нашою темою SNS.
Потім потрібно протестувати код. (Якщо виникає помилка, спробуйте змінити час очікування для функції з 3 секунд на 6 або більше.)
Ось приклад результатів:
Якщо тест пройшов успішно, збережіть і деплойте мій код для функції.
(Опціонально) Налаштування графіка EventBridge
Ви можете створити графік для EventBridge, щоб функція Lambda запускалася у певний час. Приклад — запускати функцію щоранку о 9:30 для отримання даних фондового ринку.
Висновок
Цей проєкт дозволив створити щось, що можна додати до мого портфоліо, а також створити корисний інструмент для повсякденного використання. Те, що я тут навчився, допоможе створювати більші та кращі проєкти в майбутньому. Дякую Ifeanyi Otuonye (REXTECH) за ідею проєкту. Слідкуйте за новими проєктами.
Перекладено з: Stay Ahead of the Market: Real-Time Stock Notifications with AWS.