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

作者: リン・ハーン小草, 作成日:2023-08-03 16:14:16, 更新日:2023-12-08 16:37:21

img

この記事では,デジタル通貨の高周波取引戦略について,利益源 (主に市場の急激な変動と取引所手続手数料からの返済) の問題,ハッキングポジションとポジション制御の問題,およびパラレッタ分布を用いた取引のモデル化方法について論じている.さらに,Binanが提供する単筆取引と最上位ハッキングオーダーデータを参照し,次の記事では,高周波取引戦略の他の問題について詳細に議論することを計画している.

デジタル通貨の高周波取引について 2つの記事を書きましたデジタル通貨の高周波戦略の詳細, 5天 80倍,高周波戦略の力しかし,経験を共有し,一般的に話すためにしかできません. 今回は,一連の記事を書くことを計画しています. 高周波取引のアイデアを最初から紹介します. できるだけ簡潔に説明したいのですが,私のレベルが限られているため,高周波取引の理解は深くありません.

高周波の源

前回の記事で述べたように,高周波戦略は,特に市場が非常に激しく波動する市場に適しています. 取引品種を短期間の価格変動を調査し,全体的なトレンドと波動から構成されています. 傾向の変化を正確に予測できれば,もちろん儲けることができます. しかし,これは最も困難です. 本書は主に高周波メーカーの戦略について説明します. この問題は取り扱われません.

解決すべき問題

1.策略同时挂买单和卖单,第一个问题就是在哪里挂单。挂的离盘口越近,成交的概率越高,但在剧烈波动的行情中,瞬间成交的价格可能离盘口较远,挂的那太近没有能吃到足够的利润。挂的太远的单子成交概率又低。这是一个需要优化的问题。

2.控制仓位。为了控制风险,策略就不能长时间累计过多的仓位。可以通过控制挂单距离、挂单量、总仓位限制等办法解决。

上記の目的を達成するために,取引の確率概率,取引の利益,市場推定など多くの側面のモデリング推定が必要であり,この分野に関する記事や論文は多く,High-Frequency Trading,Orderbookなどのキーワードで見つけることができます.インターネットにも多くの推奨がありますが,ここでは開かれません.また,信頼性の高い迅速なバックテストシステムを構築することもお勧めです.

必要なデータ

取引先のデータと,最上位の配送情報も提供しています.ダウンロード詳細なデータは,APIでダウンロードし,ホワイトリストでダウンロードし,自己収集することもできます. 復習目的のために集積された取引データを利用することもできます. この記事ではHOOKUSDT-aggTrades-2023-01-27のデータを使用します.

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

取引内容は以下の通りです.

  1. agg_trade_id: 取引に集約されたID,
  2. 価格:取引価格
  3. quantity: 取引の量
  4. first_trade_id: 集計取引には複数の同時取引があり,最初の取引のIDが1つだけ統計されます.
  5. last_trade_id: 最後の取引のID
  6. transact_time: トランザクションが完了する時間
  7. is_buyer_maker: 取引方向,True は買い手,買い手は買い手

取引が活発で,660万件の取引データが見られます.csvはコメント欄に貼り付けられています.

trades = pd.read_csv('COMPUSDT-aggTrades-2023-07-02.csv')
trades

配列 × 7列

agg_trade_id について 価格 first_trade_id について last_trade_id について トランザクション_タイム is_buyer_maker 購入者_メーカー
120719552 52.42 22.087 207862988 207862990 1688256004603 偽り
120719553 52.41 29.314 207862991 207863002 1688256004623 そうだ
120719554 52.42 0.945 207863003 207863003 1688256004678 偽り
120719555 52.41 13.534 207863004 207863006 1688256004680 そうだ
121384024 68.29 10.065 210364899 210364905 1688342399863 偽り
121384025 68.30 7.078 210364906 210364908 1688342399948 偽り
121384026 68.29 7.622 210364909 210364911 1688342399979 そうだ

単筆取引モデル

データを処理し,原始トレードを決済主動取引群と販売单主動取引群に分けます.また,原始集約取引のデータは,同時に同じ価格で同じ方向で1つのデータであり,主動取引が100件発生する可能性があり,複数の取引に分けられ,価格が異なる場合,例えば60枚と40枚に分けると,2つのデータが生成され,決済成交の推定に影響を及ぼします.したがって,transact_timeに基づいて1回再集約する必要があります.集約後,データ量は14万条減少します.

