2. 数据源选择与API接入:主流数据提供商介绍与基础连接
做外汇量化交易,第一步就是搞定数据。没有数据,策略就是空中楼阁。
我个人习惯把数据源分成两类:一类是免费的,适合回测和研究;另一类是付费的,适合实盘。今天咱们先聊三个主流的数据提供商——Dukascopy、TrueFX、FXCM。它们各有各的脾气,我一个个说。
2.1 三大数据提供商对比
先看一张对比表,心里有个底:
| 提供商 | 数据特点 | 接入方式 | 费用 | 我的评价 |
|---|---|---|---|---|
| Dukascopy | Tick级数据,历史数据全 | JForex API / REST | 免费(需注册) | 回测首选,数据质量高 |
| TrueFX | 实时Tick数据,延迟低 | FIX / REST | 免费(需注册) | 实盘参考,但历史数据有限 |
| FXCM | 报价数据,适合零售交易 | REST API / FIX | 免费(需注册) | 适合小资金,数据颗粒度一般 |
嗯,这里要注意:Dukascopy的数据我用了好几年,它的Tick数据时间戳精确到毫秒,而且历史数据能追溯到2003年。我在做高频策略回测时,基本都靠它。
2.2 Dukascopy:回测数据的黄金标准
Dukascopy提供的是JForex平台的数据。它的API有两种方式:一种是JForex API(Java),另一种是REST API(HTTP)。
我个人更推荐REST方式,因为Python直接就能调,省事。
API密钥申请步骤:
- 访问
www.dukascopy.com,注册一个真实账户(免费) - 登录后进入「API」菜单,申请API密钥
- 你会得到一个
client_id和client_secret - 注意:密钥有权限范围,建议勾选「数据访问」
基础连接代码(Python):
import requests
import json
# 配置你的密钥
CLIENT_ID = "your_client_id"
CLIENT_SECRET = "your_client_secret"
# 获取访问令牌
def get_token():
url = "https://api.dukascopy.com/auth/token"
payload = {
"client_id": CLIENT_ID,
"client_secret": CLIENT_SECRET,
"grant_type": "client_credentials"
}
response = requests.post(url, data=payload)
return response.json()["access_token"]
# 获取EUR/USD的Tick数据
def get_ticks(symbol="EUR/USD", start_time="2024-01-01", end_time="2024-01-02"):
token = get_token()
headers = {"Authorization": f"Bearer {token}"}
url = f"https://api.dukascopy.com/data/{symbol}/ticks"
params = {
"start": start_time,
"end": end_time
}
response = requests.get(url, headers=headers, params=params)
return response.json()
# 测试连接
if __name__ == "__main__":
data = get_ticks()
print(f"获取到 {len(data)} 条Tick数据")
print("第一条数据:", data[0] if data else "无数据")
这段代码跑通后,你就能拿到原始的Tick数据了。数据格式大概是这样的:
{
"timestamp": 1704067200000,
"bid": 1.1045,
"ask": 1.1047,
"volume": 12
}
timestamp是Unix毫秒时间戳,bid和ask就是买卖报价,volume是成交量。嗯,这里要注意:Dukascopy的volume是「手数」,不是「笔数」。我刚开始没注意,算流动性时差点搞错。
2.3 TrueFX:实盘数据的低延迟选择
TrueFX是Integral旗下的数据源,主要给机构用。它的特点是延迟极低,而且数据是「真实成交价」,不是报价。
说白了,Dukascopy的数据是「有人想买/想卖的价格」,TrueFX的数据是「实际成交的价格」。做实盘策略时,TrueFX更靠谱。
API密钥申请:
- 访问
www.truefx.com,点击「Register」 - 填写公司信息(个人也可以,选「Individual」)
- 提交后,他们会发邮件给你,里面包含
username和password - 注意:TrueFX的API是FIX协议的,需要额外配置
/api/v1/ 试试。比如:https://www.truefx.com/api/v1/rates。我当初找这个接口找了半小时……
基础连接代码(REST方式):
import requests
# TrueFX的REST接口(无需认证即可获取实时数据)
def get_truefx_rates():
url = "https://www.truefx.com/api/v1/rates"
response = requests.get(url)
data = response.json()
return data
# 解析数据
rates = get_truefx_rates()
for pair in rates:
print(f"{pair['symbol']}: Bid={pair['bid']}, Ask={pair['ask']}")
返回的数据长这样:
[
{"symbol": "EUR/USD", "bid": 1.10452, "ask": 1.10472, "timestamp": 1704067200000},
{"symbol": "GBP/USD", "bid": 1.26430, "ask": 1.26450, "timestamp": 1704067200000}
]
你想想看,这个接口连密钥都不需要,直接就能用。但缺点也很明显——它只提供实时数据,历史数据最多往前推24小时。做回测的话,还得靠Dukascopy。
2.4 FXCM:零售交易者的入门选择
FXCM(福汇)是老牌外汇经纪商了。它的API对个人开发者很友好,文档写得也清楚。
我记得刚开始做量化时,第一个接的就是FXCM的API。为啥?因为它有Python的官方SDK,省去了自己封装协议的麻烦。
API密钥申请:
- 注册FXCM真实账户或模拟账户
- 登录后进入「API管理」页面
- 创建应用,获取
access_token - 注意:模拟账户的token有效期只有24小时,需要定期刷新
基础连接代码(使用官方SDK):
from fxcmpy import fxcmpy
# 初始化连接
conn = fxcmpy(access_token="your_access_token", log_level="error")
# 获取所有货币对
symbols = conn.get_instruments()
print("可用货币对:", symbols[:5]) # 只打印前5个
# 获取EUR/USD的实时报价
quote = conn.get_quote("EUR/USD")
print(f"EUR/USD: Bid={quote['Bid']}, Ask={quote['Ask']}")
# 获取历史数据(1分钟K线)
history = conn.get_candles("EUR/USD", period="m1", number=100)
print(history.head())
# 关闭连接
conn.close()
FXCM的数据颗粒度是「分钟级」的,没有Tick数据。所以它更适合做日内策略,不适合高频。
2.5 数据源选择建议
说了这么多,到底该选哪个?我根据经验给个建议:
- 做回测研究:首选Dukascopy。历史数据全,Tick级精度,免费。
- 做实盘监控:用TrueFX。延迟低,数据真实。
- 做入门学习:用FXCM。SDK封装好,上手快。
- 做生产环境:建议Dukascopy + TrueFX双源。一个做历史回测,一个做实盘校验。
为什么会这样?因为单一数据源总有风险。我见过有人只靠Dukascopy的数据做策略,结果实盘时发现TrueFX的报价差了2个点,策略直接失效。所以,数据源交叉验证是必须的。
2.6 本章知识体系
下面这张图总结了本章的核心逻辑,方便你回顾:
这张图把三个数据源的特点、接入方式、最终流向都串起来了。你跟着这个逻辑走,就不会乱。
核心要点回顾:
- Dukascopy:历史数据最全,Tick级精度,适合回测
- TrueFX:实时数据延迟低,真实成交价,适合实盘
- FXCM:SDK封装好,上手快,适合入门学习
- API密钥申请时注意邮箱真实性和权限范围
- 生产环境建议多数据源交叉验证
好了,数据源接入这块就聊到这儿。下一节咱们开始讲数据清洗——那才是真正考验功夫的地方。