TT Lab
はじめる
学ぶ 学習パス コース

資本市場と決済

相場フィードのギャップと遅延を扱う

TT Labで続きを見る

目標

相場フィードのキャプチャで、欠けたものと遅れて来たものを区別し、A/B調停で埋められるものと本当の穴を分け、遅延をパーセンタイルで測ってテールが集中した区間を指摘し、復旧の方式を区間ごとに決められるようになります。

なぜ重要なのか

相場フィードは、順序も到着も保証しない伝送の上に載っています。そのため、受け取る側が順序番号で判定する必要がありますが、判定方式が間違っていると、その間違いは静かに見過ごされず、回線を詰まらせます。到着順でギャップを数えると、実際の5倍以上になり、その数だけ再送を要求すると、要求トラフィックが遅延を大きくし、遅延が順序の入れ替わりを増やして、ギャップがさらに多く見えます。

このラボが強制する4つは、すべて現場の規則です。ギャップは集合で判定します。遅れて来たものは欠けたものではなく、この2つは到着順では区別できません。再送の前にほかのチャネルを見ます。二重化がある理由がそれであり、要求なしで埋まる割合が圧倒的です。遅延はテールで見ます。平均は2つの世界を混ぜて、1つの数字にしてしまいます。計算方式をファイルに書きます。パーセンタイルの定義が違うと、同じデータから異なる結論が出て、そこからはデータの話ではなく定義の話になります。

今回のキャプチャは、2026-08-27の寄り付き直後の約11分間のものです。取引所が出した元のデータは、順序番号1から12000まで欠けがなく、こちらはそれをA・Bの2つのチャネルで受け取りました。2つのチャネルはそれぞれ欠落を経験し、寄り付き直後と09:08ごろに、遅延が大きく跳ねました。

