东方财富Choice API如何获取股票期货实时行情数据
摘要:
东方财富Choice API提供股票期货实时行情、历史数据与基本面信息,通过Python调用可构建量化策略。掌握接口权限、数据频率与字段定义是关键。

东方财富Choice API 数据获取基础
东方财富Choice数据终端提供了一套面向量化投资者的API接口,支持股票、期货、期权、基金等金融品种的实时行情、历史K线、财务指标、宏观数据等。使用前需要安装Choice数据终端并登录,同时安装Python的EmQuantAPI包。该接口以函数调用形式返回结构化数据,适合策略回测与实盘信号生成。
安装与初始化
在命令行执行 pip install EmQuantAPI 完成安装。初始化时需指定用户名与密码,或使用终端已登录的会话。以下代码演示连接与获取股票实时行情:
from EmQuantAPI import c
# 登录,若终端已登录可省略
login_result = c.start()
print(login_result)
# 获取股票实时行情,代码格式如 600000.SH
stock_data = c.css('600000.SH', 'Open,High,Low,Close,Volume', 'TradeDate=2025-03-28,period=1')
print(stock_data)
返回数据包含指定字段的DataFrame,字段名与请求一致。期货合约代码格式如 IF2506.CFE,获取实时行情使用 c.csq('IF2506.CFE', 'Open,High,Low,Close,Volume,OpenInterest')。
股票数据获取要点
东方财富Choice API 对股票数据的覆盖包括A股、港股、美股。实时行情通过 css 函数获取,历史K线通过 csd 函数。参数中需指定周期(period),1代表1分钟,5代表5分钟,100代表日线,200代表周线。日期范围使用 StartDate 与 EndDate。

获取多只股票历史数据可传入列表:
codes = ['600000.SH', '000001.SZ', '300750.SZ']
hist = c.csd(codes, 'Close,Volume', '2025-01-01', '2025-03-28', 'period=100,adjustflag=1')
adjustflag=1 表示前复权,2为后复权,3为不复权。返回结构为字典,每只股票对应一个DataFrame。处理缺失值时,需检查返回状态码,状态码0表示成功。
财务数据通过 c.cfn 获取,如 c.cfn('600000.SH', 'ROE,NetProfit', '2024-12-31')。注意财务数据存在报告期与公告期差异,回测时需使用公告日期避免未来函数。
期货数据获取策略
期货数据包括商品期货与金融期货。实时行情使用 csq,历史行情使用 csd。合约代码需带交易所后缀:中金所.CFE,上期所.SHF,大商所.DCE,郑商所.CZC,能源中心.INE。
# 获取螺纹钢主力合约历史日线
rb_hist = c.csd('RB2505.SHF', 'Open,High,Low,Close,Volume,OpenInterest', '2024-12-01', '2025-03-28', 'period=100')
# 获取期货实时行情
rb_real = c.csq('RB2505.SHF', 'Last,Open,High,Low,Volume,OpenInterest')
期货数据需注意主力合约切换。Choice API 提供 c.csq 获取当前主力合约代码,但主力换月规则依赖交易所。量化策略中建议自行维护主力合约映射表,或使用连续合约代码如 RBL.SHF(螺纹钢连续)。连续合约存在价格跳空,处理方式包括后复权或价差调整。
持仓量(OpenInterest)是期货关键指标,用于判断资金流向。成交量和持仓量同时增加表明趋势延续,价格上升但持仓量下降可能预示反转。
量化交易中的API应用
构建股票多头策略时,通过API获取日线数据计算动量因子。以下示例计算20日收益率并排序:
import pandas as pd
codes = ['600000.SH', '000001.SZ', '600519.SH', '000858.SZ']
data = c.csd(codes, 'Close', '2025-02-01', '2025-03-28', 'period=100')
momentum = {}
for code in codes:
df = data[code]
if len(df) >= 20:
ret = df['Close'].iloc[-1] / df['Close'].iloc[-20] - 1
momentum[code] = ret
sorted_momentum = sorted(momentum.items(), key=lambda x: x[1], reverse=True)
print(sorted_momentum)
期货策略可结合跨期价差。获取近月与远月合约价格:
near = c.csd('RB2505.SHF', 'Close', '2025-03-01', '2025-03-28', 'period=100')
far = c.csd('RB2510.SHF', 'Close', '2025-03-01', '2025-03-28', 'period=100')
spread = near['RB2505.SHF']['Close'] - far['RB2510.SHF']['Close']
print(spread.tail())
价差均值回归策略监控价差Z-Score,超过阈值开仓。API支持批量请求,减少网络延迟。高频策略需使用实时行情推送,Choice API 提供 c.csq 轮询,但非真正推送,延迟约1-3秒,不适合tick级交易。
接口权限与数据频率限制
Choice API 的权限分为基础版、专业版、机构版。基础版仅提供日线历史与延时15分钟实时行情,专业版提供实时level-1行情,机构版提供level-2。频率限制体现在每秒请求次数与单次返回数据量。超出限制会返回错误码,需增加sleep或使用批量接口。
股票实时行情最小频率为3秒,期货为1秒。历史数据单次最多返回10000条记录。若需更长时间序列,需分页请求。使用 c.csd 时设置 period=100 且日期跨度大,返回条数可能超出限制,应拆分日期区间。
错误处理示例:
result = c.csq('600000.SH', 'Last')
if result.ErrorCode != 0:
print(f'请求失败: {result.ErrorMsg}')
# 重试或等待
API 返回对象包含 ErrorCode 与 ErrorMsg,务必检查。常见错误包括未登录、代码格式错误、权限不足。
数据存储与回测整合
获取的数据可存入SQLite或HDF5。以下代码将股票日线写入SQLite:
import sqlite3
df = c.csd('600000.SH', 'Open,High,Low,Close,Volume', '2025-01-01', '2025-03-28', 'period=100')['600000.SH']
conn = sqlite3.connect('market.db')
df.to_sql('600000_SH', conn, if_exists='replace', index=False)
conn.close()
回测框架如Backtrader或Zipline可从数据库读取数据。期货数据需存储合约乘数、保证金率等元数据,这些可通过 c.cfn 获取,如 c.cfn('RB2505.SHF', 'ContractMultiplier,MarginRate')。
跨品种套利需要同步获取多个期货合约。使用 c.csq 传入列表:
codes = ['RB2505.SHF', 'HC2505.SHF', 'I2505.DCE']
realtime = c.csq(codes, 'Last,Volume,OpenInterest')
for code in codes:
print(code, realtime[code])
注意返回顺序与请求顺序一致。若某个合约无行情,对应DataFrame为空,需过滤。
常见问题与优化建议
股票代码后缀易错,上海为.SH,深圳为.SZ,北京为.BJ。期货代码需确认交易所,郑商所后缀为.CZC,不是.CZ。获取指数数据使用 c.csd('000300.SH', ...),指数代码与股票相同。
性能优化:批量请求减少调用次数,使用多线程时注意API并发限制。历史数据可缓存到本地,避免重复请求。实时行情轮询间隔根据策略频率设定,分钟级策略可每10秒获取一次。
数据对齐:股票与期货交易日历不同,期货有夜盘,股票无。跨品种策略需对齐时间戳,使用pandas的reindex或merge_asof。夜盘数据归属下一交易日,Choice API 返回的TradeDate为自然日,处理时需调整。
量化交易中,数据质量决定策略上限。东方财富Choice API 提供稳定数据源,结合Python生态可快速搭建从数据获取到信号执行的完整链路。
声明
转载声明:欢迎分享本文,转载请注明出处!
点击复制: