デジタル通貨高周波戦略 詳細な紹介

作者: リン・ハーンリディア, 作成日: 2023-03-27 16:46:14, 更新日: 2023-09-18 20:12:59

img

デジタル通貨高周波戦略 詳細な紹介

高周波戦略を紹介する記事を書きましたhttps://www.fmz.com/bbs-topic/9750. 注目が集まっていたが,あまり深くなかった. それ以来2年以上経ち,市場は変化している. その記事が発表された後,私の高周波戦略は長い間安定した利益を得ることができましたが,徐々に利益は低下し,ある時点で停止しました. 最近数ヶ月間,それをリニューアルするためにいくつかの努力を費やし,現在まだいくつかの利益を得ることができます. この記事では,私の高周波戦略のアイデアといくつかの簡略化されたコードを議論の出発点としてより詳細な紹介を提供します. 意見は歓迎されています.

高周波取引条件

  • 割引口座は,Binanceを例として挙げると,現在,メーカーの割引額は0.0005%である.日々の取引額が1億円である場合,割引額は5000円になります.もちろん,テイカー料金は依然としてVIP料金をベースにしているため,戦略にテイカーが必要でない場合,VIPレベルは高頻度戦略にほとんど影響しません.異なるレベルの取引所には一般的に異なる割引額があり,高い取引額を維持する必要があります.一部の通貨市場が大きく変動した初期には,割引なしでも利益がありました.競争が激化するにつれて,割引金は利益の大きな割合を占めたり,またはそれらにのみ依存していたりします.高頻度トレーダーはトップレベルの手数料を追求しました.

  • スピード.高周波戦略が高周波と呼ばれる理由は,非常に高速であるためです. 交換のコロサーバーに接続し,最低のレイテンシーと最も安定した接続を取得することは,内部競争の条件の一つになりました. 戦略の内部消費時間はできるだけ少なくなければなりません. この記事では,同時実行を採用する私が使用するwebsocketフレームワークを紹介します.

  • 適正な市場.高周波取引は定量的な取引の真珠として知られており,多くのプログラムトレーダーは試してきたが,ほとんどの人は利益を得ることができず,改善の方向性を見つけられないため停止した.主な理由は,間違った取引市場を選んだことにあるはずです.戦略開発の初期段階では,取引で利益を得るために比較的簡単な市場を選ばなければなりません.それによって利益と改善のためのフィードバックがあり,戦略の進展に有利です.あなたが多くの潜在的なライバルと最も競争力のある市場で競争し始めると,あなたがどれだけ努力してもすぐにお金を失うし,諦めるでしょう.競合他者がそれほど多くないとき,特に取引額が比較的大きいとき,新しい永続契約取引ペアを推奨します.これが利益を得ることが最も簡単です. BTCとETHは取引額が最も多く,取引が最も活発ですが,生き残るのは難しいです.

  • 競争に直面する.どんな取引も市場が絶えず変化しており,特に高周波取引では,いかなる取引戦略も永遠に続くことはできません.この市場に参入することは,最も賢くて勤勉なトレーダーと直接競争することを意味します.ゼロサムゲーム市場で,あなたが稼ぐほど,他の人々が稼ぐほど少なくなります.あなたが遅く入るほど,難易度は高くなります.すでに市場にいる人も継続的に改善する必要があります. 3-4年前はおそらく最高の機会でした.最近,デジタル通貨市場の全体的な活動は減少しており,新規参入者が現在高周波取引を開始することは非常に困難です.

高周波原理

高周波の戦略には様々な種類があります.

  • 高周波ヘッジ,この取引所や他の取引所を通じてヘッジの機会を見つけ,注文を掴み,利益を得るためにスピードメリットに頼る.
  • 高頻度トレンドで 短期トレンドを判断して利益を得る
  • 買い手と売り手の両方に注文を出し ポジションをうまくコントロールし 割引で利益を得ています
  • 他にもたくさんあります ひとつひとつ述べません 私の戦略はトレンドとマーケットメーカーの組み合わせです.まず,我々はトレンドを判断し,その後注文します.取引が完了した後,在庫ポジションを保持せずにすぐに販売する注文をします.次に,私は戦略コードと組み合わせて導入します.

