Skip to content

Instantly share code, notes, and snippets.

@harunorimurata
Last active December 1, 2022 11:03
Show Gist options
  • Save harunorimurata/da6e850211224042ab9804e780abf2f7 to your computer and use it in GitHub Desktop.
Save harunorimurata/da6e850211224042ab9804e780abf2f7 to your computer and use it in GitHub Desktop.
// t期運用時点における運用総額をs(t)とする。
// 初期金額をα,各期の積立金額をβ,期待リターンをR(= 1 + r)とすると,各期の運用総額sは,期間tの関数S(t)として次の式で表される。
//
// S(t) = (α * R^t) + β * Σ(k = 0, t - 1) R^k
//
// ※各期の計算は以下のようになる
//
// S(t = 0) = α
// S(t = 1) = α * R + β = (α * R^1) + (β * R^0)
// S(t = 2) = (α * R + β) * R + β = (α * R^2) + (β * R^1 + β * R^0)
// S(t = 3) = ((α * R + β) * R + β) * R + β = (α * R^3) + (β * R^2 + β * R^1 + β * R^0)
//
// sを目標金額として固定して各期の積立金額を求める式は,上式をβについて解くことで次の通り求められる。
//
// β = (s - (α * R^t)) / Σ(k = 0, t - 1) R^k
// t期間運用後の運用総額をシミュレーション
function simulateAmount(expReturn, initial, regularly, t) {
return initial * expReturn ** t + regularly * polynomial(expReturn, t - 1);
}
// t期で目標達成するための各期の積立金額をシミュレーションする
function simulateRegularlySavings(expReturn, goal, initial, t) {
return (goal - expReturn ** t * initial) / polynomial(expReturn, t - 1);
}
// 目標達成するまでにかかる期間tをシミュレーションする
function simulateTerm(expReturn, goal, initial, regularly) {
const arry = [initial];
let tmp = initial;
let t = 0;
while (tmp < goal) {
tmp = tmp * expReturn + regularly;
t++;
}
return t;
}
// t期間運用する場合の各時点での運用総額をシミュレーションする(チャート描画用)
function simulateRegularlyAmounts(expReturn, initial, regularly, t) {
const arry = [initial];
let tmp = initial;
for (let i = 1; i <= t; i++) {
arry[i] = tmp = tmp * expReturn + regularly;
}
return arry;
}
// 多項式f(x) = x^0 + x^1 + x^2 + ... + x^nの解を求める
function polynomial(x, n) {
let r = 1;
for (let i = 1; i <= n; i++) r = r * x + 1;
return r;
}
// 期待リターンRが年利の場合、それを月利換算するには R^(1/12)
function toMonthlyReturn(r) {
return Math.pow(r, 1 / 12)
}
// 期待リターンRが月利の場合、それを年利換算するには R^12
function toAnnualReturn(r) {
return Math.pow(r, 12)
}
// 各期の運用総額のシミュレーションにおけるボラティリティについては、ポートフォリオの月次ボラティリティを各時点の期間に換算する必要がありそう。
// https://www.nomura.co.jp/terms/japan/hi/A02397.html
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment