最近帮朋友搭建港美期货的自动交易系统,踩了不少 API 接入的坑——比如选 API 时没注意费率结构,初期测试没问题,跑实盘才发现手续费比预期高很多;还有接入时忽略了行情延时的问题,导致策略信号滞后。
索性整理一篇全流程指南,从基础概念到代码实操,都是实打实的经验总结。不管你是想做量化交易,还是单纯需要期货数据做分析,跟着这篇走,能少走很多弯路。
一、先搞懂基础:期货和期货 API 到底是什么?
先澄清个误区,很多人把期货和股票搞混,其实核心区别在于“约定未来”——期货是约定在未来某一特定时间,按约定价格买卖一定数量的特定商品(比如原油、黄金)或金融资产(比如恒生指数、纳斯达克指数)的标准化合约。
而期货 API,简单说就是期货经纪商或数据服务商开放的“接口”。通过这个接口,我们能不用手动登录交易软件,直接用代码实现三件核心事:
获取行情数据(比如实时成交价、成交量、持仓量,还有历史 K 线数据);
提交交易指令(买入、卖出、平仓,甚至设置条件单);
查询账户信息(持仓情况、可用资金、盈亏明细)。
没有 API 的话,量化策略就是“纸上谈兵”——总不能靠人工盯着行情、手动下单吧?效率低还容易出错。
二、港美主流期货 API 有哪些?按用途分三类
港美期货市场的 API 服务商主要分两类:一类是正规期货经纪商(比如盈透、富途),他们的 API 既能拿数据又能交易;另一类是专门的数据服务商(比如 Quandl、IEX Cloud),主要提供行情数据,不支持直接交易。
按用途拆成三类,更方便大家对应自己的需求:
1. 综合类 API(既能交易又能拿数据)
这类是最常用的,适合想直接落地交易策略的朋友,重点说两个主流的:
① 盈透证券(Interactive Brokers)API:港美期货覆盖最全,从恒生指数期货、富时中国 A50,到美原油、黄金期货都有。支持 REST API 和 WebSocket(WebSocket 适合拿实时行情,延迟更低),文档很详细,就是初期配置有点复杂,需要申请 API 权限、设置交易权限。
② 富途证券 API:对国内用户更友好,中文文档详尽且社区支持完善,配置流程清晰。核心覆盖港股、美股及新加坡市场主流期货品种,包括恒生指数、纳斯达克 100 指数、富时中国 A50 等热门品种,实时行情和交易功能均能稳定覆盖,适合新手入门。缺点是部分小众期货品种(比如欧洲的一些期货)覆盖不全,且需搭配 FutuOpenD 网关程序使用。
2. 纯数据类 API(只拿数据,不支持交易)
适合做回测、数据分析,不需要实盘交易的朋友:
Quandl:历史数据超全,港美期货的历史 K 线、持仓报告都能拿到,免费额度足够个人用,超出额度按条收费。缺点是实时行情延迟有点高(大概 10-15 分钟),不适合实时交易。
IEX Cloud:实时行情质量不错,延迟低(毫秒级),支持按分钟、小时粒度拿数据。收费是阶梯式的,交易量越大越划算,适合对行情实时性要求高的分析场景。
iTick 期货 API:专门聚焦港美期货数据的 API,覆盖恒生指数、美原油、黄金等热门品种,实时行情延迟低(百毫秒级),历史数据颗粒度全(分钟/小时/日线)。中文文档清晰,支持 Python/Java 等多语言,免费版可满足个人测试,付费版性价比高,适合需要稳定期货数据的个人和中小团队。
当然还有彭博,TradingView 等数据超全 API,但收费贵,适合大型机构用户,个人就不建议了。
三、如何选期货 API?这 4 个维度别踩坑
选 API 不是看哪个名气大,而是看自己的需求,分享我总结的 4 个核心判断维度,亲测实用:
1. 先明确用途:交易还是数据分析?
如果是实盘交易,优先选经纪商自带的 API(比如盈透、富途),避免用“数据 API+第三方交易 API”的组合,中间衔接容易出问题,还可能有安全风险;如果只是做回测或策略联动(比如连 TradingView),选 Quandl、iTick 这类纯数据 API 就行,性价比高。
2. 看品种覆盖:有没有你要交易的期货?
比如你想做恒生指数期货,就要确认 API 是否覆盖港交所的品种;想做美原油期货,就要覆盖纽约商品交易所的品种。很多 API 会明确标注支持的交易所,选之前一定要查清楚,别等接入了才发现没自己要的品种。
3. 关注成本:手续费和 API 费用都要算
有些 API 看似免费,实则藏在手续费里——比如部分经纪商的 API,每笔交易的手续费会比手动交易高一点;还有些数据 API,免费额度用完后收费很贵。建议先算清楚“每月预计用量”,再对比不同 API 的收费模式,避免后期超预算。
4. 易用性和稳定性:新手优先选中文文档
新手别上来就挑战盈透的 API(配置复杂),可以先从富途的 API 入手,中文文档看得懂,还有完善的社区支持,遇到问题容易解决。另外,稳定性很重要——实盘交易时 API 卡顿或断开,可能会导致巨大损失,选之前可以查下服务商的口碑,有没有频繁宕机的情况。
四、Python 代码接入示例:策略与 TradingView 图表联动(新手友好)
最后是实操部分,用 Python 实现“获取期货数据+策略信号生成+联动 TradingView 图表”,步骤超详细,新手也能跟着做。核心逻辑是:用 API 拿行情数据,本地跑策略生成信号,再把信号推到 TradingView 可视化展示。
1. 前期准备:API 权限与 TradingView 配置
- 数据 API 准备:注册 iTick 账号(官网直接注册),进入控制台就可以查看 API Key(免费版足够测试);
- TradingView 配置:登录 TradingView,创建自定义图表(比如选美原油期货合约),开启 Webhook 功能(用于接收 Python 推送的策略信号),记录 Webhook URL;
- 环境准备:确保本地安装 Python3.7+,后续需安装相关依赖库。
2. 安装依赖库
需要安装requests(推信号到 TradingView)、pandas(数据处理),直接用 pip 安装就行:
pip install requests==2.31.0
pip install pandas==2.1.4
pip install python-dotenv # 用于管理API Key和Webhook URL
3. 代码实现:获取数据+生成策略信号+联动图表
下面的代码包含三个核心功能:
- 1. 通过 iTick 期货 API 获取美原油期货历史+实时行情数据;
- 2. 用简单的均线交叉策略生成买卖信号;
- 3. 将信号推送到 TradingView,实现策略与图表联动。
注意把代码里的 API Key 和 Webhook URL 换成自己的。
from datetime import datetime, timedelta
import pandas as pd
import requests
import os
from dotenv import load_dotenv
# 加载密钥和URL(避免硬编码,更安全)
load_dotenv()
ITICK_TOKEN = os.getenv('ITICK_TOKEN') # iTick API的token
TRADINGVIEW_WEBHOOK_URL = os.getenv('TRADINGVIEW_WEBHOOK_URL')
# 定义API headers
headers = {
"accept": "application/json",
"token": ITICK_TOKEN
}
# 1. 获取美原油期货数据(合约代码:CL,地区:US)
# ① 获取历史日线数据(近1年数据,limit=365覆盖约1年)
url_history = "https://api.itick.org/future/kline?region=US&code=CL&kType=8&limit=365"
response_history = requests.get(url_history, headers=headers)
history_data = response_history.json().get('data', [])
# 转换为DataFrame,只保留核心字段(假设数据从新到旧,需要反转排序为旧到新)
history_data.reverse() # 确保从旧到新排序,便于rolling计算
df_history = pd.DataFrame(history_data)
df_history = df_history[['t', 'o', 'h', 'l', 'c', 'v']]
df_history.rename(columns={'t': 'date', 'o': 'open', 'h': 'high', 'l': 'low', 'c': 'close', 'v': 'volume'}, inplace=True)
df_history['date'] = pd.to_datetime(df_history['date'], unit='ms') # 时间戳转换为datetime
df_history.set_index('date', inplace=True)
print("美原油期货历史日线数据(最后5行):")
print(df_history.tail())
# ② 获取实时行情(使用实时报价API)
url_realtime = "https://api.itick.org/future/quote?region=US&code=CL"
response_realtime = requests.get(url_realtime, headers=headers)
realtime_data = response_realtime.json().get('data', {})
latest_close = realtime_data.get('ld') # ld 为最新价,作为close
latest_date = datetime.fromtimestamp(realtime_data.get('t', 0) / 1000).strftime('%Y-%m-%d') # 从时间戳获取日期
print(f"\n美原油期货实时价格:{latest_close}({latest_date})")
# 合并历史数据和实时数据(用于策略计算)
df_strategy = df_history.copy()
# 若当天数据未更新,补充实时数据(使用实时数据的OHLCV,注意实时API的ld为close,o/h/l/v可用)
if latest_date not in df_strategy.index.strftime('%Y-%m-%d'):
new_row = pd.DataFrame({
'open': [realtime_data.get('o')],
'high': [realtime_data.get('h')],
'low': [realtime_data.get('l')],
'close': [latest_close],
'volume': [realtime_data.get('v')]
}, index=[pd.to_datetime(latest_date)])
df_strategy = pd.concat([df_strategy, new_row])
# 2. 简单均线交叉策略:生成买卖信号
# 计算5日均线和20日均线
df_strategy['MA5'] = df_strategy['close'].rolling(window=5).mean()
df_strategy['MA20'] = df_strategy['close'].rolling(window=20).mean()
# 生成信号:5日均线上穿20日均线为买入(1),下穿为卖出(-1),无信号为0
df_strategy['Signal'] = 0
df_strategy.loc[df_strategy['MA5'] > df_strategy['MA20'], 'Signal'] = 1
df_strategy.loc[df_strategy['MA5'] < df_strategy['MA20'], 'Signal'] = -1
# 去除均线计算初期的NaN值
df_strategy = df_strategy.dropna()
print("\n带均线和策略信号的数据(最后5行):")
print(df_strategy[['close', 'MA5', 'MA20', 'Signal']].tail())
# 3. 提取最新策略信号,推送到TradingView
latest_signal = df_strategy['Signal'].iloc[-1]
signal_date = df_strategy.index[-1].strftime('%Y-%m-%d')
# 构造信号数据(符合TradingView Webhook接收格式)
signal_data = {
"symbol": "CME/CL", # TradingView可识别的美原油期货标识
"date": signal_date,
"signal": "BUY" if latest_signal == 1 else "SELL" if latest_signal == -1 else "HOLD",
"close_price": round(df_strategy['close'].iloc[-1], 2),
"MA5": round(df_strategy['MA5'].iloc[-1], 2),
"MA20": round(df_strategy['MA20'].iloc[-1], 2),
"realtime_flag": "是" if signal_date == latest_date else "否"
}
# 发送POST请求到TradingView Webhook
try:
response = requests.post(
url=TRADINGVIEW_WEBHOOK_URL,
json=signal_data,
headers={"Content-Type": "application/json"}
)
if response.status_code == 200:
print(f"\n信号推送成功!最新信号:{signal_data['signal']}({signal_data['date']},实时数据:{signal_data['realtime_flag']})")
else:
print(f"\n信号推送失败,状态码:{response.status_code},响应内容:{response.text}")
except Exception as e:
print(f"\n信号推送异常:{str(e)}")
# 4. 可选:本地保存数据,方便后续复盘
df_strategy.to_csv('crude_oil_strategy_data_itick.csv')
print("\n策略数据已保存到 crude_oil_strategy_data_itick.csv 文件")
4. 关键说明
- 数据标识:iTick 对期货品种有统一简化标识,比如美原油用“CL”、恒生指数用“HSI”,具体品种代码可在 iTick 官网查询;
- 策略逻辑:这里用的是简单的 5 日/20 日均线交叉策略,你可以替换成自己的策略(比如 MACD、RSI 策略),只需修改“生成信号”部分的代码;
- TradingView 联动:推送的信号会显示在 TradingView 图表上,可在图表中添加“警报”,当收到 BUY/SELL 信号时自动提醒;
- 免费额度:iTick 免费版每日实时数据请求数量足够个人测试,超出后可升级付费版。
五、最后总结
港美期货API接入真没那么复杂,核心就是“选对工具+找对方法”。想交易就选盈透、富途这类经纪商API,想做策略联动TradingView,直接用iTick拿数据就行,跟着文中的代码改改参数就能跑通。
希望我的经验能帮你少走点弯路。有啥问题评论区聊,我尽量回答。祝大家都能快速搞定API,躺着看TradingView自动出策略信号!
温馨提示:本文仅供代码参考,不构成任何投资建议。市场有风险,投资需谨慎
参考文档:https://docs.itick.org/rest-api/future/future-kline
GitHub:https://github.com/itick-org/
Top comments (0)