数据获取与API接入:主流数据源对比
做量化交易,数据就是你的弹药。没有弹药,再好的策略也打不响。
我记得刚入行那会儿,为了拿到恐慌贪婪指数,我手动去网页上复制数据,一天一次,持续了三个月。后来数据量大了,手都复制麻了。嗯,从那以后我发誓要学会API接入。
今天咱们就聊聊,怎么用Python把恐慌贪婪指数数据拉下来。说白了,就是三步:选数据源、申请密钥、写代码拿数据。
主流数据源对比
目前市面上能拿到恐慌贪婪指数的数据源,主要有两家:Alternative.me 和 CoinMarketCap。
我个人习惯用Alternative.me,原因很简单——免费、轻量、专精。它本身就是做市场情绪分析的,恐慌贪婪指数是它的招牌产品。
| 对比项 | Alternative.me | CoinMarketCap |
|---|---|---|
| 数据免费 | ✅ 完全免费 | ⚠️ 基础免费,高级付费 |
| API密钥 | 不需要 | 需要申请 |
| 请求频率限制 | 无明确限制(建议合理使用) | 每分钟30次(免费版) |
| 历史数据 | 支持(可回溯数年) | 支持 |
| 数据格式 | JSON | JSON |
| 额外功能 | 仅恐慌贪婪指数 | 行情、市值、交易量等 |
我的建议:刚开始做策略回测,用Alternative.me就够了。等你要做多因子模型,需要结合行情数据时,再考虑CoinMarketCap。
API密钥申请
Alternative.me不需要密钥,直接请求就行。但CoinMarketCap需要,我简单说一下流程。
去 pro.coinmarketcap.com 注册账号,选免费计划。然后在Dashboard里找到API Key,复制下来保存好。
我曾经踩过的坑:把API密钥直接写死在代码里,然后上传到了GitHub公开仓库。第二天发现密钥被人拿去调用了几万次,账单直接爆了。所以,密钥一定要用环境变量管理!
正确的做法是这样:
import os
from dotenv import load_dotenv
load_dotenv()
CMC_API_KEY = os.getenv("CMC_API_KEY") # 从.env文件读取
Python请求库安装
你需要两个库:requests 和 json。后者是Python内置的,不用装。前者需要手动安装。
pip install requests
就这么一行命令。你想想看,装个库比去网页复制数据快多了吧?
JSON数据解析
数据拿到手了,怎么用?JSON格式说白了就是嵌套的字典和列表。咱们直接上代码。
先拿Alternative.me的数据试试:
import requests
import json
# 请求恐慌贪婪指数(最近30天)
url = "https://api.alternative.me/fng/?limit=30"
response = requests.get(url)
# 检查状态码
if response.status_code == 200:
data = response.json()
# 解析数据
for item in data["data"]:
date = item["timestamp"]
value = item["value"]
classification = item["value_classification"]
print(f"日期: {date}, 指数: {value}, 情绪: {classification}")
else:
print(f"请求失败,状态码: {response.status_code}")
运行结果大概长这样:
日期: 1700000000, 指数: 65, 情绪: Greed
日期: 1699913600, 指数: 62, 情绪: Greed
日期: 1699827200, 指数: 58, 情绪: Neutral
注意那个时间戳,是Unix时间戳,需要转换一下:
from datetime import datetime
timestamp = int(item["timestamp"])
date_str = datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d")
print(f"日期: {date_str}")
再看看CoinMarketCap的调用方式:
import requests
headers = {
"X-CMC_PRO_API_KEY": CMC_API_KEY,
"Accept": "application/json"
}
url = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/listings/latest"
params = {"limit": 10}
response = requests.get(url, headers=headers, params=params)
data = response.json()
# 解析比特币的恐慌贪婪指数(需要额外字段)
for coin in data["data"]:
if coin["symbol"] == "BTC":
print(f"比特币当前价格: ${coin['quote']['USD']['price']:.2f}")
核心要点:JSON解析其实就是一层层剥洋葱。先看最外层是字典还是列表,然后一层层往下取。用
print(data.keys()) 先看看结构,再动手写代码。
知识体系总览
下面这张图,帮你把整个数据获取流程串起来:
避坑指南:我曾经在解析JSON时,直接用了
data["data"],结果返回的是None。后来才发现,有些API返回的字段名是 "results" 而不是 "data"。所以,拿到数据后先 print(data) 看一眼结构,再动手写解析代码。
好了,数据获取这块就聊到这儿。你只要把上面这段代码跑通,恐慌贪婪指数就能源源不断地流进你的数据库了。