量化交易系统开发-实时行情自动化交易-Okex衍生数据

时间:2024-11-10 07:01:19

19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。

接下来聊聊基于Okex交易所API获取衍生数据。

衍生数据(Derived Data)是从基础市场数据中计算得出的重要信息,用于辅助交易策略的制定和执行。例如,通过对市场的价格、成交量、订单簿等数据进行分析,可以计算技术指标、市场情绪、买卖盘强度等。OKEx 提供了一系列 API 接口,开发者可以利用这些接口来获取基础数据并进一步计算衍生数据,从而为交易决策提供参考。以下是如何利用 OKEx API 获取并生成衍生数据的详细开发内容扩展。

1. 衍生数据简介

衍生数据是基于原始市场数据(如 K 线数据、订单簿、交易数据等)通过特定算法计算得出的信息,帮助开发者更好地理解市场动态、发现交易机会。常见的衍生数据包括:

  • 技术指标:如均线(Moving Average)、相对强弱指数(RSI)、布林带(Bollinger Bands)等。

  • 买卖盘强度:通过比较买盘和卖盘的累计量,判断市场多空力量的对比情况。

  • 资金流向指标:通过计算主动买入和主动卖出的资金量,判断大资金的市场活动情况。

2. 获取基础数据并生成衍生数据

OKEx 提供的 API 接口中,最常用的包括获取 K 线数据、订单簿数据、交易数据等。衍生数据的生成通常从这些基础数据开始,通过算法进行进一步计算。

  • 获取 K 线数据:首先,可以通过调用 /api/v5/market/candles 接口获取 K 线数据,作为生成技术指标的基础。例如,计算均线、相对强弱指数等都需要基于历史的价格数据。

    import requests
    import pandas as pd
    
    def get_klines(inst_id, bar='1m', limit=100):
        url = f"https://www.okex.com/api/v5/market/candles?instId={inst_id}&bar={bar}&limit={limit}"
        response = requests.get(url)
        if response.status_code == 200:
            data = response.json()
            df = pd.DataFrame(data['data'], columns=['timestamp', 'open', 'high', 'low', 'close', 'volume'])
            df['close'] = df['close'].astype(float)
            return df
        else:
            raise Exception(f"Error fetching K line data: {response.status_code}")
    
    # 获取 BTC-USDT 的 K 线数据
    klines = get_klines("BTC-USDT")
    print(klines.head())

    在上述代码中,我们通过调用 OKEx 的 REST API 获取 K 线数据,并将其转换为 Pandas DataFrame,以便后续进行技术指标的计算。

3. 技术指标的计算

通过获取的基础数据,可以进一步计算各种常见的技术指标,这些指标是交易策略中最重要的组成部分。

  • 移动平均线(MA):移动平均线是最简单和常用的技术指标之一,用于平滑价格波动,从而识别市场趋势。

    def calculate_moving_average(df, window=14):
        df[f'ma_{window}'] = df['close'].rolling(window=window).mean()
        return df
    
    # 计算 14 日移动平均线
    klines_with_ma = calculate_moving_average(klines, window=14)
    print(klines_with_ma[['timestamp', 'close', 'ma_14']].tail())

    在此示例中,我们利用 Pandas 提供的滚动计算功能来计算移动平均线。移动平均线可以帮助判断市场是处于上升还是下降趋势。

  • 相对强弱指数(RSI):RSI 用于判断市场的超买或超卖状态,是短期交易中非常重要的指标。

    def calculate_rsi(df, period=14):
        delta = df['close'].diff(1)
        gain = delta.where(delta > 0, 0)
        loss = -delta.where(delta < 0, 0)
        avg_gain = gain.rolling(window=period).mean()
        avg_loss = loss.rolling(window=period).mean()
        rs = avg_gain / avg_loss
        df['rsi'] = 100 - (100 / (1 + rs))
        return df
    
    # 计算 14 日 RSI
    klines_with_rsi = calculate_rsi(klines_with_ma, period=14)
    print(klines_with_rsi[['timestamp', 'close', 'rsi']].tail())

    通过计算 RSI,可以帮助交易者识别市场是否处于超买(通常 RSI > 70)或超卖状态(通常 RSI < 30),从而作出交易决策。

4. 买卖盘强度的计算

买卖盘强度是通过比较市场的买盘和卖盘挂单数量,分析市场中多空双方的力量对比。

  • 获取订单簿数据:通过调用 /api/v5/market/books 接口获取市场订单簿数据,然后计算买卖盘的强度。

    def get_order_book(inst_id, depth=10):
        url = f"https://www.okex.com/api/v5/market/books?instId={inst_id}&sz={depth}"
        response = requests.get(url)
        if response.status_code == 200:
            data = response.json()
            bids = sum([float(bid[1]) for bid in data['data'][0]['bids']])
            asks = sum([float(ask[1]) for ask in data['data'][0]['asks']])
            return bids, asks
        else:
            raise Exception(f"Error fetching order book data: {response.status_code}")
    
    # 获取 BTC-USDT 的买卖盘强度
    bids, asks = get_order_book("BTC-USDT")
    print(f"买盘强度: {bids}, 卖盘强度: {asks}")

    在该示例中,我们计算了买卖盘的累计量,以判断市场中的多空力量对比。例如,当买盘远大于卖盘时,可能预示市场具有上升潜力。

5. 资金流向指标的计算

资金流向指标(Capital Flow Indicator)用于分析市场中的大资金流动,通常通过分析主动买入和主动卖出的资金量来确定。

  • 分析主动买卖数据:通过 WebSocket 订阅成交记录,并分析每笔成交是主动买入还是主动卖出。

    import asyncio
    import websockets
    import json
    
    async def subscribe_trades(inst_id):
        url = "wss://ws.okex.com:8443/ws/v5/public"
        async with websockets.connect(url) as websocket:
            subscribe_message = {
                "op": "subscribe",
                "args": [{"channel": "trades", "instId": inst_id}]
            }
            await websocket.send(json.dumps(subscribe_message))
    
            buy_volume = 0
            sell_volume = 0
            while True:
                response = await websocket.recv()
                data = json.loads(response)
                for trade in data.get('data', []):
                    if trade['side'] == 'buy':
                        buy_volume += float(trade['sz'])
                    elif trade['side'] == 'sell':
                        sell_volume += float(trade['sz'])
                print(f"买入量: {buy_volume}, 卖出量: {sell_volume}")
    
    # 订阅 BTC-USDT 的成交记录并计算资金流向
    asyncio.run(subscribe_trades("BTC-USDT"))

    在该示例中,通过订阅成交记录来计算买入量和卖出量。主动买入量大于卖出量时,说明市场中多头力量占优,资金正在流入市场;反之,则说明空头力量较强。

6. 数据存储与优化
  • 数据存储:衍生数据计算后需要进行存储,以便后续的策略回测和实时监控。可以使用关系型数据库(如 MySQL)来存储 K 线及其衍生指标,或者使用 Redis 来缓存最新的衍生数据,便于策略的快速读取。

  • 计算优化:对于实时计算的衍生数据,例如 RSI 和资金流向,可以利用多线程或异步编程来提高计算效率,确保衍生数据能及时为策略提供支持。