高周波取引戦略について考える (4)

作者: リン・ハーン小草, 作成日:2023-08-08 22:31:47, 更新日:2023-09-18 19:51:25

img

前回の記事では,注文の到着間隔を研究することで,パラメータにダイナミックな調整を行う必要がある理由と,見積もりの良し悪しを評価する方法を示した.この記事では,深度データに焦点を当て,中間価格ミッド価格 (またはフェア価格,マイクロ価格など) を研究する.

深いデータ

ビンアンは,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・価格,ベスト・バイド・価格:ベスト・バイド・

まず,当日の市場を見て,大きく上り,大きく下がり,また当日の取引先の掛ける単位の量も市場の波動に伴い大きく変化し,特に,スプレッドは,市場の波動を非常に顕著に示しています.YGGの当日の市場統計では,20%のタイムスプレッドが1ティックよりも大きいことがあり,この様々なロボットが取引先で競争する時代に,このような状況はめったにありません.

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
books = pd.read_csv('YGGUSDT-bookTicker-2023-08-07.csv')
tick_size = 0.0001
books['date'] = pd.to_datetime(books['transaction_time'], unit='ms')
books.index = books['date']
books['spread'] = round(books['best_ask_price'] - books['best_bid_price'],4)
books['best_bid_price'][::10].plot(figsize=(10,5),grid=True);

img

books['best_bid_qty'][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);
books['best_ask_qty'][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);

img

(books['spread'][::10]/tick_size).rolling(10000).mean().plot(figsize=(10,5),grid=True);

img

books['spread'].value_counts()[books['spread'].value_counts()>500]/books['spread'].value_counts().sum()
0.0001    0.799169
0.0002    0.102750
0.0003    0.042472
0.0004    0.022821
0.0005    0.012792
0.0006    0.007350
0.0007    0.004376
0.0008    0.002712
0.0009    0.001657
0.0010    0.001089
0.0011    0.000740
0.0012    0.000496
0.0013    0.000380
0.0014    0.000258
0.0015    0.000197
0.0016    0.000140
0.0017    0.000112
0.0018    0.000088
0.0019    0.000063
Name: spread, dtype: float64

不均衡なオファー

上から見られるように,注文量と出荷量との間には,ほとんどの時間大きな差があり,この差は市場の短期市場に対する強力な予測作用を有する. 前回の記事で言及したように,注文量が小さいことがしばしば下落する理由はほぼ同じである.imgQ_bは,購入した注文量 (best_bid_qty),Q_aは,販売した注文量 (best_ask_qty) を表しています.

中間価格の定義:img

下の図は,ミッド価格が1つの間隔で変化する率と不均衡Iの関係を示し,予想と一致して,Iが増加するにつれて価格が上昇する可能性が高くなり,1に近づくほど価格変化の幅も加速する.高周波取引では,ミッド価格を導入する目的は,将来の価格の変化をより良く予測するためである.つまり,将来の価格との差が小さくなるほど,中間価格がより良く定義される.明らかに挂列の不均衡は戦略の予測に追加の情報を提供し,これを考慮して,重量化されたミッド価格を定義する:img

books['I'] = books['best_bid_qty'] / (books['best_bid_qty'] + books['best_ask_qty'])
books['mid_price'] = (books['best_ask_price'] + books['best_bid_price'])/2
bins = np.linspace(0, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['price_change'] = (books['mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['price_change'].mean()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Average Mid Price Change Rate');
plt.grid(True)

img

books['weighted_mid_price'] = books['mid_price'] + books['spread']*books['I']/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['weighted_price_change'] = (books['weighted_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['weighted_price_change'].mean()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

中間価格調整

グラフから見ると,重量化されたミッド価格が異なるIと比較して変化が非常に小さいことが示され,重量化されたミッド価格がより良いフィットメントであることを示します.しかし,0.2と0.8の近くでは,偏差が大きいような規則が残っています.これは,Iがまだ追加の情報を提供できることを示しています.重量化されたミッド価格が価格修正項目をIと完全に線形であると仮定しているため,これは明らかに現実に合致しません.上記のグラフから,Iが0と1に近づくと,偏差がより速く,線形関係ではなく,見られるように,これは現実に合致しません.

インタラクティブ・メディアの"I"は,

img

この時点で:

img

この形式を観察すると,加重中間価は平均中間価の修正であり,修正項の係数はSpreadであり,修正項は関数についてIであり,weighted mid-priceは単にこの関係がI/2であるとする.このとき調整されたIの分布 ((−1,1)) の利点が反映され,Iは原点対称性について,これは関数の適合関係を見つけるのに便利である.グラフを観察すると,この関数はIの奇数次数関係を満たさなければならない.

img

Nは正偶数で,実用的なテストでは,Nは8で比較良くなります.ここでは修正された加重の中間値を示します:

img

この時点で予想される中間価格の変動はIと基本的には関係ありません.この結果は,単純な加重中間価格よりも少し優れているが,実物では適用できないので,ここでは単なるアイデアを提示します.S.ストイコフの2017年の記事ではマルコフ鎖の方法を用いて紹介されています.マイクロ価格この記事へのトラックバック一覧です.

books['I'] = (books['best_bid_qty'] - books['best_ask_qty']) / (books['best_bid_qty'] + books['best_ask_qty'])
books['weighted_mid_price'] = books['mid_price'] + books['spread']*books['I']/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['weighted_price_change'] = (books['weighted_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['weighted_price_change'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

books['adjust_mid_price'] = books['mid_price'] + books['spread']*(books['I'])*(books['I']**8+1)/4
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['adjust_mid_price'] = (books['adjust_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['adjust_mid_price'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

books['adjust_mid_price'] = books['mid_price'] + books['spread']*(books['I']**3)/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['adjust_mid_price'] = (books['adjust_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['adjust_mid_price'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

概要

中間価格は,高周波戦略にとって非常に重要であり,将来の短期価格の予測であるため,中間価格はできるだけ正確である. 前述の中間価格は,分析時に1つの市場のみを使用したため,開口データに基づいている. 実用盤では,戦略は,すべてのデータ,特に実用盤のトレードを交換するために,可能な限り多くのデータを使用する必要があります. 中間価格の予測は,実際の取引価格から検証されるべきです.


もっと

ルイス読み取れなくなってしまいました

fmゼロ暴力を振るう!