企业微信

东方财富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代表周线。日期范围使用 StartDateEndDate

东方财富Choice API如何获取股票期货实时行情数据

获取多只股票历史数据可传入列表:


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生态可快速搭建从数据获取到信号执行的完整链路。