# 第4号：データと再計算

対象期間：2016-10-31〜2026-10-30（3,651暦日、約10年間）。調査日：2026-11-06 JST。

## 入力と出典

`observations.csv` は実際に取得した値を日付で結合した固定スナップショットです。BTCは3,652暦日、ETFは各2,514観測日、Fed為替は2,497観測日。完全に値がそろう2,486日だけが主比較です。空欄は欠測で、補間もforward-fillもしていません。

- BTC-USD：Yahoo Financeの日次終値、USD。UTC日次区切り。
- SPY / ACWI：Yahoo Financeの日次市場終値とadjusted close、USD。米国市場取引日。
- USD/JPY：Federal Reserve H.10の日本円／米ドル履歴。ニューヨーク正午のbuying rate。

正確な取得URL・取得時刻（UTC）・応答SHA-256・入力CSVのSHA-256はsources.json。為替はFREDのCSV取得が404だったため、提供元のFederal ReserveのHTML表を直接解析しました。Yahooの為替系列も予備取得しましたが、計算には使っていません。

SPYの40件・ACWIの22件の分配金イベントと前日終値から、調整係数の積 `Π(1 - distribution / previous_close)` を独立に再構成しました。提供されたadjusted closeの両端の調整係数との相対差は、それぞれ約1.64e-7、-2.87e-7。しきい値1e-5を下回ることを取得コードで検証しています。この検証は税引後の実際の再投資を保証するものではありません。今回の取得範囲に分割イベントはありません。

公式のS&P500 / MSCI ACWI日次指数は入力ではありません。SPY・ACWIを代替として使い、分配金調整後の市場価格比率を再投資の近似とします。指数の構成説明や運用目標はS&P DJI、MSCI、State Street、iSharesの一次資料で確認しています。

## オフライン再計算

Python 3.12、標準ライブラリのみで数値を再計算できます。リポジトリ直下で実行します。

```
python scripts/analyze_long_term.py --check
python scripts/audit_long_term.py --check
python -m unittest discover -s tests -v
```

`--check` はCSVのハッシュ、計算結果JSON、記事内の自動生成表を照合し、不一致なら失敗します。ネット接続やデータ再取得は行いません。値の変更を確認して生成し直す場合だけ、次を使います。

```
python scripts/analyze_long_term.py
python scripts/build_site.py
```

後者の生成スクリプトがトップ一覧・サイトマップを作ります。手動で一覧を編集する必要はありません。記事の文章中で引用した数値・グラフ・説明も、データを変更した場合には合わせて確認してください。

## 計算

- USD系列：BTC終値、SPY / ACWI adjusted close。
- JPY系列：USD系列 × 同日USD/JPY。
- 資産額：1,000,000 × 当日のJPY系列 / 開始日のJPY系列。
- CAGR：(終了値 / 開始値)^(365.2425 / 暦日数) - 1。
- DD：当日値 / 当日までの最高値 - 1。最小値を採用。
- 最大DDの回復日：その下落前の高値以上へ戻った最初の観測日。底値以降で探索。高値から／底値からの2種類の暦日数を表示。
- 最長未回復期間：各高値から次の回復までの暦日数。期末まで未回復なら、期末までの経過日数と未回復の状態を保存。
- 年別：前年の最終共通観測日から当年の最終共通観測日。2016年と2026年は部分期間。米ドル・円換算の両方をresults.jsonへ保存。
- BTCの追加検証：全3,652暦日の米ドル建て最大DDを別に計算。

## グラフ

数値計算の標準ライブラリと、図を描く依存関係は分離しています。図の再生成にはMatplotlibが必要です。

```
python -m pip install matplotlib
python scripts/analyze_long_term.py --plots
```

wealth-and-drawdown.svgは日次値を描いた静的図です。上段はJPYの対数目盛、下段は円換算DD。PNGはSNS共有用です。描画環境による画像のバイト差はあり得ますが、入力・数値結果・記事の表は固定値で再現できます。CIでMatplotlibや外部ネットワークへの依存は追加していません。

## 再取得は別操作

既存のスナップショットを上書きしない取得コードを用意しています。

```
python scripts/fetch_long_term_data.py --output /tmp/article4-new-download
```

失敗したら欠測を創作せずエラー終了します。日次APIは後日修正されることがあり、再取得結果が保存済み入力と一致する保証はありません。取得直後の原応答はraw/にgzip圧縮して保存し、取得記録の応答SHA-256と照合できます。audit-refetch/は元の入力を置き換えずに再取得したCSVと取得記録です。分配金調整・配信仕様が変われば取得コードの検証が失敗する場合もあります。

## 限界

- ETF市場価格は指数・NAV・国内投資信託と異なります。ETF内の費用や課税等は市場価格へ影響し、別途の二重控除はしません。
- 投資家の税、外国源泉税、売買手数料、為替スプレッド、保管費、端数口数制約は別計算していません。ETFのadjusted closeは投資家の税引後再投資口数を再現しません。
- BTCの貸付収入・分岐コイン等は加算していません。積立・リバランス・取り崩しはありません。
- 日付をそろえてもBTC・株価・為替の評価時刻は異なります。実行可能な同時約定の再現ではありません。
- 日中安値、欠測日の値動き、2016年より前の金融危機は主比較に含みません。
- 指定期間での過去比較であり、未来の利回り、損失上限、回復までの期限は示しません。

## 独立監査
`python scripts/audit_long_term.py --check` は分析モジュールをimportせず、元の圧縮応答をハッシュ検証し、16,205個の数値をCSVと突き合わせます。独立したFederal Reserve表パーサーと50桁精度のDecimalで、USD・JPYの累積倍率・CAGR・最大DD・回復日を検証します。CAGRから資産額へ逆算する式も照合します。audit.jsonはこのコードの固定出力、AUDIT.mdは人が読める結果です。

再取得したETFのadjusted closeは微差があり、元CSVとバイト一致しません。通常終値・BTC・為替は一致し、調整後価格の最大相対差は0.0001％未満、期末金額の影響はSPY約+0.52円、ACWI約+1.92円です。原因は未検証です。固定スナップショットによる再計算可能性と、提供元から毎回同じ値が得られることは区別してください。

また、adjusted closeの調整と、配信された分配金を権利落ち日終値で再投資する仮定の現金フロー計算は厳密に同じではありません。後者に比べ、前者の期末倍率はSPYで約0.0671％、ACWIで約0.0399％低くなります。いずれも実際の支払日・源泉税・端数口数を再現しません。これは別方式による感応度確認で、本文の基準を置き換えたものではありません。
