企业微信

很多人手里有量化策略,跑回测的时候收益曲线很漂亮,一到实盘就抓瞎。问题往往出在券商接口上。中信证券作为国内头部券商,它的实盘API不是随便就能用的,这篇文章就把从开户到下单的完整路径拆开讲清楚。

中信证券实盘API的准入门槛

个人客户想直接用API对接中信证券,前提是开通量化交易权限。这个权限不是默认给的,需要向营业部申请。多数营业部的要求是资产规模达到50万以上,部分甚至要求100万。机构客户走专用通道,门槛更高但接口能力更强。

中信证券官方提供的接口叫“中信证券量化交易平台”,底层基于C++开发,对外提供Python、C#、Java等语言的封装库。散户最常用的是Python版本,因为策略开发社区大,调试方便。

申请流程分三步。第一步,联系你的客户经理,说明要做量化交易,申请开通“程序化交易报备”。第二步,签署风险揭示书和程序化交易协议。第三步,营业部审核通过后,会给你一个API接入账号和密码,以及一份接口文档。注意,这个账号和你的普通交易账号是分开的。

普通人怎么用API接口对接中信证券做实盘交易

接口文档里的核心函数

拿到文档后,你不需要从头啃几百页。实盘对接真正用到的函数就下面这几个:

  • 连接函数:初始化API,传入账号、密码、服务器地址。中信证券的服务器地址分生产环境和仿真环境,仿真环境用于测试。

  • 委托函数:下单的核心。参数包括股票代码、买卖方向、价格、数量。中信证券的接口要求价格和数量都是整数,价格单位是分,数量单位是股。

  • 撤单函数:传入委托编号,撤销未成交的订单。

  • 查询函数:查资金、查持仓、查当日委托、查当日成交。

  • 回调函数:当订单状态变化时,API会主动推送消息给你。你需要重写这个函数来处理成交回报。

这里要特别注意:中信证券的API不是标准的RESTful接口,它是基于socket的长连接。这意味着你的程序必须保持在线,断线后需要重连。很多新手策略跑着跑着不动了,就是socket断了没重连。

用Python写一个最小实盘下单脚本

下面这段代码演示了连接、下单、查询的基本流程。代码不能直接运行,你得把账号、密码、服务器地址替换成中信证券给你的真实信息。


import time

from citic_quant import TraderApi

class MyTrader(TraderApi):

    def on_order(self, order):

        print('订单更新:', order)

    def on_trade(self, trade):

        print('成交回报:', trade)

api = MyTrader()

api.login('你的账号', '你的密码', 'tcp://生产服务器地址:端口')

# 下单:买入 600030 中信证券 100股 价格 20.00元

order_id = api.insert_order(

    symbol='600030',

    side='buy',

    price=2000,  # 单位是分

    volume=100

)

print('委托编号:', order_id)

# 查资金

account = api.query_account()

print('可用资金:', account['available'])

# 查持仓

positions = api.query_positions()

for pos in positions:

    print(pos['symbol'], pos['volume'], pos['cost'])

# 保持连接

while True:

    time.sleep(1)

这段代码里最关键的细节是价格单位。中信证券的接口用“分”作为价格单位,20.00元要写成2000。数量单位是“股”,不是“手”。如果你写成20.00,接口会报错。很多新手卡在这一步,以为是权限问题,其实只是单位错了。

期货API对接的差异

中信证券旗下有中信期货,期货实盘API的对接逻辑和股票类似,但有几个不同点。

期货接口支持双向交易,所以委托函数里需要指定开平方向。开仓、平仓、平今、平昨是四个不同的指令。股票没有这个概念。

期货的保证金制度意味着你的可用资金会被占用。下单前必须用查询函数确认保证金充足,否则会被拒绝。股票是全额交易,只要钱够就行。

期货有夜盘,API的服务器时间需要对齐。如果你的策略在夜盘运行,注意交易所的交易日划分和自然日不同。比如晚上21点的单子属于第二个交易日。

实盘前必须做的三件事

第一,用仿真环境跑通全流程。中信证券提供仿真服务器,行情是真实的,但资金是虚拟的。把你的策略在仿真环境跑至少一周,确认下单、撤单、成交回报都正常。

第二,处理异常情况。网络断了怎么办?订单被拒绝怎么办?部分成交怎么办?这些在仿真环境里都要模拟一遍。你的代码里必须有重连机制和错误重试逻辑。

第三,控制单笔报单量。交易所对程序化交易有报单频率限制。中信证券的接口也有流控,每秒最多报多少笔。超过限制会被封禁。建议单笔报单不超过10万股,每秒不超过5笔。

实盘对接不是一劳永逸的事。中信证券的接口版本会更新,交易所的规则会调整。你的代码需要定期维护。最稳妥的做法是把交易逻辑和接口调用分离,接口层封装成独立模块,这样接口变了只需要改一个地方。