feat: 大幅扩展数据源至325个验证通过端点 + Go集成方案 + 社交媒体情绪分析实现
新增文件: - 数据源与交易品种完整手册_325个.md (100+加密品种 + 50+传统金融品种) - Go数据源集成方案.md (三级速率限制器 + 指数退避 + 自动降级) - 社交媒体实时情绪分析Go实现.md (VADER词典 + LLM增强) - scripts/verify_batch6_crypto_varieties.py (加密品种验证) - scripts/verify_batch7_fix.py (修复+新增验证) 验证统计: 325个端点通过, 19个平台, 100%免费
这个提交包含在:
@@ -0,0 +1,335 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
批次6:验证加密货币全品种 + 传统金融代币化品种
|
||||
目标:新增 60+ 个不重复数据源端点
|
||||
"""
|
||||
import requests
|
||||
import json
|
||||
import time
|
||||
|
||||
results = {}
|
||||
|
||||
def test(name, url, params=None, headers=None, method="GET", body=None, timeout=15):
|
||||
"""通用测试函数"""
|
||||
try:
|
||||
h = {"User-Agent": "QuantKnowledge/2.0"}
|
||||
if headers:
|
||||
h.update(headers)
|
||||
start = time.time()
|
||||
if method == "POST":
|
||||
r = requests.post(url, json=body, headers=h, timeout=timeout)
|
||||
else:
|
||||
r = requests.get(url, params=params, headers=h, timeout=timeout)
|
||||
elapsed = round((time.time() - start) * 1000)
|
||||
if r.status_code == 200:
|
||||
data = r.json() if 'json' in r.headers.get('content-type','') else r.text[:200]
|
||||
sample = str(data)[:300]
|
||||
results[name] = {"status": "✅ PASS", "latency": f"{elapsed}ms", "sample": data if isinstance(data, dict) else sample}
|
||||
print(f"✅ {name} ({elapsed}ms)")
|
||||
return data
|
||||
else:
|
||||
results[name] = {"status": f"❌ HTTP {r.status_code}", "latency": f"{elapsed}ms"}
|
||||
print(f"❌ {name} HTTP {r.status_code}")
|
||||
return None
|
||||
except Exception as e:
|
||||
results[name] = {"status": f"❌ {str(e)[:80]}", "latency": "timeout"}
|
||||
print(f"❌ {name}: {str(e)[:60]}")
|
||||
return None
|
||||
|
||||
print("=" * 60)
|
||||
print("第6批:加密货币全品种数据源验证")
|
||||
print("=" * 60)
|
||||
|
||||
# ─── 一、Binance 多品种资金费率 + K线 ─────────────────────────────────
|
||||
print("\n--- Binance 多品种 ---")
|
||||
binance_symbols = [
|
||||
("ADA", "ADAUSDT"), ("AVAX", "AVAXUSDT"), ("DOT", "DOTUSDT"),
|
||||
("MATIC", "MATICUSDT"), ("LINK", "LINKUSDT"), ("UNI", "UNIUSDT"),
|
||||
("AAVE", "AAVEUSDT"), ("OP", "OPUSDT"), ("ARB", "ARBUSDT"),
|
||||
("APT", "APTUSDT"), ("SUI", "SUIUSDT"), ("SEI", "SEIUSDT"),
|
||||
("TIA", "TIAUSDT"), ("INJ", "INJUSDT"), ("FET", "FETUSDT"),
|
||||
("RNDR", "RNDRUSDT"), ("WLD", "WLDUSDT"), ("PEPE", "PEPEUSDT"),
|
||||
("SHIB", "SHIBUSDT"), ("FLOKI", "FLOKIUSDT"), ("WIF", "WIFUSDT"),
|
||||
("BONK", "BONKUSDT"), ("NEAR", "NEARUSDT"), ("FIL", "FILUSDT"),
|
||||
("ATOM", "ATOMUSDT"), ("LTC", "LTCUSDT"), ("BCH", "BCHUSDT"),
|
||||
("ETC", "ETCUSDT"), ("MKR", "MKRUSDT"), ("SNX", "SNXUSDT"),
|
||||
("CRV", "CRVUSDT"), ("LDO", "LDOUSDT"), ("PENDLE", "PENDLEUSDT"),
|
||||
("STX", "STXUSDT"), ("ORDI", "ORDIUSDT"), ("1000SATS", "1000SATSUSDT"),
|
||||
("JUP", "JUPUSDT"), ("ONDO", "ONDOUSDT"), ("TAO", "TAOUSDT"),
|
||||
("RENDER", "RENDERUSDT"),
|
||||
]
|
||||
|
||||
for coin_name, symbol in binance_symbols:
|
||||
test(
|
||||
f"Binance {coin_name} 资金费率",
|
||||
f"https://fapi.binance.com/fapi/v1/premiumIndex",
|
||||
params={"symbol": symbol}
|
||||
)
|
||||
time.sleep(0.05) # 避免限流
|
||||
|
||||
# ─── 二、Binance 多品种 K 线 (选取代表性品种) ─────────────────────────
|
||||
print("\n--- Binance 多品种 K 线 ---")
|
||||
kline_symbols = [
|
||||
("ADA", "ADAUSDT"), ("AVAX", "AVAXUSDT"), ("DOT", "DOTUSDT"),
|
||||
("LINK", "LINKUSDT"), ("UNI", "UNIUSDT"), ("OP", "OPUSDT"),
|
||||
("ARB", "ARBUSDT"), ("PEPE", "PEPEUSDT"), ("SHIB", "SHIBUSDT"),
|
||||
("NEAR", "NEARUSDT"), ("ATOM", "ATOMUSDT"), ("LTC", "LTCUSDT"),
|
||||
]
|
||||
|
||||
for coin_name, symbol in kline_symbols:
|
||||
test(
|
||||
f"Binance {coin_name} 合约K线",
|
||||
f"https://fapi.binance.com/fapi/v1/klines",
|
||||
params={"symbol": symbol, "interval": "1h", "limit": 2}
|
||||
)
|
||||
time.sleep(0.05)
|
||||
|
||||
# ─── 三、CoinGecko 多品种详细数据 ─────────────────────────────────────
|
||||
print("\n--- CoinGecko 多品种 ---")
|
||||
cg_coins = [
|
||||
("avalanche-2", "AVAX"), ("polkadot", "DOT"), ("cardano", "ADA"),
|
||||
("uniswap", "UNI"), ("aave", "AAVE"), ("optimism", "OP"),
|
||||
("arbitrum", "ARB"), ("aptos", "APT"), ("sui", "SUI"),
|
||||
("celestia", "TIA"), ("injective-protocol", "INJ"),
|
||||
("fetch-ai", "FET"), ("render-token", "RNDR"), ("worldcoin-wld", "WLD"),
|
||||
("pepe", "PEPE"), ("shiba-inu", "SHIB"), ("dogwifcoin", "WIF"),
|
||||
("bonk", "BONK"), ("near", "NEAR"), ("filecoin", "FIL"),
|
||||
("cosmos", "ATOM"), ("litecoin", "LTC"), ("bitcoin-cash", "BCH"),
|
||||
("maker", "MKR"), ("lido-dao", "LDO"), ("pendle", "PENDLE"),
|
||||
("stacks", "STX"), ("ondo-finance", "ONDO"),
|
||||
]
|
||||
|
||||
for cg_id, symbol in cg_coins:
|
||||
test(
|
||||
f"CoinGecko {symbol} 详细数据",
|
||||
f"https://api.coingecko.com/api/v3/simple/price",
|
||||
params={"ids": cg_id, "vs_currencies": "usd", "include_market_cap": "true",
|
||||
"include_24hr_vol": "true", "include_24hr_change": "true"}
|
||||
)
|
||||
time.sleep(2.5) # CoinGecko 30/min 限制
|
||||
|
||||
# ─── 四、CoinPaprika 多品种 ─────────────────────────────────────────
|
||||
print("\n--- CoinPaprika 多品种 ---")
|
||||
cp_coins = [
|
||||
("ada-cardano", "ADA"), ("avax-avalanche", "AVAX"), ("dot-polkadot", "DOT"),
|
||||
("link-chainlink", "LINK"), ("uni-uniswap", "UNI"), ("ltc-litecoin", "LTC"),
|
||||
("atom-cosmos", "ATOM"), ("near-near-protocol", "NEAR"),
|
||||
("op-optimism", "OP"), ("arb-arbitrum", "ARB"),
|
||||
("pepe-pepe", "PEPE"), ("shib-shiba-inu", "SHIB"),
|
||||
]
|
||||
|
||||
for cp_id, symbol in cp_coins:
|
||||
test(
|
||||
f"CoinPaprika {symbol} 行情",
|
||||
f"https://api.coinpaprika.com/v1/tickers/{cp_id}"
|
||||
)
|
||||
time.sleep(0.15)
|
||||
|
||||
# ─── 五、Hyperliquid 多品种 ─────────────────────────────────────────
|
||||
print("\n--- Hyperliquid 多品种 ---")
|
||||
data = test(
|
||||
"Hyperliquid 全品种永续合约",
|
||||
"https://api.hyperliquid.xyz/info",
|
||||
method="POST",
|
||||
body={"type": "metaAndAssetCtxs"}
|
||||
)
|
||||
if data:
|
||||
# 提取所有品种
|
||||
try:
|
||||
universe = data[0]["universe"] if isinstance(data, list) else data.get("universe", [])
|
||||
coins = [u["name"] for u in universe[:50]]
|
||||
results["Hyperliquid 全品种永续合约"]["sample"] = {
|
||||
"total_assets": len(universe),
|
||||
"top20": coins[:20]
|
||||
}
|
||||
print(f" Hyperliquid 品种数: {len(universe)}")
|
||||
except:
|
||||
pass
|
||||
|
||||
# ─── 六、DexScreener 热门代币 ─────────────────────────────────────
|
||||
print("\n--- DexScreener 热门代币 ---")
|
||||
dex_tokens = [
|
||||
("PEPE", "0x6982508145454Ce325dDbE47a25d4ec3d2311933"),
|
||||
("SHIB", "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE"),
|
||||
("FLOKI", "0xcf0C122c6b73ff809C693DB761e7BaeBe62b6a2E"),
|
||||
]
|
||||
for name, addr in dex_tokens:
|
||||
test(
|
||||
f"DexScreener {name} DEX交易对",
|
||||
f"https://api.dexscreener.com/latest/dex/tokens/{addr}"
|
||||
)
|
||||
time.sleep(0.3)
|
||||
|
||||
# ─── 七、Bybit 多品种 ─────────────────────────────────────────────
|
||||
print("\n--- Bybit 多品种 ---")
|
||||
bybit_symbols = [
|
||||
("ADA", "ADAUSDT"), ("AVAX", "AVAXUSDT"), ("DOT", "DOTUSDT"),
|
||||
("LINK", "LINKUSDT"), ("OP", "OPUSDT"), ("ARB", "ARBUSDT"),
|
||||
("PEPE", "PEPEUSDT"), ("NEAR", "NEARUSDT"), ("ATOM", "ATOMUSDT"),
|
||||
]
|
||||
for coin_name, symbol in bybit_symbols:
|
||||
test(
|
||||
f"Bybit {coin_name} 合约K线",
|
||||
f"https://api.bybit.com/v5/market/kline",
|
||||
params={"category": "linear", "symbol": symbol, "interval": "60", "limit": 2}
|
||||
)
|
||||
time.sleep(0.1)
|
||||
|
||||
# ─── 八、OKX 多品种 ─────────────────────────────────────────────
|
||||
print("\n--- OKX 多品种 ---")
|
||||
okx_symbols = [
|
||||
("ADA", "ADA-USDT-SWAP"), ("AVAX", "AVAX-USDT-SWAP"), ("DOT", "DOT-USDT-SWAP"),
|
||||
("LINK", "LINK-USDT-SWAP"), ("OP", "OP-USDT-SWAP"), ("ARB", "ARB-USDT-SWAP"),
|
||||
("PEPE", "PEPE-USDT-SWAP"), ("NEAR", "NEAR-USDT-SWAP"),
|
||||
]
|
||||
for coin_name, inst_id in okx_symbols:
|
||||
test(
|
||||
f"OKX {coin_name} 资金费率",
|
||||
f"https://www.okx.com/api/v5/public/funding-rate",
|
||||
params={"instId": inst_id}
|
||||
)
|
||||
time.sleep(0.15)
|
||||
|
||||
# ─── 九、Deribit 多品种期权 ─────────────────────────────────────────
|
||||
print("\n--- Deribit 多品种 ---")
|
||||
test(
|
||||
"Deribit ETH 期权合约列表",
|
||||
"https://www.deribit.com/api/v2/public/get_instruments",
|
||||
params={"currency": "ETH", "kind": "option", "expired": "false"}
|
||||
)
|
||||
time.sleep(0.1)
|
||||
test(
|
||||
"Deribit SOL 期权合约列表",
|
||||
"https://www.deribit.com/api/v2/public/get_instruments",
|
||||
params={"currency": "SOL", "kind": "option", "expired": "false"}
|
||||
)
|
||||
time.sleep(0.1)
|
||||
test(
|
||||
"Deribit SOL 指数价格",
|
||||
"https://www.deribit.com/api/v2/public/get_index_price",
|
||||
params={"currency": "SOL"}
|
||||
)
|
||||
|
||||
# ─── 十、传统金融代币化品种 (Binance 股票代币已下线,用其他方式) ──────
|
||||
print("\n--- 传统金融代币化品种 ---")
|
||||
|
||||
# PAXG (黄金代币) - Binance
|
||||
test(
|
||||
"Binance PAXG/USDT 黄金代币",
|
||||
"https://api.binance.com/api/v3/ticker/24hr",
|
||||
params={"symbol": "PAXGUSDT"}
|
||||
)
|
||||
time.sleep(0.05)
|
||||
|
||||
# PAXG K线
|
||||
test(
|
||||
"Binance PAXG K线 (黄金代币)",
|
||||
"https://api.binance.com/api/v3/klines",
|
||||
params={"symbol": "PAXGUSDT", "interval": "1h", "limit": 3}
|
||||
)
|
||||
time.sleep(0.05)
|
||||
|
||||
# tBTC (Wrapped BTC)
|
||||
test(
|
||||
"CoinGecko tBTC 数据",
|
||||
"https://api.coingecko.com/api/v3/simple/price",
|
||||
params={"ids": "tbtc", "vs_currencies": "usd", "include_market_cap": "true"}
|
||||
)
|
||||
time.sleep(2.5)
|
||||
|
||||
# WBTC
|
||||
test(
|
||||
"CoinGecko WBTC 数据",
|
||||
"https://api.coingecko.com/api/v3/simple/price",
|
||||
params={"ids": "wrapped-bitcoin", "vs_currencies": "usd", "include_market_cap": "true"}
|
||||
)
|
||||
time.sleep(2.5)
|
||||
|
||||
# stETH
|
||||
test(
|
||||
"CoinGecko stETH 数据",
|
||||
"https://api.coingecko.com/api/v3/simple/price",
|
||||
params={"ids": "staked-ether", "vs_currencies": "usd", "include_market_cap": "true"}
|
||||
)
|
||||
time.sleep(2.5)
|
||||
|
||||
# rETH
|
||||
test(
|
||||
"CoinGecko rETH 数据",
|
||||
"https://api.coingecko.com/api/v3/simple/price",
|
||||
params={"ids": "rocket-pool-eth", "vs_currencies": "usd", "include_market_cap": "true"}
|
||||
)
|
||||
time.sleep(2.5)
|
||||
|
||||
# RWA 代币
|
||||
rwa_coins = [
|
||||
("ondo-finance", "ONDO"), ("maker", "MKR"), ("centrifuge", "CFG"),
|
||||
("maple-finance", "MPL"), ("goldfinch", "GFI"),
|
||||
]
|
||||
for cg_id, symbol in rwa_coins:
|
||||
test(
|
||||
f"CoinGecko {symbol} RWA代币",
|
||||
f"https://api.coingecko.com/api/v3/simple/price",
|
||||
params={"ids": cg_id, "vs_currencies": "usd", "include_market_cap": "true",
|
||||
"include_24hr_vol": "true"}
|
||||
)
|
||||
time.sleep(2.5)
|
||||
|
||||
# AI 代币
|
||||
ai_coins = [
|
||||
("fetch-ai", "FET"), ("singularitynet", "AGIX"), ("ocean-protocol", "OCEAN"),
|
||||
("render-token", "RNDR"), ("bittensor", "TAO"), ("akash-network", "AKT"),
|
||||
]
|
||||
for cg_id, symbol in ai_coins:
|
||||
test(
|
||||
f"CoinGecko {symbol} AI代币",
|
||||
f"https://api.coingecko.com/api/v3/simple/price",
|
||||
params={"ids": cg_id, "vs_currencies": "usd", "include_market_cap": "true",
|
||||
"include_24hr_vol": "true"}
|
||||
)
|
||||
time.sleep(2.5)
|
||||
|
||||
# ─── 十一、DeFiLlama 更多协议 ─────────────────────────────────────
|
||||
print("\n--- DeFiLlama 更多协议 ---")
|
||||
llama_protocols = [
|
||||
"uniswap", "curve-dex", "pancakeswap", "gmx", "dydx",
|
||||
"compound-v3", "morpho", "eigenlayer", "jito", "marinade-finance",
|
||||
"raydium", "orca", "jupiter-aggregator",
|
||||
]
|
||||
for proto in llama_protocols:
|
||||
test(
|
||||
f"DeFiLlama {proto} 协议数据",
|
||||
f"https://api.llama.fi/protocol/{proto}"
|
||||
)
|
||||
time.sleep(0.3)
|
||||
|
||||
# ─── 十二、Yahoo Finance 更多品种 ─────────────────────────────────
|
||||
print("\n--- Yahoo Finance 更多品种 ---")
|
||||
yahoo_extra = [
|
||||
("NG=F", "天然气"), ("ZC=F", "玉米期货"), ("ZW=F", "小麦期货"),
|
||||
("ZS=F", "大豆期货"), ("PL=F", "铂金"), ("PA=F", "钯金"),
|
||||
("^FTSE", "富时100"), ("^GDAXI", "德国DAX"), ("^FCHI", "法国CAC40"),
|
||||
("^KS11", "韩国KOSPI"), ("^TWII", "台湾加权"), ("^BVSP", "巴西BOVESPA"),
|
||||
("000001.SS", "上证指数"), ("BTC-USD", "BTC/USD"),
|
||||
("ETH-USD", "ETH/USD"), ("SOL-USD", "SOL/USD"),
|
||||
("GBTC", "Grayscale BTC"), ("ARKB", "ARK BTC ETF"),
|
||||
("BITB", "Bitwise BTC ETF"), ("BITO", "ProShares BTC期货ETF"),
|
||||
]
|
||||
for symbol, name in yahoo_extra:
|
||||
test(
|
||||
f"Yahoo {name} ({symbol})",
|
||||
f"https://query1.finance.yahoo.com/v8/finance/chart/{symbol}",
|
||||
params={"interval": "1d", "range": "5d"},
|
||||
headers={"User-Agent": "Mozilla/5.0"}
|
||||
)
|
||||
time.sleep(0.2)
|
||||
|
||||
# ─── 保存结果 ─────────────────────────────────────────────────────
|
||||
with open("verify_batch6_results.json", "w") as f:
|
||||
json.dump(results, f, ensure_ascii=False, indent=2, default=str)
|
||||
|
||||
passed = sum(1 for v in results.values() if "✅" in v["status"])
|
||||
failed = sum(1 for v in results.values() if "❌" in v["status"])
|
||||
print(f"\n{'='*60}")
|
||||
print(f"第6批验证完成: {passed} 通过 / {failed} 失败 / 总计 {len(results)}")
|
||||
print(f"{'='*60}")
|
||||
在新工单中引用
屏蔽一个用户