0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

第9回:Tonar vs 3mTibor テナースワップ

0
Last updated at Posted at 2026-04-04

(2026/4/11: 各レグのキャッシュフローを9.4節に追加)

今回はTonarと3ヶ月Tiborを交換するテナースワップ(tenor swap)のコードを紹介する。「Pythonで学ぶ債券·金利デリバティブ」(以下 テキスト)ではテナースワップの具体例について、説明をしていない。テナースワップの定義としては「同じ通貨の2つのレグがともに変動金利のスワップで、変動金利のテナー(期間)が異なるもの」だろう。

東京市場において、最も取引量のあるテナースワップは、日本証券クリアリング機構(以下 JSCC) が別途フィクシング値を発表している Tonarと3ヶ月Tiborの5年満期 テナースワップであろう。以下 ブローカースクリーンにならい、このスワップを3mDTvTO と参照するが、このフィクシング値はJSCCのWebページには公表されていないようだ。

JSCC-2025-01-20-data.png
$\qquad\qquad\qquad\qquad$(図9-1:2026-01-20 JSCC Fixingデータ)

なお、第8回 記事で使った JSCCの2026年1月20日引けデータに記載された5Y 46.25bp (上図 右列)と この3mDTvTO テナースワップ のフィクシングの値とは異なる点に注意。この相違に関しては 9-3節で説明する。

9-1. ベーシスからTiborデータを算出

直前に記したように、3mDTvTOテナースワップの値とTiborスワップレートを算出するベーシスのFixing値(図9-1のベーシスデータ)が異なっているため、下コードではベーシスからTiborスワップレートを算出するコードを書いた。(理由は9-3節で説明する年4回利払いの調整をするため)

JSCC-2025-01-20-curveCODE.png
$\qquad\qquad\qquad\qquad$(図9-2:ベーシスからTiborデータを算出するコード)

第8回の図8-1 10行目では Tonarスワップレート+ベーシス の計算済み数値を 直接 tbDATA にセットした。上コードの21行目で作成されるtbDATAは第8回目のtbDATAと同じ値になっている。以下はコードについての補足説明。

  • 10行tbDATAリストにはFRAまでのデータをセットし、スワップレートは入れていない

  • 13, 19行:ベーシスのデータは13行目のtbBSSリストにセットし、19行目でtbBSSリストから、テナーがキーとなる辞書bssDICを作成

    • 19行目が いわゆる 辞書包括表記 のコード
  • 20, 21行:辞書の.getメソッドを使い、Tonar スワップレートにベーシスを加算し、tbDATAaリストを作成。21行目でtbDATAへ結合

( 19行目でリストから辞書を作成し、20行目でキーを基準とし、Tonarレートにベーシスを加算させる処理を たった2行で書ける Python は優秀ですね)

$\quad$

tbDATAを計算後、次のセルで、Tonarと3mTiborの2つのカーブオブジェクトを作成。

  • この部分は第8回 図8-2と同じであり、説明と出力結果は省略

    (tnはTona, tbはTiborの略はいつもと同じ)

tnCv,tbCv20260120basispng

9-2. テナースワップのコード

バニラスワップや OIS にはコンストラクタが用意されているが、テナースワップ用のコンストラクタは無いため、下図 QLPドキュメント (テキスト 図1.6 参照)Swapコンストラクタに2つの変動レグを与えて、スワップオブジェクトを作成する。

swapconstpng

次のセルが今回の目標コードであり、2行目のspdRT=-46.84959bps (以下 46.85bp)で2つのレグの時価が等しくなり、出力結果 SwapNPV:-0.00を得る。

Tonar3mTiborswappng$\qquad\qquad\qquad\qquad$(図9-3:テナースワップ)

以下 このコードの各行を説明するが、重要な点は 11行目でSwapコンストラクタを使用するため、8,9行目で2つの変動レグを準備した部分。

  • 2,3行:effDTとmatDTの差は5年、つまり 5年テナースワップを計算

  • 6, 7行:2つのレグのスケジュールの定義に関しての説明は不要であろう

    • ただし、2つのレグの利払頻度はpDfrqApDfrqQが市場慣例である
  • 8行IborLeg コンストラクタで 3mTiborの変動レグを作成

    • このコンストラクタのQLPドキュメントの図テキスト p233 を参照

    • かなり癖のあるコンストラクタで、8行目からも判るように、第1引数と第6~8引数はリストで与える必要がある

      • 第7引数 gr1 はテキスト p233の図にあるgearings=1 の短縮形で、myABBRモジュールで定義 (単に[1]と書いてもよいが、"マジックナンバー"を回避)

      • 第8引数 spdRT はspread rate の略で、2行目で定義 (bpsもmyABBRで定義)

  • 9, 10行:10行目 右端の.overnightLeg()OvernightIndexedSwap オブジェクトのメソッドで、文字通り オーバーナイトスワップ オブジェクトのオーバーナイト変動レグを取り出している

    • OvernightIndexedSwapコンストラクタはテキスト 図3.4 (p83) の7行目 を参照

    • 本来 下図のようにOvernightLegコンストラクタが用意されているが、執筆時点では2日ラグが対応できていないため、 overnightLegメソッドを使った
      OvernightLegconstpng

  • 11, 14行ql.Swap(tnLeg, tbLeg) によって、tntbSwOBJオブジェクトを作成

    • このスワップの受け払いはレグの順序で決定され、第1引数のtnLeg が払い、第2のtbLegが受け取りで、 (pay,rec)の順

    • 最初のレグは 0番、2つ目は 1番で参照 (11行目のコメントを参照)

    • 14行目はこの参照法で、tnLeg と tbLeg の時価をlegNPV(0) , legNPV(1) で出力

