開発financial-data

「億り人」分析記事にCAGR表と元本中央値を入れて公開記事化するまで

金融資産1億円を超えた個人投資家16人の公開エピソードを題材に、共通点を分析した記事を1日かけて仕上げた。結論を冒頭に置く構成に組み替え、投資元本の中央値とCAGR(年平均成長率)の表を足し、最後に非公開から公開へ切り替えた。途中でツール呼び出しが何度も壊れてセッションが不安定になり、引き継ぎ書を書いて別セッションで続けた。その一部始終を記録しておく。

なぜこの記事を書いたか

題材は、1億円超を築いた個人投資家16人へのインタビュー連載だ。職業も元手も投資スタイルもバラバラなのに、全員ぶんを読むと暴落で買う・ガチホールドする・種銭を入れ続ける、といった共通パターンがくっきり浮かぶ。「誰がいくら持っているか」という名簿ではなく、16人を横断して見える「型」と、そこから導ける近道を分析したかった。

最初に書いた版は、6つの共通点を末尾の「まとめ」に置く、よくある構成だった。これが後で大きく変わる。

試行錯誤①:結論を「はじめに」の直後に出す

最初のドラフトをレビューしてもらったとき、「共通したパターンの結論は最初に置いて」と指示した。一度は「漏えい解説記事が自分自身を漏えい源にする」という別の話と取り違えてしまったが、意図は記事構成の話だった。末尾の「16人に共通する型」を、「はじめに」の直後に先出しして、結論ファーストにしてほしいということだ。

そこで構成を組み替えてもらった。「はじめに」の直後に「結論:16人に共通する『億り人の型』(先出し)」を置き、6つの共通点を冒頭で言い切る。末尾は短い「おわりに」にした。読み手が結論にたどり着くまで末尾までスクロールさせない、という当たり前の改善だが、書いている本人は最後にまとめたくなるので、外から指摘されないと気づかない。

試行錯誤②:投資元本(種銭)の中央値を足す

読み進めるうちに、見落としていた重要な視点に気づいた。16人の多くは、投資元本を2,000万〜3,000万円は持っている。「淡々と続けた」物語の裏に、相応の元手を用意できたという事実がある。これを記事に入れないと、庶民の少額積立と出発点が同じだと誤読されてしまう。

そこで、元本の額が公表されている人だけを抜き出して中央値と平均を計算させた。1人は元本非公開だったので除外し、15人で集計した。結果はこうだ。

指標金額
平均約4,313万円
中央値4,000万円
最小1,000万円
最大9,000万円

15人中13人が3,000万円以上を投下していた。3,000万円あたりが事実上の下限ラインだ。この分布表を記事に差し込み、冒頭の結論にも「投資元本の中央値は4,000万円」という一行を追記した。

試行錯誤③:固定利回りの表 → S&P500実績で上書き

「月10万円の積立だけで億り人になれるのか?」を数字で検証したくて、まず固定利回り(年5%/7%/10%)のシミュレーションを書かせた。使い捨ての計算スクリプトを1本書いてもらい、評価額を出した。

const fv = (monthly, annualRatePct, years) => {
  const r = annualRatePct / 100 / 12;
  const n = years * 12;
  if (r === 0) return monthly * n;
  return monthly * ((Math.pow(1 + r, n) - 1) / r);
};

固定利回りで計算すると、月10万円だけで1億円に届くのは年利7%でも約27.6年。20年では5,209万円止まりだった。「20年で誰でも億り人」とはいかない、という保守的な数字だ。

ところが、これは保守的すぎた。実際に自分が以前作ったS&P500積立バックテストの通り、ドル建てのS&P500へ円で積み立て、過去約20年の値動きに円安を重ねると、結果は跳ね上がる。実績で計算し直してもらうと、2006年1月開始・約20年で**約1億4,909万円(6.1倍)**に到達していた。為替なし(価格リターンのみ)だと9,586万円で届かない。円安が「億の壁」を越える決定打だった。

そこで表を「固定利回り(保守的な目安)」と「実績ベース(過去にこうだった)」の両面に分け、実績の根拠は別記事のバックテストにリンクを張った。理論値だけで断定しないための処置だ。

試行錯誤④:必要倍率にCAGR列を足す

本文に「5年で1億なら16.7倍、年率換算で75%」と書いた一行が、思いのほか刺さった。これを表にして、積立年数5年/10年/15年/20年それぞれで、1億円に必要な倍率と必要なCAGR(年平均成長率)を並べてほしいと頼んだ。「短期ほど非現実的」を一目で見せる数字だ。

