サイトアイコン 壁の道の向こう側

循環参照スイッチ(サーキットブレーカー)の実装方法:財務モデルの循環参照を安全に扱う

LBOモデルやキャッシュスイープモデルを組んでいて、ある日突然モデル全体が0だらけになった経験はないでしょうか。原因の多くは循環参照のループにエラーが流れ込み、抜けなくなってしまうことです。この事故を一発で復旧できる仕掛けが、本記事で解説する「循環参照スイッチ(サーキットブレーカー)」です。

本記事では、そもそもなぜ財務モデルに循環参照が生まれるのかという構造から、反復計算の危険性、スイッチの具体的な実装手順、そして循環を最初から使わない代替策まで、初学者向けに順を追って解説します。

なぜ財務モデルに循環参照が生まれるのか

循環参照とは、ある数式が直接または間接に自分自身のセルを参照してしまう状態です。財務モデルで最も典型的なのは、支払利息まわりの次のループです。

支払利息 → 当期純利益 → 返済に回せるキャッシュ → 期末借入残高
→ 期中平均残高 → 支払利息(最初に戻る)

利息を「期中平均残高 ×金利」で計算しようとすると、期末残高が必要になります。ところが期末残高は、利息を払った後に残るキャッシュで返済した結果です。つまり利息を知るには残高が、残高を知るには利息が必要という鶏と卵の関係になり、数式が一周して自分に戻ってきます。3表連動モデルで利息・リボルバー・キャッシュをつなぐと、ほぼ必然的にこの構造が現れます。

対処方針は2つ:回すか、断つか

循環参照への向き合い方は、世界の実務でも大きく2つの流派に分かれます。

  1. Excelの反復計算を有効にして循環を「回す」:投資銀行のモデルで広く見られる方式。本記事のスイッチはこの流派の安全装置です。
  2. 循環を構造的に「断つ」:利息を期首残高ベースで計算するなどして、ループ自体を作らない方式。

参考までに、モデル設計の業界規約であるFAST Standard(読みやすく監査しやすいモデルの設計原則を定めた規格)には「意図的な循環参照を含むモデルをリリースしてはならない」という記載があり、英国の勅許会計士協会(ICAEW)のモデリング規範も反復計算を無効にして循環は代数的に解く立場を取る、という意見や見解もあるようですが、実務では拡張性の高さから循環参照を入れて「回す」方が一般的と思われます。どちらを選ぶにせよ、仕組みとリスクを理解したうえで選ぶことが重要です。

反復計算ONの何が危険なのか

Excelの「反復計算」を有効にすると、循環参照を含む数式を指定回数だけ繰り返し計算し、値が収束したところで止めてくれます。便利な半面、3つの代償があります。

循環参照スイッチの実装手順

スイッチの考え方は単純です。循環の入口に1か0を取る制御セルを置き、0にした瞬間にループへ流れる値を強制的にゼロへ落とす。電気回路のブレーカーのように、事故時に回路を遮断してエラーを掃き出すわけです。

  1. スイッチセルを作る:入力セクションに専用セルを1つ用意し、1(ON)を入力します。名前ボックスから「Circ」などの名前を定義しておくと数式が読みやすくなります。
  2. 循環に入る数式にスイッチを組み込む:利息計算を「=IF(Circ=1, 期中平均残高 × 金利, 0)」のように、IF関数でスイッチを組み込みます。「=期中平均残高 × 金利 × Circ」とスイッチを掛け算で挟む流儀もあり挙動は同じですが、当サイトのDCFモデル構築解説(循環参照のオン・オフスイッチを作る回)ではIF関数方式で実装しているため、本記事もIF関数方式で統一します。
  3. エラー発生時の復旧: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.00025.00075.00087.5004.375
2回目4.37525.62574.37587.1884.359
3回目4.35925.64174.35987.1804.359

1回目は期首残高ベースの利息5.000から出発し、2回目で4.375、3回目で4.359となり、以降は値が動かなくなります。つまりこのモデルの整合的な利息は約4.36です。Excelの反復計算は、まさにこの「仮置き → 再計算 → 差が縮まる」を高速で繰り返しているにすぎません。ブラックボックスに見える機能も、中身はこの程度に素朴なのです。

循環を使わない代替策

「断つ」派の代表的な手法も押さえておきましょう。

実務での使い分けの目安は、「配布先が広い・長く使い回すモデルほど循環を断つ」です。自分だけが触る分析用モデルならスイッチ付きの循環で精緻に、クライアントに納品するモデルや月次で更新し続けるモデルなら期首残高ベースで安定的に、という判断が現実的です。

事故からの復旧を再現する:あるアナリストの15分

スイッチの価値は、事故が起きたときに初めて実感できます。典型的な事故と復旧の流れを、ストーリー仕立てで再現してみましょう。

あるアナリストが、完成間近のLBOモデルに感応度テーブルを追加していました。前提の1つに誤って0を入力した瞬間、どこかの数式で0除算が発生。#DIV/0!が利息の循環ループに流れ込み、再計算のたびにエラーがループを一周して、P/LもB/Sもデットスケジュールも一面のエラー表示になりました。原因の前提セルを直しても、ループ内に固定化されたエラーは消えません。ここからの復旧手順が次の5ステップです。

  1. 慌てて上書き保存しない:壊れた状態で保存すると、正常なバックアップを失います。まず手を止めます。
  2. スイッチを0にする:Circセルに0を入力し、F9で再計算。利息計算がゼロに落ち、ループに0が流れてエラーが洗い流されます。
  3. 根本原因を直す:エラーの発端になった入力ミス(この例では0の誤入力)を修正します。スイッチOFFの状態ならエラー表示が消えているため、原因セルの特定も容易です。
  4. スイッチを1に戻す:F9を数回押し、反復計算が収束して値が安定することを確認します。
  5. チェックセルを確認する: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つの持病があります。値の「揺れ」です。反復計算は「変化の最大値」を下回ったところで打ち切る近似計算なので、再計算のたびに最終桁がわずかに動くことがあります。通常は無害ですが、揺れ幅が大きい場合は、収束が不十分(変化の最大値が緩すぎる)か、ループ内のロジックが発散気味であるサインです。

「エラーにはスイッチ、揺れには収束チェック」。この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億円。ぴったりです。

このように、循環の多くは「期首ベースへの切り替え」か「簡単な代数」で構造的に断てます。それでも期中平均の精緻さを取りたい箇所にだけ、スイッチ付きの反復計算を限定適用する。循環の地図を持ったうえでの意図的な選択こそが、本記事の冒頭で述べた「仕組みとリスクを理解したうえで選ぶ」ということの具体的な姿です。

スイッチ運用のチェックポイント

まとめ

なお、当サイトのダウンロードページで提供している財務モデル(DCF・LBO・M&A)には、本記事で解説した循環参照スイッチを組み込んだモデルが含まれています。実際に動くモデルでスイッチの挙動を確かめたい方はご活用ください。

モバイルバージョンを終了