この記事では,デジタル通貨の高周波取引戦略について,利益源 (主に市場の急激な変動と取引所手続手数料からの返済) の問題,ハッキングポジションとポジション制御の問題,およびパラレッタ分布を用いた取引のモデル化方法について論じている.さらに,Binanが提供する単筆取引と最上位ハッキングオーダーデータを参照し,次の記事では,高周波取引戦略の他の問題について詳細に議論することを計画している.
デジタル通貨の高周波取引について 2つの記事を書きましたデジタル通貨の高周波戦略の詳細, 5天
前回の記事で述べたように,高周波戦略は,特に市場が非常に激しく波動する市場に適しています. 取引品種を短期間の価格変動を調査し,全体的なトレンドと波動から構成されています. 傾向の変化を正確に予測できれば,もちろん儲けることができます. しかし,これは最も困難です. 本書は主に高周波メーカーの戦略について説明します. この問題は取り扱われません.
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
取引内容は以下の通りです.
取引が活発で,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));
为了观察方便,截掉尾部观察.可以看到成交量越大,出现频率越低,且减少的趋势更快。
buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));
トランザクション満足分布については多くの研究が行われている. パレト分布は,統計物理学と社会科学でよく使われる確率分布の一種である. パレト分布では,イベントの大きさ (または頻度) の確率が,そのイベントの大きさに対してある負の指数に等しい. この分布の主要な特徴は,大イベント (すなわち,平均から遠く離れた出来事) の発生頻度は,他の多くの分布で予想されるよりも高いことである. これは,トランザクション分布の特徴である. パレト分布の形式は: Px = Cx^-α.
下の図は,取引量がある値よりも大きい確率を示している.青い線は実際の確率,
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)
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);
しかし,この推定は,上図で模擬値と実際の値の差を描いたように見える. 取引が小さい場合,偏差は大きく,あるいは10%近くである. 参数的な推定によって異なる点を選択することで,この点の確率をより正確にすることができるが,偏差の問題も解決できない. これは
概要として,ここで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);
取引量分布を推定する方程式では,方程式の確率を実際の確率ではなく,条件上の確率に注意する.このとき,次の注文が起こると,この注文がある値よりも大きい確率は何ですか?また,異なる深さの注文の取引の確率は何ですか? (理想的には,それほど厳格ではありません.理論的には,注文簿に新規の注文と撤回があり,同じ深さの列があります).
この記事の内容はほぼ終わりましたが,まだ多くの疑問が答えられていて,以下の記事で答えを述べようと思います.
オーク量化 🐂🍺
fmゼロ暴力を振るう!
小草CSVは大きすぎるので自分でダウンロードできます