Last active
December 1, 2022 11:03
-
-
Save harunorimurata/da6e850211224042ab9804e780abf2f7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // 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