# 公開された住宅購入・時短の固定例を別計算する

このPythonプログラムは、Decision Studioで配布している**架空の1例・3ケース**を、アプリを読み込まずに別の式で計算し、月次CSVと公開JSONへ照合します。Python 3.9以降の標準ライブラリだけを使います（実行確認はPython 3.12）。ネット通信・入力ファイルの変更・アプリへの書き込みは行いません。

公開元：[住宅購入と時短の固定計算例・別計算で確かめる](https://studio.signalandship.com/examples/home-and-shorter-hours#verify-fixed-example)。

## 用意するファイルと実行

次の公開ファイルを保存してください。保存形式を変えたり、表計算ソフトで再保存したりせず、ダウンロードしたバイトのまま使います。

- [固定例のCSV](https://studio.signalandship.com/examples/housing-income-32-30-months.csv)
- [固定入力と照合結果のJSON](https://studio.signalandship.com/evidence/housing-content-checks-2026-09-22.json)
- [verify-housing-example.py](https://studio.signalandship.com/evidence/housing-fixed-example-checker-v1/verify-housing-example.py)（この説明に対応する検証プログラム）

同じフォルダーに置いた場合は、ターミナルで次を実行します。別の場所に保存した場合は、2つの引数へ保存先を指定してください。

```sh
python3 verify-housing-example.py --csv housing-income-32-30-months.csv --evidence housing-content-checks-2026-09-22.json
```

結果はJSON形式で画面へ出ます。終了コード0は、この固定例の対応項目が一致したことを示します。1は内容・SHAなどの不一致、2は必要な入力・構造・版を読めない状態です。必要項目を0で補ったり、未確認項目を合格として扱ったりしません。

`PASS_FOR_SUPPORTED_FIXED_EXAMPLE` は**年払いまで含む全面合格ではありません**。同じ結果JSONの `annualPayment` と `notChecked` も確認してください。

## 照合する範囲

- 購入直後を月0とし、月1〜120の月末を加えた121時点×3ケース、合計363残高。
- 予定どおり終了、24か月延長、10年の終わりまで時短を続けるケース。
- 各ケースの最低残高、その最初の月、600万円を初めて下回る月、120か月後の残高。CSV・JSON双方の集計と照合します。
- ローン返済額、共通住宅条件12項目、終了後の手取りが始まる月、元ファイルのSHA-256。

32万円の時短手取り・30か月・終了後55万円・延長24か月はCSVの明示された欄から読みます。JSONの `calculation.input.shortIncome=42` は別の基本例の値なので、このCSVの入力へ代入しません。JSONとの集計照合は `workedResults` の `id=base` だけを対象にします。

## 計算方法

元利均等返済の月額を、元本P、月利r、返済月数nから `P × r × (1+r)^n / ((1+r)^n − 1)` で求めます。r=0の場合はP/nです。月利は年利（%）/1200で、毎月の返済額を途中で表示丸めしません。

経過月tの資金は、開始資金に**その時点までの累計収入を直接足し、累計支出を直接引く**式です。前月残高を次月へ更新するアプリの関数は呼びません。

```text
開始資金 = 現預金 + 換金資産 − 頭金 − 購入諸費用
収入累計 = 現在の手取り × 開始前の月数
         + 時短中の手取り × 時短中の月数
         + 終了後の手取り × 終了後の月数
残高(t) = 開始資金 + 収入累計
          − t × (生活費 + 維持費)
          − min(t, 返済月数) × 月返済額
```

PythonのDecimalで有効数字50桁を使い、公開済み許容差を維持します。絶対誤差の許容値は `0.0000001万円 = 0.001円`、相対許容差は0です。これは金融機関の端数処理を表すものではありません。元モデルの浮動小数点計算と表示丸め前の値を比べるための照合条件です。

最低残高は全121時点から求め、同じ値なら最初の時点を選びます。「残したい額を下回る」は600万円未満を意味し、残高0円未満とは別です。下回らないケースは `null` で、月0へ置き換えません。

この配布版は600万円未満を厳密に比較します。元モデルは浮動小数点誤差への対処として「600万円 − 0.0000001万円」未満で判定するため、任意の入力で同じ判定になるとは限りません。今回の固定363残高は600万円から最も近い点でも約1.859207万円離れており、両方の判定で最初の不足月は同じです。この固定例での一致を、境界付近を含む汎用的な互換性へ広げません。

## 固定ファイルと今回の結果

| ファイル | SHA-256 |
|---|---|
| housing-income-32-30-months.csv | `f50e35c218f1131a6539fcd019fd019d1fadc42f7f3203af57ff00e800982d6d` |
| housing-content-checks-2026-09-22.json | `8c94c26126d72122d19f5f5894ad020577dbc81bf65b4331bbac78863cf72cdf` |

この固定ファイルでの照合結果は、月次363値が一致、最大絶対差は約 `2.565×10^-12万円` でした。最低残高・時点は、予定どおり終了が約708.437万円・42か月、延長が約498.401万円・66か月、継続が約25.820万円・120か月です。記載の丸めは説明用で、プログラムは丸め前の値を照合します。

## 年払いと、対応していない範囲

**年払い補正は未検証です。** 公開JSONには補正後の最低額と月が書かれていますが、このCSV・JSONだけでは「月割りで含めた額」「1回の支払額」「初回支払月」「支払周期」が揃いません。答えから入力を逆算したり、Webページの例を隠れた定数として埋めたりせず、`NOT_CHECKED_MISSING_INPUTS` と出します。年払いの121値を確認したという以前の制作記録の件数を、この配布版の確認件数に含めません。

その他5つの条件変更例、基本3案、上振れケース、記入シート、公式資料の内容、ブラウザー操作、保存・PDF・決済は対象外です。任意の家計ファイルへ一般化する計算ツールではなく、上のSHAで固定した公開例用です。別版のCSV・JSONは、見た目や数値が同じでもこの版の合格とはしません。

固定の架空入力と単純化したモデルの算術一致を示すだけで、実家計、返済契約、金利の見通し、税・社会保険・給付、借入審査、購入の適否、専門家監修、GoogleやAIからの引用を保証するものではありません。月末の比較では同じ月の支払順序による一時不足も分かりません。
