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 和资金流向,可以利用多线程或异步编程来提高计算效率,确保衍生数据能及时为策略提供支持。