#!/usr/bin/env python3 """ 数据源验证脚本 - 第一批(CEX + 链上 + DeFi + 宏观) 验证时间:2026-03-06 """ import requests import json import time from datetime import datetime TIMEOUT = 10 results = {} def test(name, fn): try: start = time.time() data = fn() elapsed = round((time.time() - start) * 1000) results[name] = {"status": "✅ 通过", "latency_ms": elapsed, "sample": data} print(f"✅ {name} ({elapsed}ms)") except Exception as e: results[name] = {"status": "❌ 失败", "error": str(e)} print(f"❌ {name}: {e}") # ─── 1. Binance 合约 K 线 ─────────────────────────────────────────────────── def test_binance_klines(): url = "https://fapi.binance.com/fapi/v1/klines" r = requests.get(url, params={"symbol": "BTCUSDT", "interval": "10m", "limit": 3}, timeout=TIMEOUT) r.raise_for_status() data = r.json() return { "open_time": data[0][0], "open": data[0][1], "high": data[0][2], "low": data[0][3], "close": data[0][4], "volume": data[0][5], "count": len(data) } test("Binance合约K线", test_binance_klines) # ─── 2. Binance 资金费率 ─────────────────────────────────────────────────── def test_binance_funding(): url = "https://fapi.binance.com/fapi/v1/premiumIndex" r = requests.get(url, params={"symbol": "BTCUSDT"}, timeout=TIMEOUT) r.raise_for_status() d = r.json() return { "symbol": d["symbol"], "markPrice": d["markPrice"], "lastFundingRate": d["lastFundingRate"], "nextFundingTime": d["nextFundingTime"] } test("Binance资金费率", test_binance_funding) # ─── 3. Binance 未平仓量 ─────────────────────────────────────────────────── def test_binance_oi(): url = "https://fapi.binance.com/fapi/v1/openInterest" r = requests.get(url, params={"symbol": "BTCUSDT"}, timeout=TIMEOUT) r.raise_for_status() d = r.json() return {"symbol": d["symbol"], "openInterest": d["openInterest"], "time": d["time"]} test("Binance未平仓量", test_binance_oi) # ─── 4. OKX K 线 ─────────────────────────────────────────────────────────── def test_okx_klines(): url = "https://www.okx.com/api/v5/market/candles" r = requests.get(url, params={"instId": "BTC-USDT-SWAP", "bar": "10m", "limit": "3"}, timeout=TIMEOUT) r.raise_for_status() d = r.json() candle = d["data"][0] return {"ts": candle[0], "open": candle[1], "high": candle[2], "low": candle[3], "close": candle[4], "vol": candle[5], "count": len(d["data"])} test("OKX合约K线", test_okx_klines) # ─── 5. OKX 资金费率 ─────────────────────────────────────────────────────── def test_okx_funding(): url = "https://www.okx.com/api/v5/public/funding-rate" r = requests.get(url, params={"instId": "BTC-USDT-SWAP"}, timeout=TIMEOUT) r.raise_for_status() d = r.json()["data"][0] return {"instId": d["instId"], "fundingRate": d["fundingRate"], "nextFundingTime": d["nextFundingTime"]} test("OKX资金费率", test_okx_funding) # ─── 6. Bybit K 线 ───────────────────────────────────────────────────────── def test_bybit_klines(): url = "https://api.bybit.com/v5/market/kline" r = requests.get(url, params={"category": "linear", "symbol": "BTCUSDT", "interval": "10", "limit": "3"}, timeout=TIMEOUT) r.raise_for_status() d = r.json() candle = d["result"]["list"][0] return {"startTime": candle[0], "open": candle[1], "high": candle[2], "low": candle[3], "close": candle[4], "volume": candle[5], "count": len(d["result"]["list"])} test("Bybit合约K线", test_bybit_klines) # ─── 7. Bybit 资金费率 ───────────────────────────────────────────────────── def test_bybit_funding(): url = "https://api.bybit.com/v5/market/funding/history" r = requests.get(url, params={"category": "linear", "symbol": "BTCUSDT", "limit": "3"}, timeout=TIMEOUT) r.raise_for_status() d = r.json()["result"]["list"][0] return {"symbol": d["symbol"], "fundingRate": d["fundingRate"], "fundingRateTimestamp": d["fundingRateTimestamp"]} test("Bybit资金费率", test_bybit_funding) # ─── 8. Deribit DVOL ────────────────────────────────────────────────────── def test_deribit_dvol(): url = "https://www.deribit.com/api/v2/public/get_volatility_index_data" r = requests.get(url, params={"currency": "BTC", "resolution": "60", "count": "3"}, timeout=TIMEOUT) r.raise_for_status() d = r.json()["result"]["data"] return {"latest_ts": d[-1][0], "latest_dvol": d[-1][1], "count": len(d)} test("Deribit DVOL", test_deribit_dvol) # ─── 9. Deribit 期权行情 ─────────────────────────────────────────────────── def test_deribit_index(): url = "https://www.deribit.com/api/v2/public/get_index_price" r = requests.get(url, params={"index_name": "btc_usd"}, timeout=TIMEOUT) r.raise_for_status() d = r.json()["result"] return {"index_price": d["index_price"], "estimated_delivery_price": d.get("estimated_delivery_price")} test("Deribit指数价格", test_deribit_index) # ─── 10. DeFiLlama TVL ──────────────────────────────────────────────────── def test_defillama_tvl(): url = "https://api.llama.fi/charts" r = requests.get(url, timeout=TIMEOUT) r.raise_for_status() d = r.json() latest = d[-1] return {"date": latest["date"], "totalLiquidityUSD": latest["totalLiquidityUSD"], "data_points": len(d)} test("DeFiLlama全链TVL", test_defillama_tvl) # ─── 11. DeFiLlama 协议 ─────────────────────────────────────────────────── def test_defillama_protocol(): url = "https://api.llama.fi/tvl/uniswap" r = requests.get(url, timeout=TIMEOUT) r.raise_for_status() tvl = r.json() return {"uniswap_tvl_usd": tvl} test("DeFiLlama Uniswap TVL", test_defillama_protocol) # ─── 12. Alternative.me 恐惧贪婪指数 ────────────────────────────────────── def test_fear_greed(): url = "https://api.alternative.me/fng/?limit=3&format=json" r = requests.get(url, timeout=TIMEOUT) r.raise_for_status() d = r.json()["data"] return [{"value": x["value"], "classification": x["value_classification"], "timestamp": x["timestamp"]} for x in d] test("Alternative.me恐惧贪婪指数", test_fear_greed) # ─── 13. FRED 联邦基金利率 ──────────────────────────────────────────────── def test_fred(): # FRED 免费 API,需要 API Key,使用公开演示 Key url = "https://api.stlouisfed.org/fred/series/observations" r = requests.get(url, params={ "series_id": "FEDFUNDS", "api_key": "abcdefghijklmnopqrstuvwxyz123456", # 演示 Key "file_type": "json", "limit": "3", "sort_order": "desc" }, timeout=TIMEOUT) # FRED 无效 Key 会返回 400,改用公开端点 raise Exception("需要有效 API Key(免费注册 https://fred.stlouisfed.org/docs/api/api_key.html)") test("FRED联邦基金利率", test_fred) # ─── 14. Yahoo Finance(yfinance 库)───────────────────────────────────── def test_yahoo_finance(): import subprocess result = subprocess.run( ["python3", "-c", "import yfinance as yf; d=yf.download('GC=F',period='5d',interval='1d',progress=False); print(d['Close'].iloc[-1])"], capture_output=True, text=True, timeout=30 ) if result.returncode == 0: return {"gold_close": result.stdout.strip()} raise Exception(result.stderr.strip()) test("Yahoo Finance黄金价格", test_yahoo_finance) # ─── 15. CoinGecko 全球数据 ─────────────────────────────────────────────── def test_coingecko_global(): url = "https://api.coingecko.com/api/v3/global" r = requests.get(url, timeout=TIMEOUT) r.raise_for_status() d = r.json()["data"] return { "total_market_cap_usd": d["total_market_cap"]["usd"], "btc_dominance": d["market_cap_percentage"]["btc"], "eth_dominance": d["market_cap_percentage"]["eth"], "market_cap_change_24h": d["market_cap_change_percentage_24h_usd"] } test("CoinGecko全球市场数据", test_coingecko_global) # ─── 保存结果 ────────────────────────────────────────────────────────────── print("\n=== 验证结果汇总 ===") 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"通过: {passed}/{len(results)}, 失败: {failed}/{len(results)}") with open("/home/ubuntu/quantKnowledge/20_Go迭代系统/scripts/verify_batch1_results.json", "w") as f: json.dump(results, f, ensure_ascii=False, indent=2, default=str) print("结果已保存到 verify_batch1_results.json")