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密钥申请步骤:

  1. 访问 www.dukascopy.com,注册一个真实账户(免费)
  2. 登录后进入「API」菜单,申请API密钥
  3. 你会得到一个 client_idclient_secret
  4. 注意:密钥有权限范围,建议勾选「数据访问」
我曾经踩过的坑: 注册时如果用临时邮箱,Dukascopy会直接拒绝API申请。必须用真实邮箱,而且最好绑定手机号。我第一次申请时用了QQ邮箱,结果等了三天没反应……后来换成Gmail,当天就通过了。

基础连接代码(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密钥申请:

  1. 访问 www.truefx.com,点击「Register」
  2. 填写公司信息(个人也可以,选「Individual」)
  3. 提交后,他们会发邮件给你,里面包含 usernamepassword
  4. 注意:TrueFX的API是FIX协议的,需要额外配置
小技巧: TrueFX也提供REST接口,但文档藏得比较深。你可以在URL后面加 /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密钥申请:

  1. 注册FXCM真实账户或模拟账户
  2. 登录后进入「API管理」页面
  3. 创建应用,获取 access_token
  4. 注意:模拟账户的token有效期只有24小时,需要定期刷新
避坑指南: FXCM的API有速率限制,每分钟最多60次请求。我曾经写了个循环去拉数据,结果直接被封了IP……后来加了sleep才解决。建议每次请求间隔至少1秒。

基础连接代码(使用官方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 本章知识体系

下面这张图总结了本章的核心逻辑,方便你回顾:

数据源选择与API接入知识体系 Dukascopy 回测首选 · Tick级 · 免费 TrueFX 实盘首选 · 低延迟 · 真实成交 FXCM 入门首选 · SDK友好 · 分钟级 REST API / JForex FIX / REST REST API / SDK 数据清洗与标准化 选择建议:回测用Dukascopy,实盘用TrueFX,入门用FXCM

这张图把三个数据源的特点、接入方式、最终流向都串起来了。你跟着这个逻辑走,就不会乱。

核心要点回顾:

  • Dukascopy:历史数据最全,Tick级精度,适合回测
  • TrueFX:实时数据延迟低,真实成交价,适合实盘
  • FXCM:SDK封装好,上手快,适合入门学习
  • API密钥申请时注意邮箱真实性和权限范围
  • 生产环境建议多数据源交叉验证

好了,数据源接入这块就聊到这儿。下一节咱们开始讲数据清洗——那才是真正考验功夫的地方。


专注资料整理