LBOモデルやキャッシュスイープモデルを組んでいて、ある日突然モデル全体が0だらけになった経験はないでしょうか。原因の多くは循環参照のループにエラーが流れ込み、抜けなくなってしまうことです。この事故を一発で復旧できる仕掛けが、本記事で解説する「循環参照スイッチ(サーキットブレーカー)」です。
本記事では、そもそもなぜ財務モデルに循環参照が生まれるのかという構造から、反復計算の危険性、スイッチの具体的な実装手順、そして循環を最初から使わない代替策まで、初学者向けに順を追って解説します。
なぜ財務モデルに循環参照が生まれるのか
循環参照とは、ある数式が直接または間接に自分自身のセルを参照してしまう状態です。財務モデルで最も典型的なのは、支払利息まわりの次のループです。
支払利息 → 当期純利益 → 返済に回せるキャッシュ → 期末借入残高
→ 期中平均残高 → 支払利息(最初に戻る)
利息を「期中平均残高 ×金利」で計算しようとすると、期末残高が必要になります。ところが期末残高は、利息を払った後に残るキャッシュで返済した結果です。つまり利息を知るには残高が、残高を知るには利息が必要という鶏と卵の関係になり、数式が一周して自分に戻ってきます。3表連動モデルで利息・リボルバー・キャッシュをつなぐと、ほぼ必然的にこの構造が現れます。
対処方針は2つ:回すか、断つか
循環参照への向き合い方は、世界の実務でも大きく2つの流派に分かれます。
- Excelの反復計算を有効にして循環を「回す」:投資銀行のモデルで広く見られる方式。本記事のスイッチはこの流派の安全装置です。
- 循環を構造的に「断つ」:利息を期首残高ベースで計算するなどして、ループ自体を作らない方式。
参考までに、モデル設計の業界規約であるFAST Standard(読みやすく監査しやすいモデルの設計原則を定めた規格)には「意図的な循環参照を含むモデルをリリースしてはならない」という記載があり、英国の勅許会計士協会(ICAEW)のモデリング規範も反復計算を無効にして循環は代数的に解く立場を取る、という意見や見解もあるようですが、実務では拡張性の高さから循環参照を入れて「回す」方が一般的と思われます。どちらを選ぶにせよ、仕組みとリスクを理解したうえで選ぶことが重要です。
反復計算ONの何が危険なのか
Excelの「反復計算」を有効にすると、循環参照を含む数式を指定回数だけ繰り返し計算し、値が収束したところで止めてくれます。便利な半面、3つの代償があります。
- エラーの増殖:ループ内のどこか1セルに#DIV/0!や#VALUE!が入ると、エラーが循環全体に伝播します。しかも反復計算中はエラーがループ内に固定化され、原因セルを直しても全体が復旧しないことがあります。これが冒頭の「モデルが0だらけ」の正体です。
- 誤りの検出が困難になる:反復計算を有効にすると、Excelは新たな循環参照への警告を出さなくなります。意図した循環と、ミスで生まれた循環の区別がつかなくなるのです。
- 監査性の低下:レビュアーが数式を追跡しても起点が見つからず、検証に時間がかかります。
循環参照スイッチの実装手順
スイッチの考え方は単純です。循環の入口に1か0を取る制御セルを置き、0にした瞬間にループへ流れる値を強制的にゼロへ落とす。電気回路のブレーカーのように、事故時に回路を遮断してエラーを掃き出すわけです。
- スイッチセルを作る:入力セクションに専用セルを1つ用意し、1(ON)を入力します。名前ボックスから「Circ」などの名前を定義しておくと数式が読みやすくなります。
- 循環に入る数式にスイッチを組み込む:利息計算を「=IF(Circ=1, 期中平均残高 × 金利, 0)」のように、IF関数でスイッチを組み込みます。「=期中平均残高 × 金利 × Circ」とスイッチを掛け算で挟む流儀もあり挙動は同じですが、当サイトのDCFモデル構築解説(循環参照のオン・オフスイッチを作る回)ではIF関数方式で実装しているため、本記事もIF関数方式で統一します。
- エラー発生時の復旧:Circを0にする → 再計算(F9)でループ内に0が流れてエラーが浄化される → エラーの根本原因を修正する → Circを1に戻して再計算。この4手順で復旧完了です。
なお、エラーを見せたくないからとIFERROR関数でループ内のエラーを握りつぶすのは厳禁です。エラーは「モデルのどこかが壊れている」という重要なシグナルであり、それを隠すと壊れたまま気づけないモデルになります。スイッチは「エラーを直すための道具」、IFERRORの乱用は「エラーを見なかったことにする悪習」と区別してください。
Excelの反復計算の設定方法
スイッチとセットで、反復計算の設定も確認しておきます。Windows版Excelでは「ファイル → オプション → 数式」、Mac版では「Excel → 環境設定 → 計算方法」を開き、「反復計算を行う」にチェックを入れます。最大反復回数は100、変化の最大値は0.001が一般的な初期値です。変化の最大値とは「前回の計算結果との差がこの値を下回ったら収束とみなして止める」という閾値で、財務モデルの精度としては0.001で十分です。
数値例:循環が収束していく様子を見る
反復計算が何をしているのかを、手計算で再現してみましょう。前提は、期首借入残高100、金利5%、利息支払い前のフリーキャッシュフロー30で、キャッシュは全額返済に充当、利息は期中平均残高(期首と期末の平均)に金利を掛けて計算します。
| 反復回 | 利息の仮値 | 返済額(30−利息) | 期末残高 | 期中平均残高 | 再計算した利息 |
|---|---|---|---|---|---|
| 1回目 | 5.000 | 25.000 | 75.000 | 87.500 | 4.375 |
| 2回目 | 4.375 | 25.625 | 74.375 | 87.188 | 4.359 |
| 3回目 | 4.359 | 25.641 | 74.359 | 87.180 | 4.359 |
1回目は期首残高ベースの利息5.000から出発し、2回目で4.375、3回目で4.359となり、以降は値が動かなくなります。つまりこのモデルの整合的な利息は約4.36です。Excelの反復計算は、まさにこの「仮置き → 再計算 → 差が縮まる」を高速で繰り返しているにすぎません。ブラックボックスに見える機能も、中身はこの程度に素朴なのです。
循環を使わない代替策
「断つ」派の代表的な手法も押さえておきましょう。
- 期首残高ベースの利息計算:利息を「期首残高 × 金利」で計算すれば、期末残高への依存が消えてループ自体が発生しません。期中の残高変動が緩やかなら誤差はわずかで、安定性とのトレードオフとして十分に合理的な近似です。
- 値の貼り付けによる固定(コピー・ペースト方式):循環部分の計算結果を手動またはマクロで値として貼り付け、ループを切る方式。再計算のたびに貼り直しが必要になる点が弱点です。
- 代数的に解く:本記事の数値例なら、利息をx と置けば x = 5% ×(100 + 100 −(30 − x))÷ 2 という一次方程式になり、反復なしで解けます。シンプルな構造なら最もクリーンな解法です。
実務での使い分けの目安は、「配布先が広い・長く使い回すモデルほど循環を断つ」です。自分だけが触る分析用モデルならスイッチ付きの循環で精緻に、クライアントに納品するモデルや月次で更新し続けるモデルなら期首残高ベースで安定的に、という判断が現実的です。
事故からの復旧を再現する:あるアナリストの15分
スイッチの価値は、事故が起きたときに初めて実感できます。典型的な事故と復旧の流れを、ストーリー仕立てで再現してみましょう。
あるアナリストが、完成間近のLBOモデルに感応度テーブルを追加していました。前提の1つに誤って0を入力した瞬間、どこかの数式で0除算が発生。#DIV/0!が利息の循環ループに流れ込み、再計算のたびにエラーがループを一周して、P/LもB/Sもデットスケジュールも一面のエラー表示になりました。原因の前提セルを直しても、ループ内に固定化されたエラーは消えません。ここからの復旧手順が次の5ステップです。
- 慌てて上書き保存しない:壊れた状態で保存すると、正常なバックアップを失います。まず手を止めます。
- スイッチを0にする:Circセルに0を入力し、F9で再計算。利息計算がゼロに落ち、ループに0が流れてエラーが洗い流されます。
- 根本原因を直す:エラーの発端になった入力ミス(この例では0の誤入力)を修正します。スイッチOFFの状態ならエラー表示が消えているため、原因セルの特定も容易です。
- スイッチを1に戻す:F9を数回押し、反復計算が収束して値が安定することを確認します。
- チェックセルを確認する:B/Sバランスなどの常駐チェックがすべてOKに戻っていることを見届けて、復旧完了です。
スイッチがないモデルで同じ事故が起きると、選択肢は「壊れる前のバックアップに戻ってやり直す」か「循環部分の数式を一度すべて削除して組み直す」しかありません。数十分から数時間の損失です。スイッチがあれば、上記の流れは数分で終わります。保険としてのコスト(セル1つと掛け算1か所)に対して、リターンがあまりに大きい仕掛けだと分かるはずです。
代数的に解く:循環を方程式で消す
本文の「循環を断つ」流派の中で最もエレガントな手法が、循環を方程式として解いてしまう方法です。先ほどの数値例(期首残高100、金利5%、利息前キャッシュフロー30、全額返済充当)で導出してみます。利息をx、期首残高をB、利息前キャッシュフローをCF、金利をrと置きます。
期末残高 E = B −(CF − x)= B − CF + x
x = r ×(B + E)÷ 2
= r ×(2B − CF + x)÷ 2
両辺を2倍して整理すると
x ×(2 − r)= r ×(2B − CF)
∴ x = r ×(2B − CF)÷(2 − r)
数値を代入すると、x = 0.05 ×(200 − 30)÷(2 − 0.05)= 8.5 ÷ 1.95 = 約4.359。本文の反復計算がたどり着いた収束値とぴったり一致します。つまり、この式をそのままExcelの1つの数式として入力すれば、反復計算もスイッチも不要で、しかも厳密解が一発で得られるのです。
では、なぜ実務の全員がこの方法を使わないのか。理由は拡張性です。返済が複数トランシェに分かれ、キャッシュスイープの割合が変わり、最低現金の制約が絡む……と構造が複雑になるほど、方程式は手に負えなくなります。代数的解法は「循環が1〜2本のシンプルな構造」でこそ輝く手法であり、複雑なモデルでは期首残高ベースの近似か、スイッチ付きの反復計算に軍配が上がります。手持ちの選択肢として知っておき、構造のシンプルさに応じて使い分けるのが賢い付き合い方です。
収束の「揺れ」を検知する
反復計算を使うモデルには、エラー以外にもう1つの持病があります。値の「揺れ」です。反復計算は「変化の最大値」を下回ったところで打ち切る近似計算なので、再計算のたびに最終桁がわずかに動くことがあります。通常は無害ですが、揺れ幅が大きい場合は、収束が不十分(変化の最大値が緩すぎる)か、ループ内のロジックが発散気味であるサインです。
- 簡易チェック:F9を2〜3回連打し、利息やB/S合計の値が1回ごとに動かないかを目視します。動くなら設定か構造に問題があります。
- 設定の見直し:「変化の最大値」を0.001からさらに小さく(たとえば0.0001に)絞ると、揺れの振幅は小さくなります。そのぶん計算時間は伸びるため、モデルの規模との兼ね合いで調整します。
- 構造の見直し:設定を絞っても揺れが収まらない場合は、循環が複数箇所に散らばっていないか、ループ内に不連続な関数(ROUNDや過剰なIF)が混ざっていないかを疑います。循環の中で値を丸めると、収束判定が永遠に安定しないことがあるためです。
「エラーにはスイッチ、揺れには収束チェック」。この2点を備えて初めて、反復計算と安全に共存できるモデルになります。
財務モデルに潜む循環の地図
利息と残高のループは最も有名な循環ですが、3表連動モデルやLBOモデルには、ほかにも循環が生まれやすい定番ポイントがあります。自分のモデルのどこに循環が潜み得るか、地図として持っておきましょう。
| 発生箇所 | ループの構造 | 循環を断つ定石 |
|---|---|---|
| 支払利息 ↔ 債務残高 | 利息 → 純利益 → 返済 → 期末残高 → 期中平均 → 利息 | 期首残高ベースで利息を計算する |
| 受取利息 ↔ 現金残高 | 余剰現金の運用益 → 純利益 → 期末現金 → 期中平均 → 受取利息 | 期首現金ベースで受取利息を計算する |
| 調達手数料 ↔ 借入額 | 手数料も借入で賄う場合、借入額 → 手数料 → 必要調達額 → 借入額 | グロスアップを代数で解く(必要額 ÷(1 − 料率)) |
| リボルバー ↔ 最低現金 | 借入 → 利息 → キャッシュ → 不足額 → 借入 | 利息を期首ベースにし、借入判定と利息計算の期をずらす |
3つ目のグロスアップは代数的解法の好例なので補足します。手数料率2%で、手取り100億円が必要なケース。借入額をXと置くと「X − 0.02X = 100」なので、X = 100 ÷ 0.98 = 約102.04億円。循環参照を作らなくても、割り算1回で厳密解が出ます。検算すると102.04 × 2% = 約2.04億円が手数料で、手取りは102.04 − 2.04 = 100億円。ぴったりです。
このように、循環の多くは「期首ベースへの切り替え」か「簡単な代数」で構造的に断てます。それでも期中平均の精緻さを取りたい箇所にだけ、スイッチ付きの反復計算を限定適用する。循環の地図を持ったうえでの意図的な選択こそが、本記事の冒頭で述べた「仕組みとリスクを理解したうえで選ぶ」ということの具体的な姿です。
スイッチ運用のチェックポイント
- スイッチセルはモデルの入力セクションに目立つ形で置き、色分けルールに従って入力セルの色(青)を付けておく。
- 循環箇所はモデル内で1か所に集約する。循環があちこちに散らばったモデルは復旧もレビューも困難になります。
- 「スイッチON時とOFF時の差分」を表示するチェックセルを置き、OFFのまま提出する事故を防ぐ。
- ファイルを共有する際は、反復計算の設定がExcelのファイルではなくアプリケーション環境に依存する場合がある点に注意し、受け手に設定を伝える。
まとめ
- 財務モデルの循環参照は「利息 → 純利益 → 返済 → 残高 → 利息」という構造から必然的に生まれる。
- 反復計算ONはエラーの増殖・検出困難・監査性低下という代償を伴う。循環自体を避けるべきという見解もあるが、実務では拡張性の高さから循環を入れて回すのが一般的。
- 循環を使うなら、スイッチ(サーキットブレーカー)を必ず併設する。IF関数で組み込み、0 → 再計算 → 修正 → 1の手順でエラーを浄化できる。
- IFERRORでエラーを隠すのは厳禁。エラーは直すものであって、見えなくするものではない。
- 期首残高ベースなどで循環を断つ選択肢もある。いずれの場合も精緻さと安定性のトレードオフを意識して選ぶ。
なお、当サイトのダウンロードページで提供している財務モデル(DCF・LBO・M&A)には、本記事で解説した循環参照スイッチを組み込んだモデルが含まれています。実際に動くモデルでスイッチの挙動を確かめたい方はご活用ください。