股票L1与L2行情数据对比
由于Level 1 成交数据是3秒刷新一次,期间的所有成交数据是汇总显示的,而Level 2 的成交数据是主动推送的,毫秒级的变动频率,因此可看清每一笔成交情况,与Level 1 行情的成交情况差异巨大!
首先,L2是level-2产品,是上海证券交易所推出的实时报价信息收费服务,主要提供在上海证券交易所上市交易的证券产品的实时交易数据。包括各种新数据,如十档行情、买卖队列、逐笔交易、委托总额、加权价格等。
使用level-2软件的投资者可以在开盘时间内随时看到交易商和散户投资者买卖股票。L2报价接口是指通过接口功能直接获取报价数据,利用数据制定股票交易策略。
L2行情接口优点在哪里?
回到正题,L2行情接口有什么优势?一般来说,L2市场接口实际上是股票量化交易的工具之一。一般投资者最多只能看到10个交易市场,但只有这么少的数据,我们很难做出交易决策。我们必须获得更多的数据来做出更准确的判断,L2市场接口可以帮助我们。换句话说,L2数据市场接口是帮助我们更好地完成股票交易的工具。
说了这么多,相信大家对股票L2行情市场接口都有一定的了解。如果我们再深入一点,Level2接口会根据不同的编程方法例如:(C# python示例代码 数据缓存 量化分析 股票行情接口SDK 股票行情技术支持 接口源代码等)适用的人也不会一样。如果你感兴趣,以后再详细解释。让我们先消化一下。如果你不明白,你也可以和我谈谈。
仔细想想你就知道了 ,其实level2说白了就是十档行情,别人可以看到买5~卖5之间的挂单情况,而你如果买了这个产品,你就能看到买10~卖10之间的挂单。
当然,实际的情况要复杂一些,除了股票还有债券,指数等行情,行情也不是一定3秒一个快照,有些证券行情变化少,记录数会少一些。这里只是定量的分析。
简单地说,高频策略交易不是凭空而来的,需要通过历史高频数据进行回测,计算按照这些规则交易是否真的能赚钱。那些能一直赚钱的人是好策略。通过回测数据找到好策略后,就可以编写软件,放在之前的高频策略中进行实盘,但实盘的情况可能和回测结果有很大的不同。
有两种可能:一种是策略本身有问题,另一种是交易速度不够快。别人可能有和你一样的策略,但是别人的网络和程序更快,即使是0.001毫秒,就可以拿走你的单。
Level2是一个高级数据市场,可以看到更多的交易细节信息。L2的市场也集成在NiceMoney的系统中,这样人工智能AI会更聪明!Level-2由上海证券交易所和深圳证券交易所共同推出的实时市场信息收费服务。
与普通市场相比evel-1)相比,这个市场具有数据更完整、推送速度更及时的优势,帮助投资者及时把握盘中主要资金流,做出更准确的投资决策。简而言之,Level-2最大的作用就是提前看到主力的大单,追涨停板,对于追逐日线跌停非常有用。
L2市场数据非常有用。我们一直被用作交易系统的基本数据。我们有level2数据,里面有一个统计分析工具,可以看到大单小单和主动趋势。
所以我认为level2行情数据,是值得买的。
以下就是我这边的L2行情数据代码示例:
# -*- coding: utf-8 -*-
# 此Demo只是演示接入过程
import grpc
import entity_pb2
import proxy_pb2_grpc
import threading
from multiprocessing import Process
# 代理服务器监听的地址和端口
ServerConnect = grpc.insecure_channel('localhost:5000')
Stub = proxy_pb2_grpc.ProxyStub(ServerConnect)
# 查询订阅
def get_subscription():
# rep返回code为1代表成功,其余状态码可参考接入文档,data是返回订阅股票的情况
Result = Stub.GetSubscription(entity_pb2.Void())
print(Result)
# 新增订阅
def add_subscription():
# 实例ProtoBuf协议的方法
String = entity_pb2.String()
# 修改协议的值
# 2:市场代码标识(1为上海证券,2为深圳证券)
# 000002:股票代码
# 15:订阅全部标识(1为逐笔成交,2为逐笔委托,4为委托队列,8为股票十档行情,如果想全部订阅可直接填入15,原理是1+2+4+8,如果想订阅某几个行情将几个行情标识相加即可)
String.value = '2_000002_15'
# String.value = '2_000001_15,2_000002_5,2_000003_12,批量订阅'
# rep返回code为1代表成功,其余状态码可参考接入文档
Result = Stub.AddSubscription(String)
print(Result)
# 取消订阅
def del_subscription():
# 实例ProtoBuf协议的方法
String = entity_pb2.String()
# 修改协议的值
# 2:市场代码标识(1为上海证券,2为深圳证券)
# 000002:股票代码
# 15:取消全部标识(1为逐笔成交,2为逐笔委托,4为委托队列,8为股票十档行情,如果想全部取消可直接填入15,原理是1+2+4+8,如果想取消某几个行情将几个行情标识相加即可)
String.value = '2_000002_15'
# String.value = '2_000001_15,2_000002_5,2_000003_12,批量取消'
# rep返回code为1代表成功,其余状态码可参考接入文档
Result = Stub.DelSubscription(String)
print(Result)
# 推送逐笔成交行情数据
def tick_record_stream():
StreamResult = Stub.NewTickRecordStream(entity_pb2.Void())
# 用For循环就可以不断消费数据
for Result in StreamResult:
print(Result)
# 推送逐笔委托行情数据
def order_record_stream():
StreamResult = Stub.NewOrderRecordStream(entity_pb2.Void())
# 用For循环就可以不断消费数据
for Result in StreamResult:
print(Result)
# 推送委托队列行情数据
def order_queue_record_stream():
StreamResult = Stub.NewOrderQueueRecordStream(entity_pb2.Void())
# 用For循环就可以不断消费数据
for Result in StreamResult:
print(Result)
# 推送股票十档行情行情数据
def stock_quote_record_stream():
StreamResult = Stub.NewStockQuoteRecordStream(entity_pb2.Void())
# 用For循环就可以不断消费数据
for Result in StreamResult:
print(Result)
if __name__ == '__main__':
# 可以使用多线程并发接收推送数据
ThreadOne = threading.Thread(target=tick_record_stream)
ThreadTwo = threading.Thread(target=order_record_stream)
ThreadThree = threading.Thread(target=order_queue_record_stream)
ThreadFour = threading.Thread(target=stock_quote_record_stream)
# 多进程并发接收推送数据
# ProcessOne = Process(target=tick_record_stream)
# ProcessTwo = Process(target=order_record_stream)
# ProcessThree = Process(target=order_queue_record_stream)
# ProcessFour = Process(target=stock_quote_record_stream)
# 这设置为随主线程退出子线程,避免产生孤儿或僵尸线程
ThreadOne.daemon = True
ThreadTwo.daemon = True
ThreadThree.daemon = True
ThreadFour.daemon = True
# ProcessOne.daemon = True
# ProcessTwo.daemon = True
# ProcessThree.daemon = True
# ProcessFour.daemon = True
# 有一点值得注意一下,假如订阅的股票相对活跃,推送的数据就不会有休眠的状态出现,因为Python的GIL锁,所以用多线程接收推送效率不显著,这个时候可以考虑用多进程来接收推送
ThreadOne.start()
ThreadTwo.start()
ThreadThree.start()
ThreadFour.start()
# ProcessOne.start()
# ProcessTwo.start()
# ProcessThree.start()
# ProcessFour.start()
ThreadOne.join()
ThreadTwo.join()
ThreadThree.join()
ThreadFour.join()
# ProcessOne.join()
# ProcessTwo.join()
# ProcessThree.join()
# ProcessFour.join()