105 lines
2.8 KiB
Python
105 lines
2.8 KiB
Python
#!/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": "道琼斯"
|
|
}
|
|
|
|
def get_stock_price(symbol):
|
|
"""获取股票实时价格"""
|
|
|
|
try:
|
|
url = f"{YAHOO_API_URL}{symbol}"
|
|
params = {
|
|
"interval": "1d",
|
|
"range": "1d"
|
|
}
|
|
|
|
response = requests.get(url, params=params, timeout=10)
|
|
|
|
if response.status_code == 200:
|
|
data = response.json()
|
|
|
|
# 解析价格数据
|
|
chart = data.get("chart", {})
|
|
result = chart.get("result", [])
|
|
|
|
if result:
|
|
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} ({symbol}): {price_data['price']:.2f} ({price_data['change_percent']:+.2f}%)")
|
|
else:
|
|
print(f"{name} ({symbol}): 获取失败")
|
|
|
|
print("=" * 60)
|
|
return indexes
|
|
|
|
def main():
|
|
"""主函数"""
|
|
print("开始获取股票价格和指数...")
|
|
print()
|
|
|
|
# 获取指数价格
|
|
indexes = get_index_prices()
|
|
|
|
if indexes:
|
|
print("\n✅ 指数数据获取成功")
|
|
print(f"获取了 {len(indexes)} 个指数数据")
|
|
else:
|
|
print("\n❌ 指数数据获取失败")
|
|
|
|
if __name__ == "__main__":
|
|
main()
|