9-3. JSCC 46.25bpとspdRT 46.85bp の相違に関して

図9-3で算出したspdRT:-46.85bp は 有料情報端末でもほぼ同じ値となる。ここで JSCCの発表した図9-1の5年ベーシスが 46.25bp となっていることを思い出そう。本来、この2つは一致すべきであるが、0.6bpの差がある。

第3回:「シリアルFRAを持つTiborカーブの構築」の 3-1節で記したように市場慣例は 建値されたベーシスをTonarレートに単純に加算させ、3ヶ月Tiborカーブや6ヶ月Tiborカーブを算出している。筆者はこの利払頻度を無視した市場慣例が 0.6bpの相違の原因と考えている。

具体的に記そう。

  • Tonarカーブは年1回レート (Annual) で、図9-1の5年は1.6275% 。それに46.25bpを足し、図9-2で3ヶ月Tiborカーブ 5年レートを2.09%(年4回, Quaterly)とした

  • この計算の問題点は年1回レートの1.6275%に年4回レートのベーシス46.25bpを単純に 足している点にある

  • 年1回のTonarレート 1.6275% を年4回レートに計算し直してから、ベーシス46.25bpを加算しなければいけない

    • 年1回と年4回の換算は次式となり、$r_q$ について解くと 年4回レートは 1.61766%

$$
1 + r_{a} = \left(1 + \frac{r_{q}}{4}\right)^4
$$

  • 年1回1.6275%と年4回1.61766%の差は約 1bp あり、0.6bp の差 をある程度説明できる

ベーシス スプレッドを扱う場合、利払頻度は 常に考慮すべきであることを覚えておこう。そして東京市場では、この点をいい加減に扱っているように考える。

ただ、上記の年4回への調整をTonarカーブのデータ全体に行い、再度 図9-3のテナースワップを評価したが、残念ながら、46.25bp で NPV=0 とさせることは出来なかった。

  • 図9-2でTiborレートをベーシスから計算できるようにした理由は、Tonarカーブを年4回で算出し、Tiborレートを計算させることが目的だったが、失敗に終わった
  • ただし、図9-2のコードは俊逸だろう

正確な計算を示すことが出来ないので、この記事では東京市場が間違っていると断言はしない。

9-4. 各レグのキャッシュフロー表

今回のテナースワップのキャッシュフローが表示できるように、テキスト 58ページ で説明した swapCashFlow関数に5番目の引数 type='t' ('t'はtenorの略)を追加した。

新しいswapCashFlow関数のコードはif文を追加した程度の修正であり、古いコードと大差ないため、説明は省略する。

下図9-4の上セルはTonarレグ、下セルがTiborレグのキャッシュフローで、swapCashFlow関数の引数と関連する手計算に関して、多少 補足説明をする。

tnrSwap-CF.png$\qquad\qquad\qquad\qquad$(図9-4: (上) Tonarレグ $\ \ $ (下) Tiborレグ )

(上セル:Tonarレグ)

  • swapCashFlow関数の第2引数はtnCvOBJが指定され、出力されるDF列はTonarカーブのディスカウントファクター
    • このDFを使って、コード3行目でTonarレグの現在価値を手計算させ、図9-3のlegNPV(0) と同じ値を算出
  • コード2行目のdfDSP関数はデータフレームを表示させる関数として、myABBRモジュールで定義 ( 詳細は第8回記事の補足 を参照 )

(下セル:Tiborレグ)

  • swapCashFlow関数の第2引数はtbCvOBJを指定することで、DF列がTiborのディスカウントファクターとなり、rate列はTiborのフォワードレートが表示される
    • コード3行目は rate列に表示されたTiborフォワードレートを手計算で、チェックした
      • ツーカーブのDFに関しては、第8回記事の8-3節を参照
      • ( 確認のために記すが、上セルのrate列のフォワードレートはTonarをデイリーコンパウンドしたレートで計算方法はテキスト 3.1.4節を参照 )
    • なお Tiborレグの現在価値を手計算するには、amount列の金額をpayDate列の日付のTonarカーブのディスカウントファクターと掛けて、算出するコードを書くこととなる

まとめ

  • リストから辞書を作成する辞書包括表記 と 辞書キーによるベーシスの加算コード (図9-2)
  • テナースワップのコードとキャッシュフロー表 (図9-3, 9-4)
  • ベーシスの利払回数を考慮したTonarレートの調整
  • 記事中のコードはテキストのサポートページ より、取得可能。(今回のコードはq09-TenorSwap.ipynb)
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?