trades['date'] = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index = trades['date']
buy_trades = trades[trades['is_buyer_maker']==False].copy()
sell_trades = trades[trades['is_buyer_maker']==True].copy()
buy_trades = buy_trades.groupby('transact_time').agg({
    'agg_trade_id': 'last',
    'price': 'last',
    'quantity': 'sum',
    'first_trade_id': 'first',
    'last_trade_id': 'last',
    'is_buyer_maker': 'last',
    'date': 'last',
    'transact_time':'last'
})
sell_trades = sell_trades.groupby('transact_time').agg({
    'agg_trade_id': 'last',
    'price': 'last',
    'quantity': 'sum',
    'first_trade_id': 'first',
    'last_trade_id': 'last',
    'is_buyer_maker': 'last',
    'date': 'last',
    'transact_time':'last'
})
buy_trades['interval']=buy_trades['transact_time'] - buy_trades['transact_time'].shift()
sell_trades['interval']=sell_trades['transact_time'] - sell_trades['transact_time'].shift()
print(trades.shape[0] - (buy_trades.shape[0]+sell_trades.shape[0]))
146181

決済の例として,最初に直角図を描くと,長尾効果が非常に顕著に見えます. ほとんどのデータは左端に集中していますが,小さな大きな取引が尾端に分布しています.

buy_trades['quantity'].plot.hist(bins=200,figsize=(10, 5));

png

为了观察方便,截掉尾部观察.可以看到成交量越大,出现频率越低,且减少的趋势更快。

buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));

png

トランザクション満足分布については多くの研究が行われている. パレト分布は,統計物理学と社会科学でよく使われる確率分布の一種である. パレト分布では,イベントの大きさ (または頻度) の確率が,そのイベントの大きさに対してある負の指数に等しい. この分布の主要な特徴は,大イベント (すなわち,平均から遠く離れた出来事) の発生頻度は,他の多くの分布で予想されるよりも高いことである. これは,トランザクション分布の特徴である. パレト分布の形式は: Px = Cx^-α.

下の図は,取引量がある値よりも大きい確率を示している.青い線は実際の確率,線は模擬の確率である.ここで,具体的なパラメータを混乱させないように,実際にパラレッターの分布を満たしていることがわかります. 0以上の注文量の確率が1であるため,標準化を満たすために,その分布方程式は次のようになります:

png

N は標準化参数である.ここで平均取引量 M を選択し,alpha は 2.06 を選択する.特定のalpha の推定は,D=N のときの P 値で反計算できる.具体的には:alpha = log ((P(d>M)) /log ((2)).異なる点の選択により,alpha の取値がわずかに異なる.

depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
alpha = np.log(np.mean(buy_trades['quantity'] > mean_quantity))/np.log(2)
mean_quantity = buy_trades['quantity'].mean()
probabilities_s = np.array([(1+depth/mean_quantity)**alpha for depth in depths])

plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)

img

plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

png

しかし,この推定は,上図で模擬値と実際の値の差を描いたように見える. 取引が小さい場合,偏差は大きく,あるいは10%近くである. 参数的な推定によって異なる点を選択することで,この点の確率をより正確にすることができるが,偏差の問題も解決できない. これは律分布と実際の分布の差によって決定され,より正確な結果を得るためには律分布の方程式に修正が必要である. 具体的なプロセスは概要されていないが,全体として,光が閃いたことが発見され,実際は次のとおりである.

png

概要として,ここでr = q/Mで標準化されたトランザクションを表示する.パラメータは上記と同じ方法で推定できる.下図では,修正後の最大偏差が2%を超えないことが示されている.理論的には修正を続けることができるが,この精度は十分である.

depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
mean = buy_trades['quantity'].mean()
alpha = np.log(np.mean(buy_trades['quantity'] > mean))/np.log(2.05)
probabilities_s = np.array([(((1+20**(-depth/mean))*depth+mean)/mean)**alpha for depth in depths])

plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

png

取引量分布を推定する方程式では,方程式の確率を実際の確率ではなく,条件上の確率に注意する.このとき,次の注文が起こると,この注文がある値よりも大きい確率は何ですか?また,異なる深さの注文の取引の確率は何ですか? (理想的には,それほど厳格ではありません.理論的には,注文簿に新規の注文と撤回があり,同じ深さの列があります).

この記事の内容はほぼ終わりましたが,まだ多くの疑問が答えられていて,以下の記事で答えを述べようと思います.


もっと

オーク量化 🐂🍺

fmゼロ暴力を振るう!

小草CSVは大きすぎるので自分でダウンロードできます