背景:穿透式监管是中国证监会为强化市场风险防控、保护投资者权益而实施的一项重要监管机制。其核心是通过技术手段采集交易终端的底层信息,实现对交易行为的透明化监控。
一句话总结下就是:监控中心为了方便监管,需采集所有通过期货公司入场交易的客户的本地终端信息。
详细背景可以参考证监会《关于进一步加强期货经营机构客户交易终端信息采集有关事项的公告》及期货市场监控中心《期货公司客户交易终端信息采集及接入认证技术规范》这两篇公告。
以下是详细说明及投资者需注意的事项:
一、穿透式监管的定义与目的
-
定义
穿透式监管要求期货公司通过交易系统接口(如CTP API)采集投资者交易终端的硬件和软件信息,包括但不限于IP地址、MAC地址、操作系统版本、硬盘序列号等,并将这些信息加密后报送至期货市场监控中心,确保监管部门能够“穿透”多层交易结构,直接掌握交易主体的真实信息。 -
监管目标
- 防范风险:识别异常交易行为(如高频交易、对敲操纵等),防止市场操纵和系统性风险。
- 保护投资者:通过实名制管理和大数据分析,维护中小投资者合法权益。
- 合规性:确保交易终端软件合法合规,避免非法接入或未经备案的交易行为。
二、穿透式监管的技术实现
-
数据采集范围
包括终端设备的硬件标识(如MAC地址)、操作系统信息、网络环境等,但不涉及用户文件内容扫描。 -
加密与隐私保护
采集的信息通过监控中心下发的公钥加密,仅监控中心可通过私钥解密,期货公司、交易所等中间环节无法查看明文。 -
监管版本要求
- CTP API必须使用穿透式监管兼容的版本(如生产版6.3.15及以上),旧版本(如6.3.11及以前)无法连接升级后的交易系统。
- 若使用错误版本,可能导致无法触发
OnFrontConnected
回调,需通过期货公司获取最新API。
三、投资者需配合的事项
1. 使用第三方交易软件的投资者
- 无需额外操作:如直接使用快期、博易等已备案的软件,厂商已内置合规采集功能。这些是什么都不需要做的,因为第三方厂商已经向期货公司报备APPID,在软件内部逻辑已经写好。
2. 自研程序化交易系统的投资者(直连模式)
使用CTP API自开发交易程序的直连投资者,其实很简单,一句话就是,在ReqUserLogin之前需要先调用ReqAuthenticate。下面详细讲一下步骤。
自己查看开户期货公司官网,或者联系对应的经纪经理,申请认证码。通常来说会让你填一张表,表中有需要填写客户号例如:000001、软件名称 例如:**量化系统、APPID例如:abcdef_ghijkl_1.6.0、连接方式例如直连类型终端等信息。
注意:
客户号就是你的交易账号
APPID是你自己命名的,命名监控中心给出了规范,如下图:
给出几个范例:
个人开发终端:client_xxx_1.0.0
第三方终端:xxx_xx_1.4.0.0
中继厂商:xxxAPP_isssle_2.0.0.0
申请通过后,期货公司就会发送Authcode给投资者。
- 申请认证码(AuthCode)
需向期货公司提交以下信息申请唯一授权码:- AppID:按规范命名(如
client_软件名_版本号
),用于标识终端软件。 - 客户号:交易账号。
- 软件名称及版本:需符合监控中心格式要求。
- AppID:按规范命名(如
- 修改登录逻辑
在代码中增加认证流程:- 连接交易系统后,先调用
ReqAuthenticate()
函数,提交AppID和AuthCode。 - 认证通过后,再发起
ReqUserLogin()
登录请求。
- 连接交易系统后,先调用
step1:在API连接后发起认证
// 示例代码(C++)
void CUser::OnFrontConnected()
{
cout << "OnFrontConnected." << endl;
static const char *version = m_pUserApi->GetApiVersion();
cout << "------当前版本号 :" << version << " ------" << endl;
ReqAuthenticate(); // 先认证
}
int CUser::ReqAuthenticate()
{
CThostFtdcReqAuthenticateField field;
memset(&field, 0, sizeof(field));
strcpy(field.BrokerID, "8000");
strcpy(field.UserID, "001888");
strcpy(field.AppID, "XY_Q7_V1.0.0");
strcpy(field.AuthCode, "5A5P4V7AZ5LCFEAK");
return m_pUserApi->ReqAuthenticate(&field, 5);
}
注意:
AppID就是客户申请时自己命名的,AuthCode是期货公司发给客户,两者是一一对应的。其实ReqAuthenticate函数早就有了,但以前是通过UserProductInfo和AuthCode这两个字段绑定验证,现在UserProductInfo废弃不用,改为AppID了,填写时注意不要出错。
step2:认证成功后发起登录
void CUser::OnRspAuthenticate(CThostFtdcRspAuthenticateField *pRspAuthenticateField, CThostFtdcRspInfoField *pRspInfo, int nRequestID, bool bIsLast)
{
printf("OnRspAuthenticate\n");
if (pRspInfo != NULL && pRspInfo->ErrorID == 0)
{
printf("认证成功,ErrorID=0x%04x, ErrMsg=%s\n\n", pRspInfo->ErrorID, pRspInfo->ErrorMsg);
ReqUserLogin();
}
else
{
cout << "认证失败," << "ErrorID=" << pRspInfo->ErrorID << " ,ErrMsg=" << pRspInfo->ErrorMsg << endl;
}
}
int CUser::ReqUserLogin()
{
printf("====ReqUserLogin====,用户登录中...\n\n");
CThostFtdcReqUserLoginField reqUserLogin;
memset(&reqUserLogin, 0, sizeof(reqUserLogin));
strcpy(reqUserLogin.BrokerID, "8000");
strcpy(reqUserLogin.UserID, "001888");
strcpy(reqUserLogin.Password, "1");
return m_pUserApi->ReqUserLogin(&reqUserLogin, ++RequestID);
}
然后就可以在OnRspUserLogin看是否登录成功了。
3. 使用中继模式的投资者
- 由第三方服务商负责信息采集与上报(如通过
DataCollect.h
接口),投资者需确保服务商合规。 - 这种主要是第三方软件厂商的工作。而且如果是程序化客户,投资者使用的是不同的第三方厂商提供API,用法也不一致,这里就不细说了。总之,第三方厂商提供的API会用到CTP API包中的DataCollect.h中的函数来采集客户端信息,再在服务器上注册提交给CTP柜台。
四、违规风险与合规建议
-
违规后果
- 使用未授权API版本或泄露AuthCode可能导致交易中断,甚至面临监管处罚(如上海韦纳因公开授权码被查处)。
- 高频交易需遵守特定报备规则,禁止通过手续费减免等方式变相鼓励投机。
-
合规建议
- 定期更新API:跟踪期货公司通知,及时升级至穿透式监管兼容版本。
- 严格管理授权码:避免公开或共享AuthCode,防止非法接入。
- 测试环境验证:通过SimNow或期货公司提供的仿真系统(如东吴期货仿真环境)测试策略合规性。
五、穿透式监管的未来发展
根据2024年国务院发布的《关于加强监管防范风险促进期货市场高质量发展的意见》,穿透式监管将进一步强化,包括:
- 全流程监控:从账户开立到交易行为,实现“一看到底”的持续监管。
- 技术升级:推动数字化、智能化风险预警系统,加强对高频交易的动态监测。
六、相关术语
直连模式
是指客户直接连到期货公司的柜台进行交易。投资者直接用CTP的API开发交易程序,连到期货公司的CTP系统交易,这就是典型的直连模式。也就是说,市场上大多数程序化交易投资者,直接使用柜台提供的API交易的,都是属于这种直连模式。另外像快期这种终端,也是直接连到CTP交易,所以也属于直连模式。
中继模式
是指客户通过第三方软件,向期货公司CTP系统报单交易,这时客户在第三方软件上下单,首先订单是到了第三方软件厂商的服务器,然后第三方软件厂商再调用CTP系统的API,将这笔订单发往CTP系统。这第三方软件厂商便称之为中继。
多对多中继模式
第三方软件厂商服务器为每个投资者都调用CTP API创建与CTP之间的单独的链接就是多对多的中继模式。例如文华财经的云条件单的功能,其实是将投资者的订单保存到了文华的云服务器上,投资者虽然退出文华终端,但文华服务器与CTP的链接仍然在,所以条件达到就可以把订单发送到CTP。
多对一中继模式
第三方软件厂商只创建一个与CTP之间的链接,用这个链接为所有投资者报单,这就是多对一模式。这种情况下需要第三方软件商以交易员用户登录CTP系统,而且只能为该交易员底下的投资者报单。这种模式多是用于期货公司内部软件和境外中介。
七、常见问题
1. API包中多了的DataCollect.h和LinuxDataCollect.so有什么用?
参见上文3.3,是转为中继模式准备的。同样API头文件中新增的两个函数RegisterUserSystemInfo和SubmitUserSystemInfo也是为中继准备的,一般程序化客户都用不到。
2. 是否必须要更新为穿透式版本?
答案是必须。不同于之前的CTP API版本都是向后兼容,后期CTP柜台升级为穿透式版本后,以前所有的API将都不能使用,只能使用最新的6.3.15版本API才能登陆上。根据目前消息,2019年6月14日(含)之后,所有的客户都必须使用6.3.15版本才可以登陆上,否则只能去期货公司页面下载最新软件手动下单了。
3. OnFrontConnected没有回调怎么办?
为了强制客户使用最新的穿透式API,如果客户使用API版本与CTP柜台不一致,将不会回调OnFrontConnected。目前一共有三类CTP API:旧生产版(6.3.11_20180109及以前);穿透式评测版(6.3.13_20181119和6.3.16_T1_20190508,这两个版本都可以用来评测);穿透式生产版(6.3.15_20190220)。这三个版本需要配合不同的CTP柜台才能登录上,也就是说一个前置IP地址,你能用某个登录上,就不可能用另外两个登录上。客户无法从API得知连接到的CTP后台前置是什么版本,所以只能用这三个版本的API自己测试得知。现在为止simnow的模拟最新地址:
BrokerID统一为:9999
标准CTP:
第一组:Trade Front:180.168.146.187:10100, Market Front:180.168.146.187:10110;
第二组:Trade Front:180.168.146.187:10101, Market Front:180.168.146.187:10111;
用户注册后,默认的APPID为simnow_client_test,认证码为0000000000000000(16个0),默认不开终端认证,如需测试终端认证可联系SIMNOW客服或注册“终端厂商测试”,参见《公告:SIMNOW对外前置网络调整》。
同时simnow也提供了穿透式评测版后台供测试,参见《公告:SIMNOW平台将开启终端厂商穿透测试环境》,这个提供的地址
BrokerID:9999
Trade Front: 180.168.146.187:13030
Market Front: 180.168.146.187:13040
至于实盘穿透式生产版,请各位联系期货公司获取相应地址测试。
总结
穿透式监管通过技术手段提升期货市场的透明度和安全性,投资者需根据自身交易方式(直连或中继)配合完成认证流程,并严格遵守版本和授权码管理要求。自研程序化交易系统的开发者应重点关注API版本兼容性及认证逻辑的代码实现,避免因技术疏漏导致交易中断或合规风险。