(2026/4/11: 各レグのキャッシュフローを9.4節に追加)
今回はTonarと3ヶ月Tiborを交換するテナースワップ(tenor swap)のコードを紹介する。「Pythonで学ぶ債券·金利デリバティブ」(以下 テキスト)ではテナースワップの具体例について、説明をしていない。テナースワップの定義としては「同じ通貨の2つのレグがともに変動金利のスワップで、変動金利のテナー(期間)が異なるもの」だろう。
東京市場において、最も取引量のあるテナースワップは、日本証券クリアリング機構(以下 JSCC) が別途フィクシング値を発表している Tonarと3ヶ月Tiborの5年満期 テナースワップであろう。以下 ブローカースクリーンにならい、このスワップを3mDTvTO と参照するが、このフィクシング値はJSCCのWebページには公表されていないようだ。

$\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回利払いの調整をするため)

$\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の略はいつもと同じ)
9-2. テナースワップのコード
バニラスワップや OIS にはコンストラクタが用意されているが、テナースワップ用のコンストラクタは無いため、下図 QLPドキュメント (テキスト 図1.6 参照) のSwapコンストラクタに2つの変動レグを与えて、スワップオブジェクトを作成する。
次のセルが今回の目標コードであり、2行目のspdRT=-46.84959bps (以下 46.85bp)で2つのレグの時価が等しくなり、出力結果 SwapNPV:-0.00を得る。
$\qquad\qquad\qquad\qquad$(図9-3:テナースワップ)
以下 このコードの各行を説明するが、重要な点は 11行目でSwapコンストラクタを使用するため、8,9行目で2つの変動レグを準備した部分。
-
2,3行:effDTとmatDTの差は5年、つまり 5年テナースワップを計算 -
6, 7行:2つのレグのスケジュールの定義に関しての説明は不要であろう- ただし、2つのレグの利払頻度は
pDfrqAとpDfrqQが市場慣例である
- ただし、2つのレグの利払頻度は
-
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オブジェクトのメソッドで、文字通り オーバーナイトスワップ オブジェクトのオーバーナイト変動レグを取り出している -
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関数の引数と関連する手計算に関して、多少 補足説明をする。
$\qquad\qquad\qquad\qquad$(図9-4: (上) Tonarレグ $\ \ $ (下) Tiborレグ )
(上セル:Tonarレグ)
-
swapCashFlow関数の第2引数はtnCvOBJが指定され、出力されるDF列はTonarカーブのディスカウントファクター- このDFを使って、コード3行目でTonarレグの現在価値を手計算させ、図9-3の
legNPV(0)と同じ値を算出
- このDFを使って、コード3行目でTonarレグの現在価値を手計算させ、図9-3の
- コード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カーブのディスカウントファクターと掛けて、算出するコードを書くこととなる
- コード3行目は rate列に表示されたTiborフォワードレートを手計算で、チェックした
まとめ
- リストから辞書を作成する
辞書包括表記と 辞書キーによるベーシスの加算コード(図9-2) - テナースワップのコードとキャッシュフロー表
(図9-3, 9-4) - ベーシスの利払回数を考慮したTonarレートの調整
- 記事中のコードはテキストのサポートページ より、取得可能。
(今回のコードはq09-TenorSwap.ipynb)


