- 新增 Go与Python量化知识迭代对比分析.md * 7大维度全面对比(性能/并发/生态/开发效率/部署/稳定性/社区) * 实测数据:Go比Python快10-200倍,Web服务吞吐量12倍 * 推荐混合架构:Go负责基础设施,Python负责ML分析 * 各场景最优选择速查表 + 综合评分(Go 7.65 vs Python 7.35) - 新增 数据源接入完整指南_扩展版.md(12→28个数据源) * 社交媒体:X/Twitter(Nitter免费方案+twitterapi.io)、Reddit(PRAW)、Telegram(Telethon)、LunarCrush、Alternative.me恐惧贪婪指数 * 新闻情绪:CryptoPanic、Finnhub、Santiment * 链上扩展:Dune Analytics(免费SQL)、Arkham Intelligence(免费巨鲸追踪) * 综合市场:CoinGecko(完全免费)、Token Terminal * 衍生品:Laevitas(GEX/期权流)、Coinalyze * 宏观扩展:Yahoo Finance、世界银行 * 完整Go/Python代码示例 + 数据源优先级策略
1028 行
32 KiB
Markdown
1028 行
32 KiB
Markdown
# 数据源接入完整指南(扩展版)
|
||
|
||
> 本文档在原版(12 个数据源)基础上大幅扩展,覆盖 **28 个数据源**,重点补充**社交媒体情绪数据**(X/Twitter、Reddit、Telegram)的**免费方案**,以及衍生品、链上替代方案、新闻情绪、宏观经济等新类别。
|
||
>
|
||
> 返回:[Go 迭代系统主文档](./Go量化知识迭代系统完整架构.md) | [原版数据源指南](./数据源接入完整指南.md)
|
||
|
||
---
|
||
|
||
## 一、数据源全景总览(28 个)
|
||
|
||
| 类别 | 数据源 | 免费层 | 核心数据 |
|
||
|------|--------|--------|---------|
|
||
| **CEX(3)** | Binance | ✅ 完全免费 | K 线、资金费率、未平仓量 |
|
||
| | OKX | ✅ 完全免费 | K 线、期权、资金费率 |
|
||
| | Bybit | ✅ 完全免费 | K 线、资金费率、持仓量 |
|
||
| **期权衍生品(3)** | Deribit | ✅ 完全免费 | 期权链、IV、DVOL |
|
||
| | Laevitas | ✅ 有限免费 | GEX、期权流、资金费率聚合 |
|
||
| | Coinalyze | ✅ 有限免费 | 未平仓量、清算、资金费率 |
|
||
| **链上数据(4)** | Glassnode | ⚠️ 付费 | MVRV、SOPR、NVT |
|
||
| | CoinGlass | ⚠️ 付费 | 清算、多空比、资金费率 |
|
||
| | Dune Analytics | ✅ 免费 SQL | 链上自定义查询 |
|
||
| | Arkham Intelligence | ✅ 免费 | 巨鲸追踪、地址标签 |
|
||
| **DeFi 数据(3)** | DeFiLlama | ✅ 完全免费 | TVL、协议数据 |
|
||
| | The Graph | ✅ 有限免费 | DEX 链上数据 |
|
||
| | Token Terminal | ✅ 有限免费 | 协议收入、P/E 比率 |
|
||
| **综合市场(3)** | CoinMarketCap | ✅ 免费层 | 市值、排名 |
|
||
| | CoinGecko | ✅ 完全免费 | 市值、价格、社交数据 |
|
||
| | Messari | ⚠️ 付费 | 研究报告、链上指标 |
|
||
| **社交媒体(5)** | X/Twitter | ⚠️ 见方案 | KOL 情绪、热词 |
|
||
| | Reddit | ✅ 免费 API | r/Bitcoin 社区情绪 |
|
||
| | Telegram | ✅ 免费 | 公开频道消息 |
|
||
| | LunarCrush | ✅ 有限免费 | 综合社交情绪指数 |
|
||
| | Alternative.me | ✅ 完全免费 | 恐惧贪婪指数 |
|
||
| **新闻情绪(3)** | CryptoPanic | ✅ 免费层 | 加密新闻聚合 |
|
||
| | Santiment | ⚠️ 付费 | 社交趋势、开发活跃度 |
|
||
| | Finnhub | ✅ 免费层 | 新闻情绪、基本面 |
|
||
| **宏观经济(4)** | FRED | ✅ 完全免费 | 利率、CPI、M2 |
|
||
| | 美联储官网 | ✅ 完全免费 | FOMC 会议纪要 |
|
||
| | 世界银行 | ✅ 完全免费 | 全球宏观数据 |
|
||
| | Yahoo Finance | ✅ 完全免费 | 股指、外汇、大宗商品 |
|
||
|
||
---
|
||
|
||
## 二、社交媒体数据源(重点补充)
|
||
|
||
### 2.1 X/Twitter:免费方案全解析
|
||
|
||
X(原 Twitter)是加密货币 KOL 最集中的平台,但 2023 年后官方 API 已全面付费,最低档 **$42,000/年**,对个人量化研究者完全不可行。以下是经过验证的**免费替代方案**:
|
||
|
||
**方案一:Nitter 镜像站抓取(推荐,完全免费)**
|
||
|
||
Nitter 是 X 的开源前端镜像,通过 RSS/HTML 方式提供推文数据,无需 API Key。
|
||
|
||
```python
|
||
# Python 实现(ntscraper 库)
|
||
# pip install ntscraper
|
||
|
||
from ntscraper import Nitter
|
||
|
||
scraper = Nitter()
|
||
|
||
# 抓取特定 KOL 的最新推文
|
||
tweets = scraper.get_tweets("CryptoKaleo", mode="user", number=20)
|
||
|
||
# 抓取关键词搜索结果
|
||
btc_tweets = scraper.get_tweets("BTC bullish", mode="search", number=50)
|
||
|
||
for tweet in tweets["tweets"]:
|
||
print(tweet["date"], tweet["text"], tweet["stats"]["likes"])
|
||
```
|
||
|
||
```go
|
||
// Go 实现(HTTP 抓取 Nitter RSS)
|
||
package twitter
|
||
|
||
import (
|
||
"encoding/xml"
|
||
"fmt"
|
||
"net/http"
|
||
"time"
|
||
)
|
||
|
||
// Nitter 公开实例列表(任选其一)
|
||
var NitterInstances = []string{
|
||
"https://nitter.net",
|
||
"https://nitter.privacydev.net",
|
||
"https://nitter.poast.org",
|
||
}
|
||
|
||
type NitterRSS struct {
|
||
Channel struct {
|
||
Items []struct {
|
||
Title string `xml:"title"`
|
||
PubDate string `xml:"pubDate"`
|
||
Link string `xml:"link"`
|
||
} `xml:"item"`
|
||
} `xml:"channel"`
|
||
}
|
||
|
||
// GetUserTweets 通过 Nitter RSS 获取用户推文
|
||
func GetUserTweets(username string) ([]Tweet, error) {
|
||
for _, instance := range NitterInstances {
|
||
url := fmt.Sprintf("%s/%s/rss", instance, username)
|
||
resp, err := http.Get(url)
|
||
if err != nil || resp.StatusCode != 200 {
|
||
continue // 尝试下一个实例
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
var rss NitterRSS
|
||
xml.NewDecoder(resp.Body).Decode(&rss)
|
||
|
||
tweets := make([]Tweet, len(rss.Channel.Items))
|
||
for i, item := range rss.Channel.Items {
|
||
tweets[i] = Tweet{
|
||
Text: item.Title,
|
||
CreatedAt: item.PubDate,
|
||
URL: item.Link,
|
||
}
|
||
}
|
||
return tweets, nil
|
||
}
|
||
return nil, fmt.Errorf("所有 Nitter 实例均不可用")
|
||
}
|
||
```
|
||
|
||
**Nitter 方案的局限性**:
|
||
- 实例可用性不稳定(X 会封锁 IP),需维护多个备用实例列表
|
||
- 无法获取推文的精确互动数据(点赞/转发数可能不准确)
|
||
- 搜索功能受限(无法按时间范围精确搜索)
|
||
- 不适合高频抓取(每分钟不超过 10 次请求)
|
||
|
||
**方案二:twitterapi.io(免费额度,推荐)**
|
||
|
||
twitterapi.io 提供 **100,000 免费积分**(约 1000 次 API 调用),适合低频量化研究:
|
||
|
||
```python
|
||
import requests
|
||
|
||
headers = {"X-API-Key": "YOUR_FREE_API_KEY"} # 注册免费获取
|
||
|
||
# 搜索加密货币相关推文
|
||
response = requests.get(
|
||
"https://api.twitterapi.io/twitter/tweet/advanced_search",
|
||
headers=headers,
|
||
params={
|
||
"query": "BTC bullish -is:retweet lang:en",
|
||
"queryType": "Latest",
|
||
"max_results": 20
|
||
}
|
||
)
|
||
tweets = response.json()["tweets"]
|
||
```
|
||
|
||
**方案三:X 官方免费层(Basic Plan)**
|
||
|
||
X 官方 Basic Plan 提供每月 **10,000 次读取请求**,适合极低频监控:
|
||
|
||
```
|
||
价格:$100/月(相对可接受)
|
||
限制:10,000 次读取/月,约 333 次/天
|
||
适用:监控 10-20 个核心 KOL 账号的日更新
|
||
```
|
||
|
||
**X/Twitter 数据接入策略总结**:
|
||
|
||
| 方案 | 费用 | 数据量 | 稳定性 | 推荐场景 |
|
||
|------|------|--------|--------|---------|
|
||
| Nitter RSS | 完全免费 | 低(每用户最新 20 条)| 中(实例不稳定)| 监控 5-10 个 KOL |
|
||
| twitterapi.io | 免费额度 | 中(1000 次/月)| 高 | 低频情绪监控 |
|
||
| X Basic Plan | $100/月 | 中(10000 次/月)| 高 | 专业量化研究 |
|
||
| X Pro Plan | $5000/月 | 高 | 高 | 机构级使用 |
|
||
|
||
**重点监控的加密 KOL 列表**:
|
||
|
||
| 账号 | 方向 | 特点 |
|
||
|------|------|------|
|
||
| @CryptoKaleo | BTC/ETH 技术分析 | 图表分析,准确率较高 |
|
||
| @PlanB | BTC S2F 模型 | 长期价值投资视角 |
|
||
| @Pentosh1 | 技术分析 | 短期交易信号 |
|
||
| @CryptoCred | 技术分析教育 | 系统性分析框架 |
|
||
| @WhalePanda | 市场情绪 | 反向指标参考 |
|
||
| @glassnode | 链上数据 | 官方链上分析 |
|
||
| @ki_young_ju | 链上数据 | CryptoQuant 创始人 |
|
||
|
||
---
|
||
|
||
### 2.2 Reddit:完全免费的社区情绪数据
|
||
|
||
Reddit 提供官方免费 API(PRAW),r/Bitcoin 和 r/CryptoCurrency 是最重要的散户情绪来源。
|
||
|
||
**Python 接入(PRAW 库)**:
|
||
|
||
```python
|
||
# pip install praw
|
||
import praw
|
||
|
||
reddit = praw.Reddit(
|
||
client_id="YOUR_CLIENT_ID", # Reddit App 免费注册
|
||
client_secret="YOUR_CLIENT_SECRET",
|
||
user_agent="QuantKnowledge/1.0"
|
||
)
|
||
|
||
# 获取 r/Bitcoin 热门帖子
|
||
subreddit = reddit.subreddit("Bitcoin")
|
||
hot_posts = list(subreddit.hot(limit=25))
|
||
|
||
for post in hot_posts:
|
||
print(f"标题: {post.title}")
|
||
print(f"评分: {post.score}")
|
||
print(f"评论数: {post.num_comments}")
|
||
print(f"情绪词: {'bullish' if 'bull' in post.title.lower() else 'bearish'}")
|
||
```
|
||
|
||
**Go 接入(REST API)**:
|
||
|
||
```go
|
||
package reddit
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"net/http"
|
||
)
|
||
|
||
const RedditBaseURL = "https://www.reddit.com"
|
||
|
||
type RedditPost struct {
|
||
Title string `json:"title"`
|
||
Score int `json:"score"`
|
||
NumComments int `json:"num_comments"`
|
||
Created float64 `json:"created_utc"`
|
||
URL string `json:"url"`
|
||
}
|
||
|
||
// GetHotPosts 获取指定 subreddit 的热门帖子
|
||
func GetHotPosts(subreddit string, limit int) ([]RedditPost, error) {
|
||
url := fmt.Sprintf("%s/r/%s/hot.json?limit=%d", RedditBaseURL, subreddit, limit)
|
||
|
||
req, _ := http.NewRequest("GET", url, nil)
|
||
req.Header.Set("User-Agent", "QuantKnowledge/1.0") // Reddit 要求 User-Agent
|
||
|
||
client := &http.Client{}
|
||
resp, err := client.Do(req)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
var result struct {
|
||
Data struct {
|
||
Children []struct {
|
||
Data RedditPost `json:"data"`
|
||
} `json:"children"`
|
||
} `json:"data"`
|
||
}
|
||
|
||
json.NewDecoder(resp.Body).Decode(&result)
|
||
|
||
posts := make([]RedditPost, len(result.Data.Children))
|
||
for i, child := range result.Data.Children {
|
||
posts[i] = child.Data
|
||
}
|
||
return posts, nil
|
||
}
|
||
```
|
||
|
||
**Reddit 情绪指标构建**:
|
||
|
||
```python
|
||
def calculate_reddit_sentiment(subreddit="Bitcoin", limit=100):
|
||
"""
|
||
基于 Reddit 帖子构建情绪指标
|
||
返回值:-1(极度悲观)到 +1(极度乐观)
|
||
"""
|
||
posts = get_hot_posts(subreddit, limit)
|
||
|
||
bullish_keywords = ["bull", "moon", "pump", "buy", "long", "ATH", "breakout"]
|
||
bearish_keywords = ["bear", "dump", "sell", "short", "crash", "rekt", "dead"]
|
||
|
||
total_score = 0
|
||
weighted_sentiment = 0
|
||
|
||
for post in posts:
|
||
text = (post["title"] + " " + post.get("selftext", "")).lower()
|
||
bull_count = sum(1 for kw in bullish_keywords if kw in text)
|
||
bear_count = sum(1 for kw in bearish_keywords if kw in text)
|
||
|
||
post_sentiment = (bull_count - bear_count) / max(bull_count + bear_count, 1)
|
||
weight = post["score"] + post["num_comments"] # 高互动帖子权重更高
|
||
|
||
weighted_sentiment += post_sentiment * weight
|
||
total_score += weight
|
||
|
||
return weighted_sentiment / max(total_score, 1)
|
||
```
|
||
|
||
**关键 Subreddit 列表**:
|
||
|
||
| Subreddit | 规模 | 特点 | 量化意义 |
|
||
|-----------|------|------|---------|
|
||
| r/Bitcoin | 700 万+ | BTC 长期持有者 | 散户情绪基准 |
|
||
| r/CryptoCurrency | 900 万+ | 综合加密讨论 | 市场整体情绪 |
|
||
| r/ethtrader | 200 万+ | ETH 交易者 | ETH 情绪 |
|
||
| r/SatoshiStreetBets | 50 万+ | 高风险交易 | 极端情绪信号 |
|
||
| r/algotrading | 150 万+ | 量化交易者 | 专业视角 |
|
||
|
||
---
|
||
|
||
### 2.3 Telegram:公开频道免费抓取
|
||
|
||
Telegram 是加密货币信号频道最集中的平台,通过 Telethon 库可以免费抓取公开频道消息。
|
||
|
||
**Python 接入(Telethon 库)**:
|
||
|
||
```python
|
||
# pip install telethon
|
||
from telethon.sync import TelegramClient
|
||
from telethon import functions, types
|
||
import asyncio
|
||
|
||
# 需要注册 Telegram App 获取 api_id 和 api_hash(完全免费)
|
||
# 注册地址:https://my.telegram.org/apps
|
||
|
||
api_id = YOUR_API_ID
|
||
api_hash = "YOUR_API_HASH"
|
||
|
||
async def get_channel_messages(channel_username, limit=100):
|
||
async with TelegramClient("quant_session", api_id, api_hash) as client:
|
||
messages = []
|
||
async for message in client.iter_messages(channel_username, limit=limit):
|
||
if message.text:
|
||
messages.append({
|
||
"id": message.id,
|
||
"date": message.date.isoformat(),
|
||
"text": message.text,
|
||
"views": message.views or 0,
|
||
"forwards": message.forwards or 0
|
||
})
|
||
return messages
|
||
|
||
# 使用示例
|
||
messages = asyncio.run(get_channel_messages("@whale_alert"))
|
||
```
|
||
|
||
**Go 接入(MTProto 协议,需要第三方库)**:
|
||
|
||
```go
|
||
// 使用 gotd/td 库(Go 的 Telegram MTProto 实现)
|
||
// go get github.com/gotd/td
|
||
|
||
package telegram
|
||
|
||
import (
|
||
"context"
|
||
"github.com/gotd/td/telegram"
|
||
"github.com/gotd/td/tg"
|
||
)
|
||
|
||
// 注意:Go 的 Telegram 库较为复杂,建议此模块保留 Python 实现
|
||
// Go 层通过 HTTP 调用 Python 微服务获取 Telegram 数据
|
||
```
|
||
|
||
**推荐监控的 Telegram 频道**:
|
||
|
||
| 频道 | 类型 | 内容 | 量化意义 |
|
||
|------|------|------|---------|
|
||
| @whale_alert | 链上巨鲸 | 大额转账提醒 | 即时巨鲸动向 |
|
||
| @CryptoQuantFund | 量化信号 | 技术分析信号 | 信号参考 |
|
||
| @Bitcoin_signals | 交易信号 | BTC 交易信号 | 散户信号聚合 |
|
||
| @glassnode_alerts | 链上数据 | Glassnode 关键指标触发 | 链上预警 |
|
||
| @coinglass_alert | 衍生品 | 大额清算预警 | 清算风险 |
|
||
| @CryptoNewsFlash | 新闻 | 实时加密新闻 | 事件驱动 |
|
||
|
||
**Telegram 数据处理流程**:
|
||
|
||
```
|
||
Telethon 抓取公开频道消息
|
||
↓
|
||
文本预处理(去除链接、表情符号)
|
||
↓
|
||
关键词提取(BTC/ETH/价格/信号词)
|
||
↓
|
||
情绪分类(多头/空头/中性)
|
||
↓
|
||
写入 MySQL(channel_messages 表)
|
||
↓
|
||
Go 服务读取并聚合为情绪指标
|
||
↓
|
||
更新 MD 文档中的社交情绪区块
|
||
```
|
||
|
||
---
|
||
|
||
### 2.4 LunarCrush:综合社交情绪指数
|
||
|
||
LunarCrush 聚合 X、Reddit、YouTube 等平台数据,提供标准化的社交情绪指数,免费层可访问基础数据。
|
||
|
||
**基础 URL**:`https://lunarcrush.com/api4/public`
|
||
|
||
**免费层可用端点**:
|
||
|
||
| 端点 | 说明 | 数据内容 |
|
||
|------|------|---------|
|
||
| `/coins/list/v2` | 币种社交排名 | AltRank、Galaxy Score |
|
||
| `/coins/{coin}/v1` | 单币种社交数据 | 社交量、情绪、互动量 |
|
||
| `/coins/{coin}/time-series/v2` | 历史社交数据 | 时序社交指标 |
|
||
|
||
**核心指标说明**:
|
||
|
||
| 指标 | 说明 | 量化意义 |
|
||
|------|------|---------|
|
||
| Galaxy Score | 综合社交健康评分(0-100)| > 70 = 社交热度高 |
|
||
| AltRank | 山寨币社交排名 | 排名上升 = 关注度增加 |
|
||
| Social Volume | 社交提及量 | 急增 = 市场关注 |
|
||
| Social Engagement | 社交互动量 | 高互动 = 情绪强烈 |
|
||
| Social Sentiment | 情绪极性(-1 到 +1)| > 0.5 = 偏多头情绪 |
|
||
|
||
```python
|
||
import requests
|
||
|
||
# 免费层无需 API Key(有速率限制)
|
||
def get_lunarcrush_data(coin="BTC"):
|
||
url = f"https://lunarcrush.com/api4/public/coins/{coin}/v1"
|
||
resp = requests.get(url, headers={"Authorization": "Bearer FREE_TOKEN"})
|
||
data = resp.json()["data"]
|
||
return {
|
||
"galaxy_score": data.get("galaxy_score"),
|
||
"alt_rank": data.get("alt_rank"),
|
||
"social_volume": data.get("social_volume"),
|
||
"social_sentiment": data.get("sentiment")
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 2.5 Alternative.me 恐惧贪婪指数:完全免费
|
||
|
||
Alternative.me 的加密货币恐惧贪婪指数是最广泛使用的市场情绪指标,**完全免费,无需 API Key**。
|
||
|
||
**API 端点**:`https://api.alternative.me/fng/`
|
||
|
||
```python
|
||
import requests
|
||
|
||
def get_fear_greed_index(limit=30):
|
||
"""获取最近 30 天的恐惧贪婪指数"""
|
||
url = f"https://api.alternative.me/fng/?limit={limit}&format=json"
|
||
resp = requests.get(url)
|
||
data = resp.json()["data"]
|
||
return [
|
||
{
|
||
"value": int(d["value"]),
|
||
"classification": d["value_classification"], # "Extreme Fear"/"Fear"/"Neutral"/"Greed"/"Extreme Greed"
|
||
"timestamp": d["timestamp"]
|
||
}
|
||
for d in data
|
||
]
|
||
```
|
||
|
||
```go
|
||
// Go 接入
|
||
package alternativeme
|
||
|
||
import (
|
||
"encoding/json"
|
||
"net/http"
|
||
)
|
||
|
||
const FearGreedURL = "https://api.alternative.me/fng/?limit=30&format=json"
|
||
|
||
type FearGreedData struct {
|
||
Value int `json:"value,string"`
|
||
Classification string `json:"value_classification"`
|
||
Timestamp string `json:"timestamp"`
|
||
}
|
||
|
||
func GetFearGreedIndex() ([]FearGreedData, error) {
|
||
resp, err := http.Get(FearGreedURL)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
var result struct {
|
||
Data []FearGreedData `json:"data"`
|
||
}
|
||
json.NewDecoder(resp.Body).Decode(&result)
|
||
return result.Data, nil
|
||
}
|
||
```
|
||
|
||
**恐惧贪婪指数解读**:
|
||
|
||
| 数值范围 | 分类 | 市场含义 | 量化操作 |
|
||
|---------|------|---------|---------|
|
||
| 0-24 | 极度恐惧 | 市场恐慌性抛售 | 逆向思维买入区 |
|
||
| 25-44 | 恐惧 | 市场悲观 | 谨慎观望 |
|
||
| 45-55 | 中性 | 市场平衡 | 跟随趋势 |
|
||
| 56-74 | 贪婪 | 市场乐观 | 减仓区 |
|
||
| 75-100 | 极度贪婪 | 市场狂热 | 逆向思维卖出区 |
|
||
|
||
---
|
||
|
||
## 三、新闻情绪数据源
|
||
|
||
### 3.1 CryptoPanic:加密新闻聚合(免费层)
|
||
|
||
CryptoPanic 聚合 200+ 个加密新闻源,提供免费 API(每天 1000 次请求)。
|
||
|
||
**基础 URL**:`https://cryptopanic.com/api/v1`
|
||
|
||
**注册**:https://cryptopanic.com/developers/api/ (免费注册获取 API Key)
|
||
|
||
**核心端点**:
|
||
|
||
| 端点 | 说明 | 关键参数 |
|
||
|------|------|---------|
|
||
| `/posts/` | 新闻列表 | `currencies=BTC,ETH&filter=hot` |
|
||
| `/posts/` | 按情绪过滤 | `filter=bullish` 或 `filter=bearish` |
|
||
|
||
```python
|
||
import requests
|
||
|
||
CRYPTOPANIC_API_KEY = "YOUR_FREE_API_KEY"
|
||
|
||
def get_crypto_news(currencies="BTC,ETH", filter_type="hot", limit=20):
|
||
url = "https://cryptopanic.com/api/v1/posts/"
|
||
params = {
|
||
"auth_token": CRYPTOPANIC_API_KEY,
|
||
"currencies": currencies,
|
||
"filter": filter_type, # hot/rising/bullish/bearish/important
|
||
"public": "true"
|
||
}
|
||
resp = requests.get(url, params=params)
|
||
results = resp.json()["results"]
|
||
|
||
return [
|
||
{
|
||
"title": r["title"],
|
||
"source": r["source"]["title"],
|
||
"published_at": r["published_at"],
|
||
"votes": r.get("votes", {}),
|
||
"currencies": [c["code"] for c in r.get("currencies", [])]
|
||
}
|
||
for r in results[:limit]
|
||
]
|
||
|
||
# 情绪分析:统计看涨/看跌新闻比例
|
||
def get_news_sentiment_ratio(currency="BTC"):
|
||
bullish = len(get_crypto_news(currency, "bullish", 50))
|
||
bearish = len(get_crypto_news(currency, "bearish", 50))
|
||
total = bullish + bearish
|
||
if total == 0:
|
||
return 0
|
||
return (bullish - bearish) / total # -1 到 +1
|
||
```
|
||
|
||
---
|
||
|
||
### 3.2 Finnhub:新闻情绪 + 基本面(免费层)
|
||
|
||
Finnhub 提供加密货币新闻情绪分析,免费层每分钟 60 次请求。
|
||
|
||
**基础 URL**:`https://finnhub.io/api/v1`
|
||
|
||
**核心端点**:
|
||
|
||
| 端点 | 说明 | 参数 |
|
||
|------|------|------|
|
||
| `/news` | 加密新闻 | `category=crypto&token=YOUR_KEY` |
|
||
| `/news-sentiment` | 新闻情绪分析 | `symbol=BINANCE:BTCUSDT&token=YOUR_KEY` |
|
||
| `/crypto/candle` | K 线数据 | `symbol=BINANCE:BTCUSDT&resolution=10` |
|
||
|
||
```go
|
||
package finnhub
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"net/http"
|
||
)
|
||
|
||
const FinnhubBaseURL = "https://finnhub.io/api/v1"
|
||
|
||
type NewsSentiment struct {
|
||
BullishPercent float64 `json:"buzz"`
|
||
BearishPercent float64 `json:"bearishPercent"`
|
||
BullishPercent2 float64 `json:"bullishPercent"`
|
||
Score float64 `json:"companyNewsScore"`
|
||
SectorAvg float64 `json:"sectorAverageBullishPercent"`
|
||
}
|
||
|
||
func GetNewsSentiment(symbol, apiKey string) (*NewsSentiment, error) {
|
||
url := fmt.Sprintf("%s/news-sentiment?symbol=%s&token=%s",
|
||
FinnhubBaseURL, symbol, apiKey)
|
||
|
||
resp, err := http.Get(url)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
var sentiment NewsSentiment
|
||
json.NewDecoder(resp.Body).Decode(&sentiment)
|
||
return &sentiment, nil
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 四、扩展链上数据源
|
||
|
||
### 4.1 Dune Analytics:免费 SQL 链上查询
|
||
|
||
Dune 允许用 SQL 查询以太坊、Solana 等主流链的原始数据,免费层提供 API 访问。
|
||
|
||
**基础 URL**:`https://api.dune.com/api/v1`
|
||
|
||
**认证**:`X-Dune-API-Key: YOUR_API_KEY`(免费注册获取)
|
||
|
||
**工作流程**:
|
||
1. 在 Dune 网站编写 SQL 查询(如 Uniswap V3 BTC 交易量)
|
||
2. 获取查询 ID(URL 中的数字)
|
||
3. 通过 API 定期执行查询并获取结果
|
||
|
||
```python
|
||
import requests
|
||
import time
|
||
|
||
DUNE_API_KEY = "YOUR_FREE_API_KEY"
|
||
HEADERS = {"X-Dune-API-Key": DUNE_API_KEY}
|
||
|
||
def execute_dune_query(query_id: int) -> dict:
|
||
"""执行 Dune 查询并等待结果"""
|
||
# 1. 触发执行
|
||
execute_url = f"https://api.dune.com/api/v1/query/{query_id}/execute"
|
||
exec_resp = requests.post(execute_url, headers=HEADERS)
|
||
execution_id = exec_resp.json()["execution_id"]
|
||
|
||
# 2. 轮询等待结果
|
||
status_url = f"https://api.dune.com/api/v1/execution/{execution_id}/status"
|
||
while True:
|
||
status = requests.get(status_url, headers=HEADERS).json()
|
||
if status["state"] == "QUERY_STATE_COMPLETED":
|
||
break
|
||
time.sleep(2)
|
||
|
||
# 3. 获取结果
|
||
result_url = f"https://api.dune.com/api/v1/execution/{execution_id}/results"
|
||
return requests.get(result_url, headers=HEADERS).json()["result"]["rows"]
|
||
|
||
# 示例:查询 BTC 巨鲸地址余额变化(需要预先在 Dune 创建查询)
|
||
# 查询 ID 可以从 Dune 社区现有查询中找到
|
||
btc_whale_data = execute_dune_query(query_id=3456789)
|
||
```
|
||
|
||
**推荐的 Dune 社区查询**(可直接复用):
|
||
|
||
| 查询名称 | 说明 | 适用链 |
|
||
|---------|------|--------|
|
||
| Uniswap V3 Volume | DEX 交易量 | Ethereum |
|
||
| Aave Liquidations | 清算事件 | Ethereum |
|
||
| ETH Staking Flows | 质押资金流向 | Ethereum |
|
||
| SOL DEX Volume | Solana DEX 交易量 | Solana |
|
||
| USDT/USDC Mint/Burn | 稳定币增发/销毁 | 多链 |
|
||
|
||
---
|
||
|
||
### 4.2 Arkham Intelligence:免费巨鲸追踪
|
||
|
||
Arkham 提供地址标签和巨鲸追踪功能,是 Nansen 的免费替代方案。
|
||
|
||
**访问方式**:https://platform.arkhamintelligence.com/
|
||
|
||
**免费功能**:
|
||
- 地址标签查询(交易所、基金、KOL 地址)
|
||
- 实体追踪(Binance、Coinbase 等交易所的链上资金流向)
|
||
- 历史交易记录查询
|
||
|
||
**API 接入**(需申请 API Key):
|
||
|
||
```python
|
||
import requests
|
||
|
||
ARKHAM_API_KEY = "YOUR_ARKHAM_API_KEY"
|
||
|
||
def get_entity_transfers(entity="binance", limit=20):
|
||
"""获取特定实体(如 Binance)的最新链上转账"""
|
||
url = "https://api.arkhamintelligence.com/transfers"
|
||
headers = {"API-Key": ARKHAM_API_KEY}
|
||
params = {
|
||
"entities": entity,
|
||
"limit": limit,
|
||
"sortKey": "time",
|
||
"sortDir": "desc"
|
||
}
|
||
resp = requests.get(url, headers=headers, params=params)
|
||
return resp.json()["transfers"]
|
||
```
|
||
|
||
**量化使用场景**:
|
||
- 监控 Binance 冷钱包的大额 BTC 转入/转出(判断交易所储备变化)
|
||
- 追踪已知巨鲸地址的持仓变化
|
||
- 检测大型 DeFi 协议的资金流向
|
||
|
||
---
|
||
|
||
## 五、扩展综合市场数据源
|
||
|
||
### 5.1 CoinGecko:完全免费的市场数据
|
||
|
||
CoinGecko 提供完全免费的市场数据 API(无需 API Key),是 CoinMarketCap 的最佳免费替代。
|
||
|
||
**基础 URL**:`https://api.coingecko.com/api/v3`
|
||
|
||
**核心端点**:
|
||
|
||
| 端点 | 说明 | 参数 |
|
||
|------|------|------|
|
||
| `/simple/price` | 实时价格 | `ids=bitcoin,ethereum&vs_currencies=usd` |
|
||
| `/coins/{id}/market_chart` | 历史价格 | `vs_currency=usd&days=30` |
|
||
| `/coins/markets` | 市值排名 | `vs_currency=usd&order=market_cap_desc&per_page=100` |
|
||
| `/global` | 全球市场指标 | — |
|
||
| `/coins/{id}` | 币种详情(含社交数据)| — |
|
||
|
||
```go
|
||
package coingecko
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"net/http"
|
||
)
|
||
|
||
const BaseURL = "https://api.coingecko.com/api/v3"
|
||
|
||
type GlobalData struct {
|
||
TotalMarketCap map[string]float64 `json:"total_market_cap"`
|
||
TotalVolume map[string]float64 `json:"total_volume"`
|
||
BTCDominance float64 `json:"bitcoin_dominance_percentage"`
|
||
ETHDominance float64 `json:"eth_dominance_percentage"`
|
||
MarketCapChange24h float64 `json:"market_cap_change_percentage_24h_usd"`
|
||
}
|
||
|
||
func GetGlobalData() (*GlobalData, error) {
|
||
resp, err := http.Get(fmt.Sprintf("%s/global", BaseURL))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
var result struct {
|
||
Data GlobalData `json:"data"`
|
||
}
|
||
json.NewDecoder(resp.Body).Decode(&result)
|
||
return &result.Data, nil
|
||
}
|
||
```
|
||
|
||
**CoinGecko vs CoinMarketCap 对比**:
|
||
|
||
| 维度 | CoinGecko | CoinMarketCap |
|
||
|------|-----------|--------------|
|
||
| 免费程度 | **完全免费**(无 Key)| 免费层(需 Key,333 次/天)|
|
||
| 数据质量 | 高 | 高 |
|
||
| 历史数据 | 免费(有限)| 付费 |
|
||
| 社交数据 | 有(GitHub、Twitter 关注)| 有 |
|
||
| 速率限制 | 30 次/分(免费)| 333 次/天(免费)|
|
||
|
||
---
|
||
|
||
### 5.2 Token Terminal:协议基本面数据
|
||
|
||
Token Terminal 提供 DeFi 协议的收入、P/E 比率等基本面数据,免费层可访问主要数据。
|
||
|
||
**访问方式**:https://tokenterminal.com/terminal/
|
||
|
||
**核心指标**:
|
||
|
||
| 指标 | 说明 | 量化意义 |
|
||
|------|------|---------|
|
||
| Protocol Revenue | 协议收入(费用)| 判断协议实际使用量 |
|
||
| P/E Ratio | 市值/年化收入 | 估值判断(类股票 P/E)|
|
||
| TVL | 总锁仓量 | DeFi 协议规模 |
|
||
| Active Users | 活跃用户数 | 用户增长趋势 |
|
||
|
||
---
|
||
|
||
## 六、扩展宏观经济数据源
|
||
|
||
### 6.1 Yahoo Finance:免费股指与大宗商品
|
||
|
||
Yahoo Finance 提供免费的股票、ETF、外汇、大宗商品数据,通过 `yfinance` Python 库可直接访问。
|
||
|
||
```python
|
||
# pip install yfinance
|
||
import yfinance as yf
|
||
|
||
# 获取黄金价格(GC=F)
|
||
gold = yf.download("GC=F", period="1mo", interval="1d")
|
||
|
||
# 获取标普 500(^GSPC)
|
||
sp500 = yf.download("^GSPC", period="3mo", interval="1d")
|
||
|
||
# 获取美元指数(DX-Y.NYB)
|
||
dxy = yf.download("DX-Y.NYB", period="1mo", interval="1d")
|
||
|
||
# 获取比特币 ETF(IBIT)
|
||
ibit = yf.download("IBIT", period="1mo", interval="1d")
|
||
```
|
||
|
||
**Go 接入**(通过 Yahoo Finance 非官方 API):
|
||
|
||
```go
|
||
package yahoo
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"net/http"
|
||
)
|
||
|
||
// 获取股票/ETF/指数数据
|
||
func GetQuote(symbol string) (map[string]interface{}, error) {
|
||
url := fmt.Sprintf(
|
||
"https://query1.finance.yahoo.com/v8/finance/chart/%s?interval=1d&range=1mo",
|
||
symbol,
|
||
)
|
||
req, _ := http.NewRequest("GET", url, nil)
|
||
req.Header.Set("User-Agent", "Mozilla/5.0")
|
||
|
||
client := &http.Client{}
|
||
resp, err := client.Do(req)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
var result map[string]interface{}
|
||
json.NewDecoder(resp.Body).Decode(&result)
|
||
return result, nil
|
||
}
|
||
```
|
||
|
||
**重要监控标的**:
|
||
|
||
| 标的 | 代码 | 与 BTC 的关系 |
|
||
|------|------|-------------|
|
||
| 黄金 | GC=F | 正相关(避险资产)|
|
||
| 标普 500 | ^GSPC | 正相关(风险偏好)|
|
||
| 纳斯达克 | ^IXIC | 强正相关(科技股)|
|
||
| 美元指数 | DX-Y.NYB | 负相关(美元强 = BTC 弱)|
|
||
| 10 年期美债 | ^TNX | 负相关(利率高 = 风险资产弱)|
|
||
| BTC ETF(IBIT)| IBIT | 直接关联 |
|
||
| VIX 恐慌指数 | ^VIX | 负相关(VIX 高 = 市场恐慌)|
|
||
|
||
---
|
||
|
||
### 6.2 世界银行:全球宏观数据
|
||
|
||
世界银行提供完全免费的全球宏观经济数据,适合长期宏观分析。
|
||
|
||
**基础 URL**:`https://api.worldbank.org/v2`
|
||
|
||
```python
|
||
import requests
|
||
|
||
def get_world_bank_data(indicator="NY.GDP.MKTP.CD", country="US", years=5):
|
||
"""获取世界银行指标数据"""
|
||
url = f"https://api.worldbank.org/v2/country/{country}/indicator/{indicator}"
|
||
params = {
|
||
"format": "json",
|
||
"per_page": years,
|
||
"mrv": years # 最近 N 年
|
||
}
|
||
resp = requests.get(url, params=params)
|
||
data = resp.json()[1] # [0] 是元数据,[1] 是数据
|
||
return [{"year": d["date"], "value": d["value"]} for d in data if d["value"]]
|
||
|
||
# 常用指标
|
||
# NY.GDP.MKTP.CD = GDP(美元)
|
||
# FP.CPI.TOTL.ZG = CPI 通胀率
|
||
# SL.UEM.TOTL.ZS = 失业率
|
||
```
|
||
|
||
---
|
||
|
||
## 七、衍生品数据扩展
|
||
|
||
### 7.1 Laevitas:期权与衍生品分析(有限免费)
|
||
|
||
Laevitas 专注于加密衍生品数据,提供 GEX(Gamma 敞口)、期权流、资金费率聚合等高级数据。
|
||
|
||
**基础 URL**:`https://api.laevitas.ch`
|
||
|
||
**核心数据**:
|
||
|
||
| 数据 | 说明 | 量化意义 |
|
||
|------|------|---------|
|
||
| GEX(Gamma 敞口)| 做市商 Gamma 对冲方向 | 正 GEX = 价格稳定区,负 GEX = 价格波动加剧 |
|
||
| 期权流(Option Flow)| 大额期权成交记录 | 机构方向性押注 |
|
||
| 资金费率聚合 | 15+ 交易所资金费率 | 市场情绪极值判断 |
|
||
| 最大痛点 | 期权到期最大痛点价格 | 到期日价格引力 |
|
||
| IV 曲面 | 各行权价/到期日的 IV | 期权定价与市场预期 |
|
||
|
||
---
|
||
|
||
### 7.2 Coinalyze:未平仓量与清算(有限免费)
|
||
|
||
Coinalyze 提供多交易所的未平仓量、清算数据聚合,免费层可访问基础数据。
|
||
|
||
**基础 URL**:`https://api.coinalyze.net/v1`
|
||
|
||
**核心端点**:
|
||
|
||
| 端点 | 说明 |
|
||
|------|------|
|
||
| `/open-interest` | 多所未平仓量聚合 |
|
||
| `/liquidation-history` | 历史清算数据 |
|
||
| `/funding-rate` | 多所资金费率 |
|
||
| `/long-short-ratio` | 多空比 |
|
||
|
||
---
|
||
|
||
## 八、数据源优先级与接入策略
|
||
|
||
### 8.1 按重要性排序
|
||
|
||
**第一优先级(必须接入,完全免费)**:
|
||
|
||
| 数据源 | 核心价值 |
|
||
|--------|---------|
|
||
| Binance(合约)| 实时 K 线、资金费率 |
|
||
| CoinGecko | 市值、排名、全球数据 |
|
||
| Alternative.me | 恐惧贪婪指数 |
|
||
| FRED | 宏观利率、CPI |
|
||
| DeFiLlama | DeFi TVL |
|
||
| Reddit(PRAW)| 社区情绪 |
|
||
| CryptoPanic | 新闻情绪 |
|
||
| Dune Analytics | 链上自定义查询 |
|
||
|
||
**第二优先级(有限免费,建议接入)**:
|
||
|
||
| 数据源 | 核心价值 |
|
||
|--------|---------|
|
||
| OKX | 期权数据、K 线交叉验证 |
|
||
| Bybit | 资金费率三所对比 |
|
||
| Deribit | DVOL、期权链 |
|
||
| Telegram(Telethon)| 信号频道、巨鲸预警 |
|
||
| LunarCrush | 综合社交情绪 |
|
||
| Yahoo Finance | 股指、大宗商品关联 |
|
||
| Arkham | 巨鲸追踪 |
|
||
|
||
**第三优先级(付费,按需接入)**:
|
||
|
||
| 数据源 | 费用 | 核心价值 |
|
||
|--------|------|---------|
|
||
| Glassnode | $29-$799/月 | 最权威链上数据 |
|
||
| CoinGlass | $29-$99/月 | 衍生品清算数据 |
|
||
| Santiment | $49-$999/月 | 社交趋势、开发活跃度 |
|
||
| X/Twitter Basic | $100/月 | KOL 情绪 |
|
||
|
||
### 8.2 社交媒体免费方案最终推荐
|
||
|
||
综合稳定性、数据质量、接入难度,推荐以下**完全免费**的社交媒体数据方案:
|
||
|
||
```
|
||
X/Twitter → Nitter RSS(监控 10 个核心 KOL)+ twitterapi.io 免费额度
|
||
Reddit → PRAW 官方库(r/Bitcoin + r/CryptoCurrency)
|
||
Telegram → Telethon(监控 10 个核心公开频道)
|
||
情绪汇总 → Alternative.me 恐惧贪婪指数(最稳定、最权威)
|
||
新闻情绪 → CryptoPanic 免费层(200+ 新闻源)
|
||
```
|
||
|
||
---
|
||
|
||
## 九、数据源接入状态监控(扩展版)
|
||
|
||
系统 `/api/v1/datasources` 接口将返回所有 28 个数据源的状态:
|
||
|
||
```json
|
||
{
|
||
"timestamp": "2026-03-06T10:10:00+08:00",
|
||
"summary": {
|
||
"total": 28,
|
||
"online": 26,
|
||
"offline": 1,
|
||
"degraded": 1
|
||
},
|
||
"by_category": {
|
||
"cex": {"total": 3, "online": 3},
|
||
"derivatives": {"total": 3, "online": 3},
|
||
"onchain": {"total": 4, "online": 3},
|
||
"defi": {"total": 3, "online": 3},
|
||
"market": {"total": 3, "online": 3},
|
||
"social": {"total": 5, "online": 4},
|
||
"news": {"total": 3, "online": 3},
|
||
"macro": {"total": 4, "online": 4}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 参考资料
|
||
|
||
- [1] Nitter 开源项目:https://github.com/zedeus/nitter
|
||
- [2] ntscraper Python 库:https://github.com/bocchilorenzo/ntscraper
|
||
- [3] twitterapi.io 免费额度:https://dev.to/sivarampg/scraping-twitter-in-2025-a-developers-guide-to-surviving-the-api-apocalypse-5bbd
|
||
- [4] X 官方 API 定价:https://developer.x.com/
|
||
- [5] PRAW Reddit API 文档:https://praw.readthedocs.io/
|
||
- [6] Telethon Telegram 库:https://docs.telethon.dev/
|
||
- [7] LunarCrush API:https://lunarcrush.com/
|
||
- [8] Alternative.me 恐惧贪婪 API:https://alternative.me/crypto/api/
|
||
- [9] CryptoPanic API:https://cryptopanic.com/developers/api/
|
||
- [10] Finnhub API:https://finnhub.io/docs/api
|
||
- [11] Dune Analytics API:https://docs.dune.com/api-reference/overview/introduction
|
||
- [12] Arkham Intelligence:https://platform.arkhamintelligence.com/
|
||
- [13] CoinGecko API:https://www.coingecko.com/api/documentation
|
||
- [14] Token Terminal:https://tokenterminal.com/
|
||
- [15] Laevitas API:https://docs.laevitas.ch/
|
||
- [16] Coinalyze API:https://coinalyze.net/
|
||
- [17] Yahoo Finance(yfinance):https://pypi.org/project/yfinance/
|
||
- [18] FRED API:https://fred.stlouisfed.org/docs/api/fred/
|
||
- [19] 世界银行 API:https://datahelpdesk.worldbank.org/knowledgebase/articles/889392
|
||
- [20] 原版数据源指南(12 个):`./数据源接入完整指南.md`
|