dr-harv dr-harv

資産運用シミュレーションに使える!JavaScriptで作る複利計算プログラムを作ってみた

このプログラムでは、年利を月利に換算して計算しています。そのため、毎月収益が増え続ける計算になっており、実際の収益はもう少し低くなる可能性があります。インデックス投資などでは数十年での年利が計算できますので、長期で見た場合はシミュレートしやすいと思います。

収益だけでなく、グラフも表示できるようになっているため、視覚的に把握することができます

画像
複利計算のインタラクティブイメージ

プログラム

JavaScript

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>複利計算プログラム</title>
  <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
  <h2>複利計算プログラム</h2>
  <form>
    <label for="initial_investment">初期投資額(万円)</label>
    <input type="number" id="initial_investment" name="initial_investment"><br><br>
    <label for="monthly_deposit">毎月の積立額(円)</label>
    <input type="number" id="monthly_deposit" name="monthly_deposit"><br><br>
    <label for="annual_interest_rate">運用利回り年利(%)</label>
    <input type="number" id="annual_interest_rate" name="annual_interest_rate"><br><br>
    <label for="investment_term">投資期間(年)</label>
    <input type="number" id="investment_term" name="investment_term"><br><br>
    <input type="button" id="calculateButton" value="計算する">
  </form>
  <br>
  <canvas id="myChart" width="400" height="400"></canvas>
  <br>
  <div id="result"></div>

  <script>
 let myChart;

    function calculate() {
      const initialInvestment = parseFloat(document.getElementById('initial_investment').value) * 10000;
      const monthlyDeposit = parseFloat(document.getElementById('monthly_deposit').value);
      const annualInterestRate = parseFloat(document.getElementById('annual_interest_rate').value);
      const investmentTerm = parseFloat(document.getElementById('investment_term').value);
      const monthlyInterestRate = annualInterestRate / 12 / 100;

      let finalAmount = initialInvestment;
      const principalData = [];
      const earningsData = [];
      for (let i = 0; i <= investmentTerm * 12; i++) {
        const principal = initialInvestment + (i * monthlyDeposit);
        const earnings = finalAmount - principal;

        principalData.push((principal / 10000).toFixed(2));
        earningsData.push((earnings / 10000).toFixed(2));

        finalAmount = (finalAmount + monthlyDeposit) * (monthlyInterestRate+1);
      }

      const ctx = document.getElementById('myChart').getContext('2d');

 // Destroy the previous chart instance if it exists
      if (myChart) {
        myChart.destroy();
      }

      myChart = new Chart(ctx, {
        type: 'bar',
        data: {
          labels: [...Array(investmentTerm * 12 + 1).keys()].map((value, index) => {
            return index % 12 === 0 ? value / 12 + '年目' : '';
          }),
          datasets: [
            {
              label: '元本',
              data: principalData,
              backgroundColor: 'rgba(75, 192, 192, 0.5)',
            },
            {
              label: '運用収益',
              data: earningsData,
              backgroundColor: 'rgba(255, 99, 132, 0.5)',
            },
          ],
        },
        options: {
          scales: {
            y: {
              stacked: true,
              ticks:
              {
                callback: function(value, index, values) {
                  return value + ' 万円';
                }
              }
            },
            x: {
              stacked: true,
              ticks: {
                autoSkip: false,
                maxRotation: 0,
                minRotation: 0
              }
            }
          }
        }
      });

      const totalInvestment = initialInvestment + monthlyDeposit * investmentTerm * 12;
      const totalReturn = finalAmount - totalInvestment + monthlyDeposit;
      finalAmount = finalAmount + monthlyDeposit;

      const resultElement = document.getElementById('result');
      resultElement.innerHTML = `運用資産額:${finalAmount.toFixed(0).toLocaleString()}円<br>`;
      resultElement.innerHTML += `運用収益:${totalReturn.toFixed(0).toLocaleString()}円<br>`;
      resultElement.innerHTML += `元本:${totalInvestment.toLocaleString()}円`;
    }

    document.getElementById("calculateButton").addEventListener("click", calculate);
  </script>
</body>
</html>

ブログ記事はこちらです
実際のシミュレーションも可能です


いいなと思ったら応援しよう!

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
資産運用シミュレーションに使える!JavaScriptで作る複利計算プログラムを作ってみた|dr-harv
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1