ChatGPT で奨学金返済シミュレーターを自作する
LIFE · 情報基準日 2026-05-25 · 約5,800字 · 約12分
こんにちは、ニャンコ会社「マイレージ・ポートフォリオ社」執事のHでございます。
奨学金の返済と、マイル積立・NISA積立の両立——これは20〜30代の多くの方が直面する設計課題です。
「繰り上げ返済をするべきか、その分を投資に回すべきか」「あと何年で完済するか」「毎月の返済額を増やしたら利息はどう変わるか」——こういった試算は、市販のシミュレーターでは自分の条件に完全に合わせにくい場合があります。
今日は、ChatGPTを使って 自分だけの奨学金返済シミュレーター をHTMLファイルとして自作する手順とコードを公開します。
🐈⬛ マイル「えっ、プログラミングできなくてもシミュレーター作れるの?」
🐈 ポルト「道具の作り方を知っている必要はない。道具を作れるAIに、何を作ってほしいかを正確に伝えられれば良い。」
🙇 執事H「お二方、本記事のコードをコピーしてブラウザで開けば、今日から使えます。仕組みも合わせて解説いたします。」
前提: 日本の奨学金の計算方式を理解する
シミュレーターを作る前に、計算の前提を整理します。
JASSO奨学金の種別
第一種奨学金(無利子):
- 利率 0%
- 繰り上げ返済で利息は減らない(利息がないため)
- 返済期間の短縮効果はある
第二種奨学金(有利子):
- 利率: 固定または変動(上限3%)
- 実際の利率は返還誓約書に記載
- 繰り上げ返済で利息総額を減らせる可能性がある
まず「自分がどちらの奨学金を保有しているか」「利率はいくらか」「残債はいくらか」を、JASSOのマイページ(lep.jasso.go.jp)で確認することが最初のステップです。
利息の計算方式
第二種奨学金の利息は、一般的に残債に対して月次で発生します。繰り上げ返済をすると残債が減り、以降の利息計算のベースが下がります。
ChatGPT に作ってもらうためのプロンプト
以下のプロンプトをChatGPTに貼り付けると、動作するシミュレーターのコードを出力してくれます。自分の条件に合わせて数値を変更してから使用してください。
以下の条件で奨学金返済シミュレーターを作成してください。
HTMLとJavaScriptで1つのファイルにまとめて、ブラウザで開くだけで動作するものにしてください。
【機能要件】
- 入力項目: 残債、月利(年利を12で割る)、毎月の返済額、繰り上げ返済額(任意入力)、繰り上げ返済を行う月
- 出力: 完済までの月数、利息総額、繰り上げ返済あり/なしの比較表
- 表形式で月別の返済内訳(元金・利息・残高)を表示
【計算方式】
- 元利均等返済方式
- 繰り上げ返済は指定月に残高に直接適用し、その後も同じ月額を継続
出力はコードのみで、説明は不要です。
実際に出力されるコードの例と解説
以下は上記プロンプトに基づいてChatGPTが生成するコードの例です。実際の出力はプロンプトの細部・ChatGPTのバージョンによって異なる場合があります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>奨学金返済シミュレーター</title>
<style>
body { font-family: sans-serif; max-width: 700px; margin: 40px auto; padding: 0 20px; }
input { width: 100%; padding: 6px; margin: 4px 0 12px; box-sizing: border-box; }
button { padding: 10px 20px; background: #333; color: white; border: none; cursor: pointer; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; font-size: 13px; }
th, td { border: 1px solid #ccc; padding: 6px 10px; text-align: right; }
th { background: #f0f0f0; text-align: center; }
.summary { background: #f9f9f9; padding: 12px; margin: 16px 0; border-left: 3px solid #333; }
</style>
</head>
<body>
<h2>奨学金返済シミュレーター</h2>
<label>残債(円)</label>
<input type="number" id="balance" value="2000000" />
<label>年利(%)</label>
<input type="number" id="annualRate" value="1.0" step="0.01" />
<label>毎月の返済額(円)</label>
<input type="number" id="monthlyPayment" value="20000" />
<label>繰り上げ返済額(円・任意)</label>
<input type="number" id="extraPayment" value="0" />
<label>繰り上げ返済を行う月(例: 12 = 1年後)</label>
<input type="number" id="extraMonth" value="12" />
<button onclick="calculate()">計算する</button>
<div id="result"></div>
<script>
function calculate() {
const balance = parseFloat(document.getElementById('balance').value);
const annualRate = parseFloat(document.getElementById('annualRate').value) / 100;
const monthlyRate = annualRate / 12;
const monthlyPayment = parseFloat(document.getElementById('monthlyPayment').value);
const extraPayment = parseFloat(document.getElementById('extraPayment').value) || 0;
const extraMonth = parseInt(document.getElementById('extraMonth').value) || 0;
function simulate(applyExtra) {
let remaining = balance;
let totalInterest = 0;
let months = 0;
let rows = [];
while (remaining > 0 && months < 600) {
months++;
const interest = remaining * monthlyRate;
let principal = monthlyPayment - interest;
if (principal <= 0) {
rows.push({ month: months, principal: 0, interest: interest.toFixed(0), remaining: remaining.toFixed(0), note: "返済額が利息以下" });
break;
}
if (remaining < monthlyPayment) {
principal = remaining;
}
remaining -= principal;
totalInterest += interest;
let note = '';
if (applyExtra && months === extraMonth && extraPayment > 0) {
remaining = Math.max(0, remaining - extraPayment);
note = `繰り上げ返済 ${extraPayment.toLocaleString()}円`;
}
rows.push({
month: months,
principal: principal.toFixed(0),
interest: interest.toFixed(0),
remaining: remaining.toFixed(0),
note: note
});
if (remaining <= 0) break;
}
return { months, totalInterest: totalInterest.toFixed(0), rows };
}
const withoutExtra = simulate(false);
const withExtra = simulate(true);
const diff = withoutExtra.months - withExtra.months;
const interestDiff = (parseFloat(withoutExtra.totalInterest) - parseFloat(withExtra.totalInterest)).toFixed(0);
let html = `
<div class="summary">
<strong>繰り上げ返済なし:</strong> ${withoutExtra.months}ヶ月 / 利息合計 ${parseInt(withoutExtra.totalInterest).toLocaleString()}円<br>
<strong>繰り上げ返済あり:</strong> ${withExtra.months}ヶ月 / 利息合計 ${parseInt(withExtra.totalInterest).toLocaleString()}円<br>
<strong>差分:</strong> ${diff}ヶ月短縮 / 利息 ${parseInt(interestDiff).toLocaleString()}円削減
</div>
<h3>月別明細(繰り上げ返済あり)</h3>
<table>
<tr><th>月</th><th>元金</th><th>利息</th><th>残高</th><th>備考</th></tr>
`;
withExtra.rows.forEach(r => {
html += `<tr>
<td>${r.month}</td>
<td>${parseInt(r.principal).toLocaleString()}</td>
<td>${parseInt(r.interest).toLocaleString()}</td>
<td>${parseInt(r.remaining).toLocaleString()}</td>
<td>${r.note}</td>
</tr>`;
});
html += '</table>';
document.getElementById('result').innerHTML = html;
}
</script>
</body>
</html>
このコードをテキストエディタ(メモ帳・VS Code等)に貼り付け、.html で保存してブラウザで開くと、動作するシミュレーターとして使えます。
奨学金返済 × マイル積立の並立設計
シミュレーターで「繰り上げ返済をした場合としない場合の利息差」が計算できたら、次の設計に進みます。
判断の基本軸
| ケース | 判断の考え方 |
|---|---|
| 第一種奨学金(無利子) | 繰り上げ返済の利息削減効果はない。心理的負担の軽減が主な目的。投資・マイル積立を優先する考え方が成立しやすい |
| 第二種(低利率 0.x%) | 長期インデックス投資の期待リターン(仮に年3〜5%)と比較すると、投資優先の考え方が成立しやすい可能性 |
| 第二種(高利率 2〜3%) | 利息削減の経済的メリットが大きくなる。繰り上げ返済と投資の並立設計が有効な可能性 |
なお、投資の期待リターンは確定値ではありません。市場リスクがあるため、「確実に利息を削減する繰り上げ返済」と「リターンが不確実な投資」のどちらを優先するかは、リスク許容度を踏まえた個人の判断です。
マイル積立との3すくみ設計
月の余剰資金を「奨学金繰り上げ返済」「NISA/iDeCo積立」「マイル積立用クレカ集約」の3方向に配分する発想を整理します。
例: 月5万円の余剰資金の場合
| 配分先 | 金額例 | 目的 |
|---|---|---|
| 奨学金繰り上げ返済 | 1万円 | 心理的負債の軽減・利息削減(有利子の場合) |
| NISA積立 | 3万円 | 長期資産形成 |
| クレカ集約(マイル) | 残りの支出を集約 | マイル獲得・年間消費の可視化 |
この配分は「最適解」ではなく、「自分の状況と価値観に合わせて調整する叩き台」として使ってください。
MP判定
MP判定(ChatGPTによる奨学金返済シミュレーター自作):
- 合理性: ★★★★★
→ 自分の正確な条件に合わせたシミュレーターを、無料・短時間で作れる
→ 市販ツールでカバーされていない「繰り上げ返済 × 投資並立の比較」を自作できる
- 快適性: ★★★★☆
→ 「返済があと何年あるか」を可視化するだけで、精神的な安心感につながる場合がある
→ 数字で見える化することで、漠然とした不安を具体的な設計に変換できる
- 自由度: ★★★★☆
→ 奨学金の完済設計が明確になると、その後の資産形成(NISA/マイル)への余力が見えやすくなる
→ 「完済後に何をするか」という人生設計が具体化しやすくなる
- 確実性: ★★★☆☆
→ シミュレーターの計算は前提値が正確であれば合理的だが、入力する利率・残債を正確に把握する必要がある
→ 投資リターンとの比較は、投資側の不確実性を常に考慮する必要がある
- まず試すべきこと:
→ JASSOマイページで残債・利率・毎月の返済額を確認する
→ 本記事のコードをブラウザで開いて自分の数値を入力してみる
結びに
🐈 ポルト「道具を作る力より、道具を使って何を見るかが重要じゃ。シミュレーターを作ることが目的ではなく、その数字を見て設計を変えることが目的だ。」
🐈⬛ マイル「でも自分でコード書けなくても、ChatGPTに頼めば作れるってわかったのは大きい!」
🙇 執事H「お嬢様、道具を作る手段が増えたことより、その道具を設計の改善に使っていただくことの方が重要でございます。まず JASSOのマイページを開いて、ご自身の残債と利率を確認するところから始めてみてください。」
奨学金の返済設計は、マイル積立・NISA積立・iDeCo積立と並列に設計できるテーマです。ChatGPTを使えば、自分の条件に合ったシミュレーターを短時間で自作できます。計算の仕組みを理解した上で、「繰り上げ返済優先か投資優先か」を自分の数値で判断することが、漠然とした「どっちが得か」の議論から抜け出す方法のひとつです。
参照(情報基準日 2026-05-25)
- 日本学生支援機構(JASSO)「奨学金の返還について」(jasso.go.jp)
- JASSO マイページ(lep.jasso.go.jp)
- ChatGPT(openai.com)
- 元利均等返済計算方式(各種ファイナンス教科書)
関連記事
- LIFENotebookLM 活用術 —— 旅行プランから投資メモ管理まで、MP流の使い方を整理するGoogle NotebookLM を使って特典航空券の規約まとめ・ホテルプログラム条件の比較・投資メモの整理を効率化する方法を整理。汎用AIとは異なる『自分のソースだけを参照する』設計の強みと限界を…
- LIFE老後資金と今しかできない体験のバランス老後資金の積み立てと現在の体験をゼロサムゲームとして捉えず人生のポートフォリオとして設計する発想を提案。配当・マイル・積立の果実を体験に変換するフレーム。
- LIFE親と旅行できる回数は、思っているより少ない —— 残り回数から逆算する旅の設計年に1回親と旅行すると、残りは思っているより少ないかもしれない。会える回数・旅できる回数を冷静に見積もり、「いつか」を「今年」に変えるための考え方を、マイレージ・ポートフォリオ編集部が整理します。情報…
本記事は note では公開していない、MileagePortfolio サイト独占のライフ×AI活用コラムです。情報基準日:2026-05-25。本記事のコードはサンプルであり、動作を保証するものではありません。実際の奨学金の返還条件はJASSOの公式情報または各奨学金の返還誓約書をご確認ください。投資・資産運用に関する判断は、ご自身の責任で行い、必要に応じて専門家にご相談ください。
この記事をもっと深めたい人へ — 本と映像のすすめ
記事の整理だけでは足りない人向けに、関連する書籍と映像作品を置いておきます。
- 最高の人生の見つけ方 (2007)
余命を告げられた二人が『やり残したこと』に挑むロードムービー。今をどう使うか問い直す。 - イントゥ・ザ・ワイルド (2007)
全てを捨てて旅に出た青年の実話。お金・自由・幸福の関係を考えさせる。 - マイ・インターン (2015)
アン・ハサウェイ×ロバート・デ・ニーロ。働き方と人生のバランスを描く心温まる一本。
※当サイトはアフィリエイト広告を含みます。ご購入は本サイトの運営継続に充てられます。
