Files
server-configs/fetch-stock-prices-v3.py
2026-02-13 22:24:27 +08:00

154 lines
4.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
获取股票价格和标普500指数最终版
"""
import requests
import json
from datetime import datetime
# Yahoo Finance API 配置
YAHOO_API_URL = "https://query1.finance.yahoo.com/v8/finance/chart/"
# 指数配置
INDEXES = {
"^GSPC": "标普500",
"^IXIC": "纳斯达克",
"^DJI": "道琼斯"
}
# 股票配置从Notion数据库读取
STOCKS = [
{"symbol": "MSFT", "name": "Microsoft Corporation", "quantity": 1, "cost_basis": 439.00}
]
def get_stock_price(symbol):
"""获取股票实时价格"""
try:
url = f"{YAHOO_API_URL}{symbol}"
params = {
"interval": "1d",
"range": "1d"
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(url, params=params, headers=headers, timeout=10)
if response.status_code == 200:
data = response.json()
# 检查响应结构
if "chart" in data and "result" in data["chart"]:
result = data["chart"]["result"]
if result and len(result) > 0:
meta = result[0].get("meta", {})
current_price = meta.get("regularMarketPrice")
previous_close = meta.get("previousClose")
if current_price and previous_close:
change = current_price - previous_close
change_percent = (change / previous_close) * 100
return {
"symbol": symbol,
"price": current_price,
"previous_close": previous_close,
"change": change,
"change_percent": change_percent,
"currency": meta.get("currency", "USD")
}
return None
except Exception as e:
print(f"获取 {symbol} 价格失败: {e}")
return None
def get_index_prices():
"""获取指数价格"""
print("=" * 60)
print("获取指数价格")
print("=" * 60)
indexes = {}
for symbol, name in INDEXES.items():
price_data = get_stock_price(symbol)
if price_data:
indexes[symbol] = {
"name": name,
"price": price_data["price"],
"change": price_data["change"],
"change_percent": price_data["change_percent"]
}
print(f"{name}: {price_data['price']:.2f} ({price_data['change_percent']:+.2f}%)")
else:
print(f"{name}: 获取失败")
print("=" * 60)
return indexes
def get_stock_prices():
"""获取持仓股票价格"""
print("=" * 60)
print("获取持仓股票价格")
print("=" * 60)
stock_prices = {}
for stock in STOCKS:
symbol = stock["symbol"]
price_data = get_stock_price(symbol)
if price_data:
stock_prices[symbol] = {
"name": stock["name"],
"quantity": stock["quantity"],
"cost_basis": stock["cost_basis"],
"current_price": price_data["price"],
"change": price_data["change"],
"change_percent": price_data["change_percent"]
}
print(f"{symbol}: ${price_data['price']:.2f} ({price_data['change_percent']:+.2f}%)")
else:
print(f"{symbol}: 获取失败")
print("=" * 60)
return stock_prices
def main():
"""主函数"""
print("开始获取股票价格和指数...")
print()
# 获取指数价格
indexes = get_index_prices()
# 获取持仓股票价格
stock_prices = get_stock_prices()
# 打印汇总
print("\n📊 数据汇总:")
print("=" * 60)
if indexes:
print(f"\n指数数据: {len(indexes)}")
for symbol, data in indexes.items():
print(f" {data['name']}: {data['price']:.2f} ({data['change_percent']:+.2f}%)")
if stock_prices:
print(f"\n持仓股票: {len(stock_prices)}")
for symbol, data in stock_prices.items():
print(f" {data['name']}: ${data['current_price']:.2f} ({data['change_percent']:+.2f}%)")
print("=" * 60)
if __name__ == "__main__":
main()