戦略の枠組み

次のコードは,ベナンス永久契約の基本的なフレームワークに基づいています.主にwebソケット深さ,深度オーダーフロー取引市場データ,位置情報に購読しています.市場データとアカウント情報が別々に購読されているため,最新の情報が取得されているかどうかを確認するために継続的にread ((-1) を使用する必要があります.ここでEventLoop ((1000) は直接の無限のループを回避し,システム負荷を削減するために使用されます.EventLoop ((1000) は1000msのタイムアウトを持つwssまたは同時タスク返信があるまでブロックします.

var datastream = null
var tickerstream = null
var update_listenKey_time = 0

function ConncetWss(){
    if (Date.now() - update_listenKey_time < 50*60*1000) {
        return
    }
    if(datastream || tickerstream){
        datastream.close()
        tickerstream.close()
    }
    //Need APIKEY
    let req = HttpQuery(Base+'/fapi/v1/listenKey', {method: 'POST',data: ''}, null, 'X-MBX-APIKEY:' + APIKEY) 
    let listenKey = JSON.parse(req).listenKey
    datastream = Dial("wss://fstream.binance.com/ws/" + listenKey + '|reconnect=true', 60)
    //Symbols are the set trading pairs
    let trade_symbols_string = Symbols.toLowerCase().split(',')
    let wss_url = "wss://fstream.binance.com/stream?streams="+trade_symbols_string.join(Quote.toLowerCase()+"@aggTrade/")+Quote.toLowerCase()+"@aggTrade/"+trade_symbols_string.join(Quote.toLowerCase()+"@depth20@100ms/")+Quote.toLowerCase()+"@depth20@100ms"
    tickerstream = Dial(wss_url+"|reconnect=true", 60)
    update_listenKey_time = Date.now()
}

function ReadWss(){
    let data = datastream.read(-1)
    let ticker = tickerstream.read(-1)
    while(data){
        data = JSON.parse(data)
        if (data.e == 'ACCOUNT_UPDATE') {
            updateWsPosition(data)
        }
        if (data.e == 'ORDER_TRADE_UPDATE'){
            updateWsOrder(data)
        }        
        data = datastream.read(-1)
    }
    while(ticker){
        ticker = JSON.parse(ticker).data
        if(ticker.e == 'aggTrade'){
            updateWsTrades(ticker)
        }
        if(ticker.e == 'depthUpdate'){
            updateWsDepth(ticker)
        }
        ticker = tickerstream.read(-1)
    }
    makerOrder()
}

function main() {
    while(true){
        ConncetWss()
        ReadWss()
        worker()
        updateStatus()
        EventLoop(1000)
    }
}

戦略指標

先ほど述べたように,私の高周波戦略は,買い物・販売を実行する前にトレンドを決定する必要があります. 短期トレンドは主に,取引方向,価格,量,取引時間などを含む購読中のaggTrade,ティック・バイ・ティック取引データに基づいて判断されます. 買い物・販売は主に深さと取引額を指します. 以下は,懸念すべき指標の詳細な紹介です. ほとんどの指標は買い物・販売グループに分かれ,一定の時間枠内で動的にカウントされます. 私の戦略の時間枠は10秒以内です.

  • トレード毎の平均取引額,取引毎の取引額は,購入・販売注文のサイズを反映した100ms以内に同じ方向性と価格を持つ異なる注文の集合です.このデータは高い重量を持ち,購入注文の量が販売注文よりも大きい場合,これは買い手支配市場であると仮定することができます.
  • オーダー頻度またはオーダー間隔は,またトランザクションごとにデータに基づいており,前述の平均トランザクション額は時間の概念を考慮していないため,完全に正確ではありません. 一方向のオーダーは平均トランザクション額が小さいが頻度が高い場合,それでもその方向の強さに貢献します. 平均トランザクション額 * オーダー頻度は,固定間隔で総トランザクション額を表し,直接比較に使用できます. オーダーの到着は,特定の時間間隔内に到着するオーダーの総額がどのくらいであるか簡単に推定し,オーダーポジションを配置するための参照を提供するために使用できるポイソン分布に従います.
  • 平均のスプレッドは,これは比較的理解しやすい,つまり,1を売り,1を買います.現在の市場は主に1点のスプレッドを持っています.スプレッドが大きくなった場合,それはしばしば市場トレンドがあることを意味します.
  • 平均購入・販売価格,各取引の平均価格を別々に計算し,最新の価格と比較します.最近の購入注文価格が平均購入注文価格よりも高くなった場合,突破が発生したと予備的に判断できます.

戦略の論理

短期的な傾向を特定する

//bull represents short-term bullish, bear represents short-term bearish
let bull =  last_sell_price > avg_sell_price && last_buy_price > avg_buy_price &&
            avg_buy_amount / avg_buy_time > avg_sell_amount / avg_sell_time;
let bear =  last_sell_price < avg_sell_price && last_buy_price < avg_buy_price && 
            avg_buy_amount / avg_buy_time < avg_sell_amount / avg_sell_time;

最新の販売価格が平均の販売価格より高く, 最新の購入価格が平均の購入価格より高く, 固定間隔の購入オーダーの価値が販売オーダーの価値よりも大きい場合, 短期的に上昇傾向にあると判断されます. 逆の場合は, 下落傾向にあります.

注文の価格

function updatePrice(depth, bid_amount, ask_amount) {

    let buy_price = 0
    let sell_price = 0
    let acc_bid_amount = 0
    let acc_ask_amount = 0

    for (let i = 0; i < Math.min(depth.asks.length, depth.bids.length); i++) {
        acc_bid_amount += parseFloat(depth.bids[i][1])
        acc_ask_amount += parseFloat(depth.asks[i][1])
        if (acc_bid_amount > bid_amount  && buy_price == 0) {
            buy_price = parseFloat(depth.bids[i][0]) + tick_size
        }
        if (acc_ask_amount > ask_amount  && sell_price == 0) {
            sell_price = parseFloat(depth.asks[i][0]) - tick_size
        }
        if (buy_price > 0 && sell_price > 0) {
            break
        }
    }
    return [buy_price, sell_price]
}

ここで,我々はまだ古いアプローチを採用し,必要な深さまで繰り返します.新しい待機注文を考慮せずに,1秒で10コインが取引可能であると仮定して,販売価格は10コインが購入される位置に設定されます. 時間の窓の特定のサイズは自分で設定する必要があります.

注文金額

let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time

Ratio は固定比例を表す.つまり,購入注文量は,最近の販売注文量の固定比例である.この方法により,戦略は,現在の購入および販売活動に応じて順応的に注文サイズを調整することができます.

場所の注文条件

if(bull && (sell_price-buy_price) > N * avg_diff) {
    trade('buy', buy_price, buy_amount)
}else if(position.amount < 0){
    trade('buy', buy_price, -position.amount)
}
if(bear && (sell_price-buy_price) >  N * avg_diff) {
    trade('sell', sell_price, sell_amount)
}else if(position.amount > 0){
    trade('sell', sell_price, position.amount)
}

avg_diff は平均市場価格の差であり,バイド・アスク・スプレッドがこの値の一定倍数よりも大きく,上昇傾向にある場合にのみ購入オーダーが行われます.ショートポジションを保持すると,長期にわたって保持を避けるため,ポジションも閉鎖されます.オーダーが実行されることを保証するために,単一のメーカーオーダーとして配置できます.さらに,BinanceのカスタムオーダーIDが使用され,オーダー応答を待つ必要がありません.

同期構造

var tasks = []
var jobs = []

function worker(){
    let new_jobs = []
    for(let i=0; i<tasks.length; i++){
        let task = tasks[i]
        jobs.push(exchange.Go.apply(this, task.param))
    }
    _.each(jobs, function(t){
        let ret = t.wait(-1)
        if(ret === undefined){
            new_jobs.push(t)//Unreturned tasks will continue to wait next time
        }
    })
    jobs = new_jobs
    tasks = []
}

/*
Write the required task parameters in param
tasks.push({'type':'order','param': ["IO", "api", "POST","/fapi/v1/order",
        "symbol="+symbol+Quote+"&side="+side+"&type=LIMIT&timeInForce=GTX&quantity="+
        amount+"&price="+price+"&newClientOrderId=" + UUID() +"&timestamp="+Date.now()]})
*/

監視データ

  • 遅延,高周波戦略のスピードの重要性が強調されている.戦略では,注文の提出,注文のキャンセル,ポジションリターン,深さ,オーダーフロー,ポジション,全体的なループなど,さまざまな遅延を監視し記録する必要があります.異常な遅延は,時間内に調査し,全体的な戦略遅延を短縮しようとします.
  • トランザクション金額比,トランザクション金額を総トランザクション金額のパーセントとして計算する.比率が低い場合,成長の余地がある.ピーク時に,戦略が総取引金額の10%以上を占める可能性があります.
  • ポジション閉じる利回り率 平均閉じる利回り率を計算することは,戦略の有効性を判断するための最も重要な基準です.
  • リバート比率 (リバートの総収益比率) は,戦略がリバートに依存する程度を反映する. 取引プラットフォームには異なるリバートレベルがあり,収益性の低い戦略は,高いリバートレベルで収益性がある可能性があります.
  • 注文の失敗率は,注文を出すと取引されるだけ.注文を出すのに遅れがあるため,注文は行われない可能性があります.この比率が高くなった場合,戦略のスピードが有利ではないことを意味します.
  • 完了した注文の割合,プラットフォームはしばしば取引率の要件を持っています.それがあまりにも低い場合,戦略は注文を頻繁にキャンセルし,解決する必要がありますことを意味します.
  • 市場との間のギャップを反映している. 我々は,それらのほとんどはまだ1つを購入し,1つ販売の位置を占めていることがわかります.

他 の 提案

  • この記事では,高周波戦略は単一の取引所,単一の通貨,単一の市場のみを指す.それは大きな制限があり,ほとんどの状況や通貨は利益を得ることができない.しかし,将来,どの通貨が利益をもたらすかを予測することは不可能であるため,機会を逃さずに複数の通貨またはすべての通貨を取引することができます.交換の周波数制限の下でも,ロボットは複数の取引ペアを取引することができます.もちろん,最適な速度のために,1つのサブアカウントは,1つのロボットに対応する1つのサーバーで1つの取引ペアを取引することができます.しかし,これははるかに高いコストをもたらします.
  • 収益率に基づいて注文量と注文条件を決定する.複数の通貨との取引は試みの高コストをもたらし,モニタリングが収益性がない場合は,最小取引額を使用し,戦略がポジティブなリターン率を動的にモニターするまで取引頻度を減らす.その後,リターンを徐々に改善するために取引額を増やす.
  • より多くの情報を取得する.高周波取引のもう一つの特徴は,より大量のデータを処理し,より多くの情報を使用することです.単一の取引所内の単一の取引ペアのすべての市場情報は参照されるべきであり,永久契約は,同じ取引ペアの他の取引所からのデータや,他の通貨からのデータにも言及することができます.より多くのデータがあるほど,対応するメリットが大きいです.例えば,Binanceは,深さやオーダーフローの最短プッシュタイムが100msであるため,シンボルの最良の未定注文情報に購読することができます.ただし,これはリアルタイムで,高周波戦略にとって非常に価値があります.
  • 他の取引所のサーバーは異なります 詳細については取引所の技術スタッフに相談できます
  • この記事の戦略コードは,多くの厄介な但し必要な詳細が削除された単純化された例コードに過ぎない.使用された指標は参照のみであり,直接使用されるべきではない.高周波戦略を実行する際に注意を払うべき多くの詳細があり,修正および改善するには忍耐が必要です.

関連性

もっと