Capture alpha before major events impact the market
Being able to react quickly to major hacks or market events before most others can help market participants execute trades and orders more effectively.
Take the Bybit hack as an example: a security breach occurred, but the market was slow to react. It wasn’t until hours later, when Bybit’s CEO made an official announcement, that a full market response took place. However, some participants spotted the early signs and acted before the news became public. Their trading activity left a visible footprint in trading data, creating a window of opportunity for others to recognize these early warning signs and react accordingly to capture the alpha. By doing so, they position themselves ahead of the broader market, rather than reacting after the widespread panic set in.
To secure the best trading conditions, market participants must monitor data in real-time and act quickly. Reacting early reduces the impact of their trades, helping them stay ahead before market depth deteriorates and a large-scale sell-off takes hold.
By leveraging Kaiko Level 1 Data via Kaiko Stream, participants gain access to real-time, tick-level trade data the moment transactions occur. This allows them to identify unusual market movements—such as an unexplained sell-off followed by a sharp recovery—and react swiftly to minimize losses and seize opportunities before the broader market.
Subscribe to tick-level trades
To subscribe to real-time trade data for a specific asset, configure your connection to Kaiko Stream as below. In this example, we'll monitor ETH spot trades on all exchanges covered by Kaiko. This data will show every single trade involving ETH. To subscribe to just one venue, see example 2.
from __future__ import print_function
import logging
import os
import grpc
from google.protobuf.json_format import MessageToJson
from google.protobuf import duration_pb2
from kaikosdk import sdk_pb2_grpc
from kaikosdk.core import instrument_criteria_pb2, assets_pb2
from kaikosdk.stream.aggregates_ohlcv_v1 import request_pb2 as pb_ohlcv
from kaikosdk.stream.aggregates_vwap_v1 import request_pb2 as pb_vwap
from kaikosdk.stream.market_update_v1 import request_pb2 as pb_market_update
from kaikosdk.stream.market_update_v1 import commodity_pb2 as pb_commodity
from kaikosdk.stream.trades_v1 import request_pb2 as pb_trades
def market_update_request(channel: grpc.Channel):
try:
with channel:
stub = sdk_pb2_grpc.StreamMarketUpdateServiceV1Stub(channel)
responses = stub.Subscribe(pb_market_update.StreamMarketUpdateRequestV1(
# start of parameter configuration #
instrument_criteria = instrument_criteria_pb2.InstrumentCriteria(
exchange = "*",
instrument_class = "spot",
code = "eth-*"
),
# end of parameter configuration #
commodities=[pb_commodity.SMUC_TRADE]
))
for response in responses:
print("Received message %s" % (MessageToJson(response, including_default_value_fields = True)))
# print("Received message %s" % list(map(lambda o: o.string_value, response.data.values)))
except grpc.RpcError as e:
print(e.details(), e.code())
def run():
credentials = grpc.ssl_channel_credentials(root_certificates=None)
call_credentials = grpc.access_token_call_credentials(os.environ['KAIKO_API_KEY'])
composite_credentials = grpc.composite_channel_credentials(credentials, call_credentials)
channel = grpc.secure_channel('gateway-v0-grpc.kaiko.ovh', composite_credentials)
market_update_request(channel)
if __name__ == '__main__':
logging.basicConfig()
run()
from __future__ import print_function
import logging
import os
import grpc
from google.protobuf.json_format import MessageToJson
from google.protobuf import duration_pb2
from kaikosdk import sdk_pb2_grpc
from kaikosdk.core import instrument_criteria_pb2, assets_pb2
from kaikosdk.stream.aggregates_ohlcv_v1 import request_pb2 as pb_ohlcv
from kaikosdk.stream.aggregates_vwap_v1 import request_pb2 as pb_vwap
from kaikosdk.stream.market_update_v1 import request_pb2 as pb_market_update
from kaikosdk.stream.market_update_v1 import commodity_pb2 as pb_commodity
from kaikosdk.stream.trades_v1 import request_pb2 as pb_trades
def market_update_request(channel: grpc.Channel):
try:
with channel:
stub = sdk_pb2_grpc.StreamMarketUpdateServiceV1Stub(channel)
responses = stub.Subscribe(pb_market_update.StreamMarketUpdateRequestV1(
# start of parameter configuration #
instrument_criteria = instrument_criteria_pb2.InstrumentCriteria(
exchange = "binc",
instrument_class = "spot",
code = "eth-*"
),
# end of parameter configuration #
commodities=[pb_commodity.SMUC_TRADE]
))
for response in responses:
print("Received message %s" % (MessageToJson(response, including_default_value_fields = True)))
# print("Received message %s" % list(map(lambda o: o.string_value, response.data.values)))
except grpc.RpcError as e:
print(e.details(), e.code())
def run():
credentials = grpc.ssl_channel_credentials(root_certificates=None)
call_credentials = grpc.access_token_call_credentials(os.environ['KAIKO_API_KEY'])
composite_credentials = grpc.composite_channel_credentials(credentials, call_credentials)
channel = grpc.secure_channel('gateway-v0-grpc.kaiko.ovh', composite_credentials)
market_update_request(channel)
if __name__ == '__main__':
logging.basicConfig()
run()
Once configured, your received messages will look like this, containing the trade amount, the price at which it was executed, if the trade was a sell or a buy of the asset, and the exchange involved.