計算させた結果がこれだ。

積立年数元本1億円に必要な倍率必要なCAGR(年率・一括前提)
5年600万円16.7倍約 +75.5%
10年1,200万円8.3倍約 +23.6%
15年1,800万円5.6倍約 +12.1%
20年2,400万円4.2倍約 +7.4%

5年で1億なら年率+75.5%を5年連続。個別株の一発勝負で当て続けるのは現実にはほぼ不可能だ。逆に16人の多くは、最初から大きな種銭を持っていたので、必要な倍率は1.4〜2.2倍と控えめだった。近道は「倍率」ではなく「種銭」だ、という結論につながる。CAGRはあくまで一括投資前提の年率で、実際は分割積立なので必要な実効リターンはさらに高い、という注記も添えた。

試行錯誤⑤:malformed連発 → 引き継ぎ書 → セッション切り替え

CAGRの計算をしている最中、ツール呼び出しが繰り返し壊れた。「Your tool call was malformed and could not be parsed」が何度も返り、リトライしても直らない。原因はファイルサイズではなく、ツール呼び出しの引数構造が壊れていたことだ。特に1ターンで10個以上の並列ツールを投げたあたりから、ツール出力が前のターンの結果と混線し始めた。同じファイルの行数が408行・253行・162行と矛盾して表示され、どの観測も信用できなくなった。

しかも混線の最中に、誤って git restore --source=HEAD を走らせ、せっかく追記した「読み解き⑥(時間×種銭シミュレーション)」「投資元本の分布」が入った253行版を、162行の古い版に巻き戻してしまった。観測が壊れていたせいで「ファイルが壊れている」と誤判断し、その判断自体が偽の観測に基づく誤りだった。

ここで深掘りをやめた。確定事項と残タスク(CAGRの計算済みの値も含めて)を引き継ぎ書 memo/2026-06-01/millionaire-handoff.md に書き出し、新しいクリーンなセッションで続けることにした。新セッションでは、ツールを大量に並列で投げず、ディスクの実態を1回だけシンプルに確認することから始めた。CAGR値「75.5」の有無で各ファイルの状態を判定し、巻き戻したcontentを完全版に復旧してから、CAGR列を追加し直した。

malformedが出たら、ファイルサイズを疑う前にツール呼び出しの引数を疑う。シンプルなcallでリトライし、連発するなら引き継ぎ書を残して新セッションに移る。今回はその手順がそのまま効いた。混乱の犯人は「1ターンで多すぎる並列ツール」だった、というのが今回の教訓だ。

試行錯誤⑥:非公開 → 匿名化リライトで公開へ

この記事は当初、著作権への配慮で非公開(unpublished: true)にしていた。元連載が選定・配列した16人の一覧そのものには編集物としての価値があり、固有名詞・正確な資産額の一覧をそのまま転記して公開するのは避けたかったからだ。本番ビルドからは6経路すべてで除外され、直URLでも本番では404になる仕組みに乗せていた。

ただ、内容としては引用元も出典も示せるし、分析としてはかなり踏み込めている。「出典をちゃんと出せば公開でいいのでは」と考え直した。とはいえ「そのまま公開」はやはり避け、匿名化リライトして公開することにした。分析(6つの型・読み解き・シミュレーション)を主役に据え、16人の一覧表・固有名詞・正確な資産額・各有料記事への個別リンクを外し、出典は連載トップ1本に集約した。

固有名詞の取りこぼしがないか一括検索で確認し、unpublished フラグを外した。dev で200が返り、新しい匿名化版が新タイトルで配信され、旧固有名詞も旧タイトルも消えているのを確認した。元連載の編集物としての価値に配慮しつつ、自分のオリジナル分析を公開する、という落としどころに着地した。

振り返り

1日の作業を通して効いたのは、外からの「結論を先に置いて」「元本の中央値を入れて」「CAGRを表にして」という具体的な指示と、自分の中の「これは保守的すぎる、実績で上書きすべき」という違和感だった。数字の計算と表の整形は道具に任せ、構成判断・公開判断・違和感の検知は自分でやる。その分担がはっきりした日だった。

malformedで一度セッションが壊れても、引き継ぎ書を残せば別セッションで拾い直せる。壊れた観測のまま git restore を走らせると成果が飛ぶ、という痛い学びも込みで、記録として残しておく。

これは投資のアドバイスではなく、「こういう分析をして、こう設計して、こうやって公開まで持っていった」という制作の記録だ。分析記事の本体は別ページにある。