ExcelのCOUPDAYBS関数の使い方|直前利払日から受渡日までの日数を計算する
債券を満期前に売買するとき、「直前の利払日から受渡日まで何日経っているか」を求めたい場面があります。これは経過利息(発生利息)を計算するための基礎情報です。手計算で日数を数えるのは大変ですし、半年払いや四半期払いだと利払日が複雑になりますよね。
ExcelのCOUPDAYBS関数を使えば、引数を4つ入れるだけで直前利払日から受渡日までの日数が一発で出ます。ACCRINT関数やPRICE関数とも内部で同じロジックを共有しており、債券業務の経過利息計算に欠かせない関数です。
この記事では、COUPDAYBS関数の構文・実例・経過利息の計算方法を解説します。COUPDAYSやCOUPDAYSNCとの関係も同僚に教える感覚で整理しました。
ExcelのCOUPDAYBS関数とは?
ExcelのCOUPDAYBS関数(読み方:クーポン・デイズ・ビフォア・セトルメント)は財務関数の一つです。直前の利払日から受渡日までの日数を返してくれます。
関数名は「COUPon DAYs Before Settlement」の略です。直訳すると「受渡日より前のクーポン期間の日数」となります。クーポン(定期利息)が付く債券で、利払日と受渡日の関係を日数で取り出すための関数です。
COUPDAYBS関数が必要な場面
債券は通常、半年や1年ごとに利息(クーポン)を受け取ります。投資家が満期前に債券を売買する場合、売主には「直前の利払日から売却日までの利息」を受け取る権利があります。これが経過利息(発生利息)です。
購入者は債券価格に加えてこの経過利息を売主に支払う仕組みです。COUPDAYBS関数は、その計算に必要な「経過した日数」を返してくれます。
COUPDAYBS関数で扱える債券
定期的にクーポンを支払う債券が対象になります。
- 利付国債(10年債・5年債など)
- 利付社債
- 地方債
- 半年払い債券
- 四半期払い債券
割引証券(TB・CP・ゼロクーポン債)や満期一括利払い債は対象外です。これらにはYIELDDISC関数やYIELDMAT関数を使ってくださいね。
COUPDAYBS関数の構文と引数
COUPDAYBS関数の構文は次のとおりです。
=COUPDAYBS(settlement, maturity, frequency, [basis])
引数は4つで、basisのみ省略可能です。
| 引数 | 必須/省略 | 意味 |
|---|---|---|
| settlement | 必須 | 受渡日(証券の購入が完了する日) |
| maturity | 必須 | 満期日(償還日)。settlementより後の日付 |
| frequency | 必須 | 年間利払回数(1=年1回・2=半年1回・4=四半期1回) |
| basis | 省略可 | 日数計算基準(0〜4の整数。既定は0) |
settlement と maturity の関係
settlementは実際に代金を払って証券を受け取る日です。約定日(取引が成立した日)とは別物なので注意してください。maturityはsettlementより後でなければ#NUM!エラーになります。
frequency 引数の選び方
年間の利払回数を指定します。指定できる値は3つだけです。
| 値 | 利払頻度 | 主な対象 |
|---|---|---|
| 1 | 年1回払い | 一部の社債・外国債 |
| 2 | 半年払い | 国債・多くの社債 |
| 4 | 四半期払い | 地方債・一部社債 |
3(4か月ごと)や12(毎月払い)は指定できません。#NUM!エラーになります。
basis 引数の選び方
日数の数え方を指定します。市場慣行に合わせて選びます。
| 値 | 名称 | 主な対象 |
|---|---|---|
| 0(既定) | US 30/360 (NASD) | 米国社債 |
| 1 | Actual/Actual | 米国国債(実日数計算) |
| 2 | Actual/360 | 米国マネーマーケット |
| 3 | Actual/365 | 日本国内債券 |
| 4 | European 30/360 | 欧州社債 |
実務では国債なら basis=1、日本国内の社債なら basis=3 を使うケースが多いですよ。
COUPDAYBS関数の基本的な使い方
実例で動きを確認していきましょう。
例1: 半年払い国債の経過日数
10年物国債(半年払い)を満期前に購入する場面です。
- 受渡日: 2026/5/6
- 満期日: 2030/11/6
- frequency: 2(半年払い)
- basis: 1(Actual/Actual)
セルへの入力例は次のとおりです。
=COUPDAYBS(DATE(2026,5,6), DATE(2030,11,6), 2, 1)
結果は 181 が返ります。直前の利払日2025/11/6から受渡日2026/5/6までの実日数が181日であることを示します。
例2: 年1回払い社債の経過日数
年1回払い(frequency=1)の社債で、受渡日が利払日からかなり経過しているケースです。
- 受渡日: 2026/5/6
- 満期日: 2029/9/15
- frequency: 1(年1回払い)
- basis: 1
=COUPDAYBS(DATE(2026,5,6), DATE(2029,9,15), 1, 1)
結果は 233 です。直前の利払日2025/9/15から受渡日2026/5/6までの実日数233日が返ります。
例3: 四半期払い債券の経過日数
四半期払い(frequency=4)の債券で、受渡日が利払日の直後にあたるケースです。
- 受渡日: 2026/5/6
- 満期日: 2028/3/15
- frequency: 4(四半期払い)
- basis: 1
=COUPDAYBS(DATE(2026,5,6), DATE(2028,3,15), 4, 1)
結果は 52 です。直前の利払日2026/3/15から受渡日2026/5/6までの52日が返ります。
引数をセル参照にする書き方
実務ではパラメータをセルに入れてセル参照で計算するのが便利です。
| セル | 内容 | 値 |
|---|---|---|
| B2 | 受渡日 | 2026/5/6 |
| B3 | 満期日 | 2030/11/6 |
| B4 | frequency | 2 |
| B5 | basis | 1 |
数式は =COUPDAYBS(B2, B3, B4, B5) です。
受渡日(B2)を変えると経過日数が即座に再計算されます。日付ごとの経過利息推移を確認したいときに便利ですよ。
経過利息の計算式とCOUPDAYBSの役割
COUPDAYBS関数は経過利息計算の「分子」を提供する関数です。経過利息の計算式は次のとおりです。
経過利息 = 額面 × 年利率 ÷ frequency × (COUPDAYBS ÷ COUPDAYS)
各要素の意味は次の表のとおりです。
| 要素 | 意味 |
|---|---|
| 額面 | 債券の額面金額(face value) |
| 年利率 | クーポン利率(年率) |
| frequency | 年間利払回数 |
| COUPDAYBS | 直前利払日から受渡日までの日数(分子) |
| COUPDAYS | クーポン期間全体の日数(分母) |
経過利息の計算例
額面1,000,000円・年率1.5%・半年払いの国債を、受渡日2026/5/6に購入するケースです。
- 額面: 1,000,000円
- 年率: 1.5%
- frequency: 2
- 受渡日: 2026/5/6
- 満期日: 2030/11/6
- basis: 1
経過日数とクーポン期間日数を取り出します。
=COUPDAYBS(DATE(2026,5,6), DATE(2030,11,6), 2, 1)
=COUPDAYS(DATE(2026,5,6), DATE(2030,11,6), 2, 1)
それぞれ 181 と 365 が返ります(半年=181日のケース)。経過利息の数式に当てはめます。
=1000000 * 0.015 / 2 * (COUPDAYBS(DATE(2026,5,6),DATE(2030,11,6),2,1) / COUPDAYS(DATE(2026,5,6),DATE(2030,11,6),2,1))
結果は 7,500円 です。購入者は債券価格に加えて、この7,500円を売主に支払うことになります。
ACCRINT関数を使えばこの計算は一発でできますが、内部ではCOUPDAYBSと同じロジックが動いています。仕組みを理解しておくと、ACCRINTの結果を検算する際にも役立ちますよ。
COUPDAYBS・COUPDAYS・COUPDAYSNCの関係
COUPDAYBSと似た名前の関数が2つあります。3つをセットで理解すると、債券のクーポン期間が見えるようになります。
| 関数 | 返す値 | 用途 |
|---|---|---|
| COUPDAYBS | 直前利払日〜受渡日の日数 | 経過利息の分子 |
| COUPDAYS | クーポン期間全体の日数 | 経過利息の分母 |
| COUPDAYSNC | 受渡日〜次の利払日の日数 | 残り日数 |
三関数の恒等式
3つの関数の関係を式で表すと次のようになります。
COUPDAYBS + COUPDAYSNC = COUPDAYS
「経過した日数」+「残りの日数」=「クーポン期間全体の日数」という素直な関係です。クーポン期間を時間軸でイメージするとわかりやすいですよ。
具体例で確認する
半年払い国債(受渡日2026/5/6・満期日2030/11/6・frequency=2・basis=1)で確認します。
=COUPDAYBS(DATE(2026,5,6), DATE(2030,11,6), 2, 1)
=COUPDAYS(DATE(2026,5,6), DATE(2030,11,6), 2, 1)
=COUPDAYSNC(DATE(2026,5,6), DATE(2030,11,6), 2, 1)
結果は次のとおりです。
| 関数 | 戻り値 | 意味 |
|---|---|---|
| COUPDAYBS | 181 | 経過日数(2025/11/6→2026/5/6) |
| COUPDAYS | 365 | クーポン期間全体(2025/11/6→2026/11/6) |
| COUPDAYSNC | 184 | 残り日数(2026/5/6→2026/11/6) |
検算すると 181 + 184 = 365 で恒等式が成立します。
直前・次の利払日も知りたいとき
具体的な利払日(日付)が知りたい場合はCOUPPCD関数とCOUPNCD関数を使います。
| 関数 | 返す値 |
|---|---|
| COUPPCD | 直前の利払日(previous coupon date) |
| COUPNCD | 次の利払日(next coupon date) |
=COUPPCD(DATE(2026,5,6), DATE(2030,11,6), 2, 1)
=COUPNCD(DATE(2026,5,6), DATE(2030,11,6), 2, 1)
それぞれ 2025/11/6 と 2026/11/6 が返ります。日付として直接取り出したいケースに便利ですよ。
ACCRINT関数・PRICE関数との連携
COUPDAYBSは単独でも使えますが、他の財務関数と組み合わせると本領を発揮します。
ACCRINT関数との関係
ACCRINT関数は経過利息(金額)を直接返す関数です。内部ではCOUPDAYBSと同じロジックを使っています。
=ACCRINT(issue, first_interest, settlement, rate, par, frequency, [basis], [calc_method])
| 関数 | 返す値 |
|---|---|
| COUPDAYBS | 経過した日数(数値) |
| ACCRINT | 経過利息の金額(円) |
ACCRINTを使えば経過利息額が一発で出ますが、引数の発行日や初回利払日まで把握しておく必要があります。COUPDAYBS+COUPDAYSの組み合わせなら受渡日と満期日だけで済むため、シンプルな計算には向いています。
PRICE関数との関係
PRICE関数は債券のクリーン価格(経過利息抜きの価格)を返します。市場で「ダーティ価格(経過利息込みの価格)」を求めたい場合があります。そのときはPRICEの結果に経過利息を足してください。
ダーティ価格 = クリーン価格(PRICE) + 額面 × 年利率 ÷ frequency × (COUPDAYBS ÷ COUPDAYS)
債券の取引明細書では「価格」と「経過利息」が分けて記載されています。これはクリーン価格とダーティ価格の関係を反映したものですよ。
関連する財務関数の全体像
利付債・割引債・満期一括利払い債で使う関数を整理します。
| 債券タイプ | 価格関数 | 利回り関数 | 経過日数関数 |
|---|---|---|---|
| 定期利払い債(クーポン付) | PRICE | YIELD | COUPDAYBS(本記事) |
| 割引証券(TB・CP) | PRICEDISC | YIELDDISC | (該当なし) |
| 満期一括利払い債 | PRICEMAT | YIELDMAT | (該当なし) |
COUPDAYBSは「定期利払い債(クーポン付債券)」専用の関数だと覚えておきましょう。
よくあるエラーと対処法
#NUM! エラー
次のいずれかが原因です。
| 原因 | 対処法 |
|---|---|
| settlement ≧ maturity | 受渡日が満期日より前になるよう修正 |
| frequency が 1・2・4 以外 | 1、2、4 のいずれかを指定 |
| basis が 0〜4 以外 | 0〜4の整数を指定 |
frequency に3(4か月ごと)や12(毎月払い)を指定するミスが多いです。Excelの仕様上、利払回数は1・2・4のみ対応しています。
#VALUE! エラー
settlementやmaturityが日付として認識されていないことが原因です。文字列を直接入れると発生します。
誤: =COUPDAYBS("2026-05-06", "2030-11-06", 2, 1)
正: =COUPDAYBS(DATE(2026,5,6), DATE(2030,11,6), 2, 1)
セル参照を使う場合も、参照先のセルが「日付型」になっているか確認してください。書式が「文字列」になっていると同じエラーが出ます。
#NAME? エラー
関数名のスペルミスが原因です。「COUPDAYB」「COUP_DAYBS」のような名前は存在しません。Excelの入力候補から選ぶようにしましょう。
結果が想定と違う場合
basis引数の選択ミスで日数がずれるケースがあります。
| 想定される違い | 原因 |
|---|---|
| 米国国債なのに日数が小さい | basis=0(30/360)を使っている可能性 |
| 日本国内債券で米国慣行の値になる | basis=1ではなくbasis=3を試す |
| 30日と31日の月で日数が同じ | basis=0または4は月末を30日固定で扱う |
basisを変えて結果を見比べると違いがすぐわかりますよ。
まとめ
ExcelのCOUPDAYBS関数は、定期利払い債券の「直前利払日から受渡日までの日数」を返す財務関数です。本記事のポイントを振り返ります。
- 構文:
=COUPDAYBS(settlement, maturity, frequency, [basis]) - 対象: 利付国債・利付社債・地方債など定期的にクーポンを支払う債券
- frequency: 1(年1回)・2(半年)・4(四半期)のみ有効
- 恒等式: COUPDAYBS + COUPDAYSNC = COUPDAYS が常に成立
- 経過利息: 額面 × 年利率 ÷ frequency × (COUPDAYBS ÷ COUPDAYS) で計算
- basis: 米国国債=1、日本国内債券=3が市場慣行
- 連携先: ACCRINT関数やPRICE関数の内部ロジックでも使われる
債券の経過日数が求まったら、同シリーズのYIELD関数・PRICEMAT関数・YIELDDISC関数・RECEIVED関数もあわせて確認してみてください。証券種別ごとの関数使い分けを体系的に身につけられますよ。
