債券の最後の利払期間が通常より短かったり長かったりする場合、標準のPRICE関数では正確な価格が計算できません。このような端数最終期間(Odd Last Period)を持つ証券に対応した関数が ODDLPRICE です。
ExcelのODDLPRICE関数を使えば、満期前最終期間が標準クーポン長と異なる証券の理論価格を計算できます。コール条項が発動した債券や、満期日を後ろ倒しした債券などで活躍しますよ。
この記事では、ODDLPRICE関数の構文・引数・計算例と、PRICE・ODDFPRICE関数との使い分けを解説します。
ExcelのODDLPRICE関数とは?
ExcelのODDLPRICE関数(読み方:オッド・エル・プライス)は財務関数の一つです。最後の利払期間が端数(短端数または長端数)になっている証券の価格を、額面100円あたりで返します。
関数名の「ODD」は「端数・変則」を意味し、「L」は「Last(最後)」、「PRICE」は「価格」を表します。つまり「最後の利払期間が端数の場合の価格計算」ですね。
端数最終期間(Odd Last Period)とは
通常の債券は、各利払期間の長さがほぼ均一です。たとえば半年払い債券なら、各クーポン期間は約6か月になります。
しかし実務では、次のようなケースで最終期間だけ標準長と異なる債券が登場します。
- 短端数(Short Last Period): 最終クーポン期間が標準期間より短い
- 例: 半年払い債で最終クーポン日が9月15日、満期日が翌1月10日(約4か月)
- 長端数(Long Last Period): 最終クーポン期間が標準期間より長い
- 例: 半年払い債で最終クーポン日が9月15日、満期日が翌年8月10日(約11か月)
ODDLPRICE はどちらの端数にも対応しています。
ODDLPRICE が必要な場面
- コール条項が発動して満期日が前倒しになった債券の価格確認
- 満期日を後ろ倒しに変更した既発債の評価
- シンキングファンド方式で最終償還日が個別調整される債券
- 私募債や新興市場債券で満期日が標準サイクルと合わないケース
ODDLPRICE関数の構文と引数
ODDLPRICE関数の構文は次のとおりです。
=ODDLPRICE(settlement, maturity, last_interest, rate, yld, redemption, frequency, [basis])
引数は8つで、basis のみ省略可能です。ODDFPRICE関数(9引数)と比べて、issue と first_coupon の代わりに last_interest(直前利払日)が1つだけ指定されます。
| 引数 | 必須/省略 | 意味 |
|---|---|---|
| settlement | 必須 | 受渡日(証券の購入が完了する日) |
| maturity | 必須 | 満期日(償還日)。settlement より後の日付 |
| last_interest | 必須 | 直前利払日(最終利払期間の開始日)。settlement より前の日付 |
| rate | 必須 | 証券の年間クーポン利率(小数で指定。5%なら 0.05) |
| yld | 必須 | 証券の年間利回り(小数で指定。4%なら 0.04) |
| redemption | 必須 | 額面100円あたりの償還価格(通常は 100) |
| frequency | 必須 | 年間利払回数(1=年1回・2=半年払い・4=四半期払い) |
| basis | 省略可 | 日数計算基準(0〜4の整数。既定は0) |
各引数の日付関係
引数の日付間には次の制約があります。
last_interest < settlement < maturity
時系列で並べるとこうなります。
[直前利払日] ―→ [受渡日] ―→ [満期日]
last_interest settlement maturity
つまり「直前利払日と満期日の間に受渡日がある」状態です。この順序を守らないと #NUM! エラーになります。
last_interest(直前利払日)とは
last_interest は「最後から2番目の利払日」、つまり最終クーポン期間の開始日を指します。
たとえば半年払いで満期が2027年1月10日、最後から2番目の利払日が2026年7月10日なら、last_interest は 2026/7/10 を指定します。最終クーポン期間(2026/7/10〜2027/1/10)の長さがちょうど6か月ではない場合に、ODDLPRICE が使えるわけですね。
rate と yld の違い
- rate(クーポン利率): 証券に定められた年間の利率。満期まで変わらない
- yld(利回り): 市場での要求利回り。価格を変動させる要因
rate > yld なら価格はパー(100)より高く、rate < yld なら低くなります。
basis 引数の選び方
| 値 | 名称 | 主な対象 |
|---|---|---|
| 0(既定) | US 30/360 (NASD) | 米国社債 |
| 1 | Actual/Actual | 米国国債 |
| 2 | Actual/360 | 米国マネーマーケット |
| 3 | Actual/365 | 日本国内債券 |
| 4 | European 30/360 | 欧州社債 |
frequency 引数の選び方
| 値 | 利払頻度 | 主な対象 |
|---|---|---|
| 1 | 年1回払い | 一部の社債・外国債 |
| 2 | 半年払い | 国債・多くの社債 |
| 4 | 四半期払い | 地方債・一部社債 |
ODDLPRICE関数の基本的な使い方
実例で動きを確認しましょう。
例1: 短端数(短い最終クーポン期間)
Microsoft公式リファレンスのサンプル値です。
- 受渡日: 2008/2/7
- 満期日: 2008/6/15
- 直前利払日: 2007/10/15
- クーポン利率: 3.75%
- 利回り: 4.05%
- 償還価格: 100
- frequency: 2(半年払い)
- basis: 0(US 30/360)
=ODDLPRICE(DATE(2008,2,7), DATE(2008,6,15), DATE(2007,10,15), 0.0375, 0.0405, 100, 2, 0)
クーポン利率(3.75%)が利回り(4.05%)を下回るため、価格はパー(100)よりわずかに低い値(約99.88)になります。
例2: 長端数(長い最終クーポン期間)
- 受渡日: 2026/5/7
- 満期日: 2027/3/15
- 直前利払日: 2025/9/15(次回の予定利払日2026/3/15を超えて満期まで継続)
- クーポン利率: 3%
- 利回り: 2.5%
- 償還価格: 100
- frequency: 2(半年払い)
- basis: 1(Actual/Actual)
=ODDLPRICE(DATE(2026,5,7), DATE(2027,3,15), DATE(2025,9,15), 0.03, 0.025, 100, 2, 1)
クーポン利率(3%)が利回り(2.5%)を上回るため、価格はパー(100)より高くなります。
例3: セル参照を使った書き方
実務では引数をセル参照にすると、複数銘柄の価格比較が楽になります。
| セル | 内容 | 値 |
|---|---|---|
| B2 | 受渡日 | 2026/5/7 |
| B3 | 満期日 | 2027/1/10 |
| B4 | 直前利払日 | 2026/7/10 |
| B5 | クーポン利率 | 0.025 |
| B6 | 利回り | 0.022 |
| B7 | 償還価格 | 100 |
| B8 | frequency | 2 |
| B9 | basis | 3 |
数式は =ODDLPRICE(B2,B3,B4,B5,B6,B7,B8,B9) です。利回り(B6)を変更すれば価格が連動して再計算されます。日本国内債券を扱うときは basis を 3(Actual/365)にする慣行があるので覚えておきましょう。
ODDLPRICE・PRICE・ODDFPRICE の使い分け
端数利払期間の有無と位置によって、使う関数が変わります。
| 関数 | 端数の位置 | 補足 |
|---|---|---|
| PRICE | なし(標準) | 全クーポン期間が均等な債券 |
| ODDFPRICE | 最初の利払期間のみ端数 | 発行日〜第1クーポン日が不規則 |
| ODDLPRICE | 最後の利払期間のみ端数 | 最終クーポン日〜満期が不規則 |
実務でODDLPRICEが必要になる場面は限定的ですが、コール条項の発動や満期日変更がある債券では必須の関数です。両端が端数の場合は、まれですがアナリティカルな計算が必要になります。
ODDFPRICE との引数の違い
ODDFPRICE は引数が9つです。
=ODDFPRICE(settlement, maturity, issue, first_coupon, rate, yld, redemption, frequency, [basis])
ODDLPRICE は issue(発行日)と first_coupon(最初の利払日)が不要で、代わりに last_interest(直前利払日)を1つ指定します。最終期間の起点は last_interest、終点は maturity なので、引数が1つ少なく済みます。
PRICE 関数との引数の違い
PRICE 関数は引数が7つです。
=PRICE(settlement, maturity, rate, yld, redemption, frequency, [basis])
ODDLPRICE は last_interest が追加された8引数です。この引数があることで、最終期間の長さを正確に計算できます。
計算の仕組み(概要)
ODDLPRICE の計算は PRICE と基本的な考え方は同じで、将来のキャッシュフローを利回りで割り引いて合計します。違いは最終期間の扱いです。
短端数の計算ロジック
短端数(最終クーポン期間が1標準期間より短い)の場合、最終クーポンは期間に比例した金額になります。
最終クーポン額 ≒ 標準クーポン額 × (実際の日数 / 標準クーポン期間の日数)
満期日に支払われるのは「最終クーポン額 + 償還額」で、この合計を受渡日まで割り引いた現在価値が価格に反映されます。
長端数の計算ロジック
長端数(最終クーポン期間が1標準期間より長い)の場合、最終クーポンは複数のサブ期間に分割して計算されます。たとえば1.5期間分の長さなら、1標準期間分のクーポンに加えて、半端な部分のクーポンが上乗せされます。この処理は PRICE 関数では対応できません。
実務での活用例
コール条項発動債の価格確認
コーラブル債(発行体が満期前に償還できる債券)でコール条項が発動されると、当初予定より早い日が満期日になります。最終クーポン期間が標準より短くなるため、ODDLPRICE で価格を計算します。
満期日を後ろ倒しした既発債の評価
既存債券の満期日を交渉で延長した場合、最終クーポン期間が長端数になります。延長後の理論価格を ODDLPRICE で算出することで、保有債券の評価額を更新できますよ。
シンキングファンド方式の債券
減債基金方式の債券で最終償還日が個別調整される場合、ODDLPRICE が役立ちます。償還スケジュールごとに価格を再計算したいときに使ってください。
ODDLYIELD との組み合わせ
価格がわかっていて利回りを求めたい場合は ODDLYIELD 関数(ODDLPRICE の逆関数)を使います。
ODDLPRICE → 利回りを入力して価格を算出
ODDLYIELD → 価格を入力して利回りを算出
関連する財務関数の全体像
端数利払期間を扱う関数は ODDLPRICE 以外にもあります。
| 関数 | 用途 |
|---|---|
| ODDFPRICE | 第1期間端数の証券の価格 |
| ODDFYIELD | 第1期間端数の証券の利回り |
| ODDLPRICE | 最終期間端数の証券の価格 |
| ODDLYIELD | 最終期間端数の証券の利回り |
| PRICE | 標準(端数なし)の証券の価格 |
| YIELD | 標準(端数なし)の証券の利回り |
クーポン日のスケジュール管理には COUP 系関数を使います。
よくあるエラーと対処法
#NUM! エラー
| 原因 | 対処法 |
|---|---|
日付順制約違反(last_interest < settlement < maturity を満たさない) | 各引数の日付を見直す。特に last_interest が settlement より前か確認 |
| frequency が 1, 2, 4 以外 | 1(年1回)・2(半年)・4(四半期)のいずれかを指定 |
| basis が 0〜4 以外 | 0〜4の整数を指定 |
| rate が負の値 | 利率は0以上にする |
| yld が負の値 | 利回りは0以上にする |
| redemption が0以下 | 通常は100を指定 |
#VALUE! エラー
| 原因 | 対処法 |
|---|---|
| 日付引数が日付として認識されない | DATE関数で指定するか、日付形式のセルを参照する |
| 数値引数に文字列が入っている | rate・yld・redemption などを数値に変換 |
結果が異常値(負の価格・極端に大きい値)になる場合
| 原因 | 対処法 |
|---|---|
| frequency と市場慣行が合わない | 半年払い債なら 2、四半期払い債なら 4 を指定 |
| basis と市場慣行が合わない | 日本国内債券なら 3、米国国債なら 1 が一般的 |
| rate / yld の単位ミス(%表記と小数表記の混同) | 5%なら 0.05、4.05%なら 0.0405 のように小数で指定 |
特に日付順制約の #NUM! は実務でつまずきやすいポイントです。エラーが出たら最初にこの順序を疑ってみてくださいね。
ODDLPRICE関数を使えば、最終期間が不定期な債券の価格計算も正確に行えます。コール条項発動債や満期日変更債に出会ったら、PRICE関数ではなく ODDLPRICE で対応してください。