パーセンタイルは次のように計算します。最近接順位です。値を昇順に並べ替えたあと、idx = ceil(p * n / 100)番目の値を取ります(1から数えます)。Pythonの整数ではlat[(p*n + 99)//100 - 1]です。平均は、合計を件数で割ったあと切り捨てます。遅延の分析はチャネルAだけを対象とし、同じseqが何回も来た場合は、最初に届いた1件だけを使います。

ステップ

  1. /root/cap/feedを作成し、正解の生成スクリプトをそのまま実行して、/root/cap/feed/feed.jsonlを作ってください。シードを変えると、採点値とずれます。
  2. /root/cap/feed/shape.txtに7行書いてください。lines=、ch_a_lines=、ch_b_lines=、ch_a_unique=、ch_b_unique=、ch_a_dup=、seq_max=です。
  3. /root/cap/feed/gaps.txtにarrival_jumps_a=、missing_a=、missing_b=、gap_runs_a=を書き、/root/cap/feed/gaps_a.csvに、チャネルAが受け取れなかった順序番号を連続区間にまとめて、from_seq,to_seq,countのヘッダー行とともに書いてください。
  4. /root/cap/feed/arb.txtにrecoverable_from_b=、true_holes=、hole_runs=を書き、/root/cap/feed/holes.csvに、両方とも受け取れなかった区間をfrom_seq,to_seq,countで書いてください。
  5. /root/cap/feed/latency.txtにmethod=nearest_rankと、n=、p50_us=、p95_us=、p99_us=、max_us=、mean_us=を書いてください。
  6. ts_sendの分でバケットを分けて、/root/cap/feed/tail.csvにminute,n,mean_us,p99_us,over_10msを書き、/root/cap/feed/tail.txtにworst_minute=、worst_p99_us=、over_10ms_total=、burst_minutes=を書いてください。minuteは09:00を0とする整数で、burst_minutesは、平均が10msを超える分をカンマでつなぎます。
  7. /root/cap/feed/retx.csvに、本当の穴の区間ごとにfrom_seq,to_seq,count,actionを書いてください。連続5個以上ならsnapshot、未満ならretransmitです。/root/cap/feed/retx.txtにretransmit_runs=、retransmit_seqs=、snapshot_runs=、snapshot_seqs=を書いてください。
  8. /root/cap/feed/report.mdにレポートを書いてください。## 무슨 일이 있었나、## 갭、## 지연、## 돈으로 얼마인가、## 무엇을 고쳐야 하나の5つの節が必要です(見出しは韓国語で、順に「何があったか」「ギャップ」「遅延」「金額でいくらか」「何を直すべきか」という意味です)。

参考

A/B二重化フィードのキャプチャを作る

/root/cap/feedを作成し、正解の生成スクリプトをそのまま実行して、/root/cap/feed/feed.jsonlを作ってください。シードを変えると、採点値とずれます。

生成スクリプトをそのまま実行すれば済みます。シードを変えると、採点値とずれます。

チャネルごとの受信件数と重複を数える

/root/cap/feed/shape.txtに7行書いてください。lines=、ch_a_lines=、ch_b_lines=、ch_a_unique=、ch_b_unique=、ch_a_dup=、seq_max=です。

チャネルごとの行数と、異なるseqの個数を別々に数えてください。2つの数字が違えば、その差が重複です。

欠けたものと遅れて来たものを区別する

/root/cap/feed/gaps.txtにarrival_jumps_a=、missing_a=、missing_b=、gap_runs_a=を書き、/root/cap/feed/gaps_a.csvに、チャネルAが受け取れなかった順序番号を連続区間にまとめて、from_seq,to_seq,countのヘッダー行とともに書いてください。

2つの方式で数えてください。到着順に読みながらseqが1より大きく跳ねた箇所を数えることと、1..12000のうち、そのチャネルが一度も受け取れなかった順序番号を数えること。

Bチャネルで埋めて本当の穴だけを残す

/root/cap/feed/arb.txtにrecoverable_from_b=、true_holes=、hole_runs=を書き、/root/cap/feed/holes.csvに、両方とも受け取れなかった区間をfrom_seq,to_seq,countで書いてください。

Aが受け取れなかった順序番号の集合から、Bが受け取ったものを引けば、本当の穴です。それをもう一度、連続区間にまとめてください。

遅延のパーセンタイルを出す

/root/cap/feed/latency.txtにmethod=nearest_rankと、n=、p50_us=、p95_us=、p99_us=、max_us=、mean_us=を書いてください。

チャネルAだけ、seqごとに最初に届いた1件だけを使います。パーセンタイルは最近接順位で、昇順に並べ替えたあと、ceil(p*n/100)番目の値です。平均は、整数の割り算で切り捨てます。

テールが集中した区間を指摘する

ts_sendの分でバケットを分けて、/root/cap/feed/tail.csvにminute,n,mean_us,p99_us,over_10msを書き、/root/cap/feed/tail.txtにworst_minute=、worst_p99_us=、over_10ms_total=、burst_minutes=を書いてください。minuteは09:00を0とする整数で、burst_minutesは、平均が10msを超える分をカンマでつなぎます。

ts_sendの分でバケットを分け、バケットごとに、件数・平均・p99・10ms超過件数を出します。平均が10msを超える分がburstです。

再送とスナップショットに分ける

/root/cap/feed/retx.csvに、本当の穴の区間ごとにfrom_seq,to_seq,count,actionを書いてください。連続5個以上ならsnapshot、未満ならretransmitです。/root/cap/feed/retx.txtにretransmit_runs=、retransmit_seqs=、snapshot_runs=、snapshot_seqs=を書いてください。

ステップ4の本当の穴の区間を、長さで振り分けます。連続5個以上ならsnapshot、未満ならretransmitです。

フィード品質レポートを書く

/root/cap/feed/report.mdにレポートを書いてください。## 무슨 일이 있었나、## 갭、## 지연、## 돈으로 얼마인가、## 무엇을 고쳐야 하나の5つの節が必要です(見出しは韓国語で、順に「何があったか」「ギャップ」「遅延」「金額でいくらか」「何を直すべきか」という意味です)。

5つの節が必要です。遅延の節には必ずp99が入っている必要があり、対処の節には、ギャップの判定方式・監視指標・重複除外のうち何を変えるかを書いてください。