diff --git a/.eslintrc.js b/.eslintrc.js index 07a2163..73ebe9b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,33 +1,34 @@ module.exports = { - "env": { - "browser": true, - "es2021": true + env: { + browser: true, + es2021: true, + }, + extends: [ + 'standard-with-typescript', + 'plugin:prettier/recommended', + 'plugin:jest/recommended', + ], + overrides: [ + { + env: { + node: true, + }, + files: ['.eslintrc.{js,cjs}'], + parserOptions: { + sourceType: 'script', + }, }, - "extends": ["standard-with-typescript", - "plugin:prettier/recommended", - "plugin:jest/recommended" - ], - "overrides": [ - { - "env": { - "node": true - }, - "files": [ - ".eslintrc.{js,cjs}" - ], - "parserOptions": { - "sourceType": "script" - } - } - ], - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "plugins": [ - // other plugins - "jest" - ], - "rules": { - } -} + ], + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: [ + // other plugins + 'jest', + ], + ignorePatterns: ['dist/', 'node_modules/', 'examples/', '*.js'], + rules: { + '@typescript-eslint/consistent-type-definitions': ['error', 'type'], + }, +}; diff --git a/README.md b/README.md index cc69c21..61b6a25 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,10 @@ To address these challenges, I started developing the Retirement Calculator pack - **Contribution Calculation**: Determine monthly contributions needed to reach your desired retirement balance. - **Withdrawal Estimation**: Understand how much you can safely spend from your retirement savings each year. - **Inflation Adjustment**: Take into account the impact of inflation on your retirement savings and planning. +- **Dynamic Interest Glidepaths**: Age-aware return calculations with three powerful strategies: + - **Fixed Return Glidepath**: Linear decline from aggressive to conservative returns + - **Allocation-Based Glidepath**: Target-date fund style with equity/bond blending + - **Custom Waypoints**: Flexible strategies with user-defined age/return targets ## Usage @@ -54,30 +58,114 @@ const contributionsNeeded = getContributionNeededForDesiredBalance(1000,10000,10 const balance = calculator.getCompoundInterestWithAdditionalContributions(1000, contributionsNeeded.contributionNeededPerPeriod, 10, .1, 12, 12); ``` +### Dynamic Interest Glidepath Calculations + +**NEW**: Age-aware retirement calculations with sophisticated glidepath strategies. + +#### Fixed Return Glidepath +Perfect for modeling target-date funds or declining return assumptions: + +```typescript +const calculator = new RetirementCalculator(); +const result = calculator.getCompoundInterestWithGlidepath( + 25000, // Starting balance + 1000, // Monthly contribution + 25, // Starting age + 65, // Retirement age + { + mode: 'fixed-return', + startReturn: 0.10, // 10% returns at age 25 + endReturn: 0.055 // 5.5% returns at age 65 + } +); + +console.log(`Final balance: $${calculator.formatNumberWithCommas(result.finalBalance)}`); +console.log(`Effective annual return: ${(result.effectiveAnnualReturn * 100).toFixed(2)}%`); +``` + +#### Allocation-Based Glidepath +Model target-date funds with changing equity/bond allocations: + +```typescript +const targetDateResult = calculator.getCompoundInterestWithGlidepath( + 50000, 1500, 30, 65, + { + mode: 'allocation-based', + startEquityWeight: 0.90, // 90% stocks at 30 + endEquityWeight: 0.30, // 30% stocks at 65 + equityReturn: 0.12, // 12% stock returns + bondReturn: 0.04 // 4% bond returns + } +); +``` + +#### Custom Waypoints Glidepath +Create sophisticated strategies with precise control: + +```typescript +const customResult = calculator.getCompoundInterestWithGlidepath( + 15000, 800, 25, 65, + { + mode: 'custom-waypoints', + valueType: 'equityWeight', + waypoints: [ + { age: 25, value: 1.0 }, // 100% equity at 25 + { age: 35, value: 0.85 }, // 85% equity at 35 + { age: 45, value: 0.70 }, // 70% equity at 45 + { age: 55, value: 0.50 }, // 50% equity at 55 + { age: 65, value: 0.25 } // 25% equity at 65 + ], + equityReturn: 0.11, + bondReturn: 0.035 + } +); + +// Rich timeline data for visualization +console.log(`Timeline entries: ${customResult.monthlyTimeline.length}`); +customResult.monthlyTimeline.forEach(entry => { + console.log(`Age ${entry.age.toFixed(1)}: ${(entry.currentAnnualReturn * 100).toFixed(2)}% return`); +}); +``` + ### Example Scenarios -I have made a couple example scenarios that can be found [here](examples). This may give inspiration on how to best use this tool to plan for retirement. There is a lot more to retirement than simply plugging numbers into a compounding interest calculator. +I have created example scenarios that can be found [here](examples). These demonstrate both traditional and dynamic glidepath approaches to retirement planning. -#### Scenario 1 -Perhaps you have a starting balance in your retirement account, and want to get to the "prized" goal of $1,000,000. Calculate how well you are doing now, and where you need to be in order to achieve your goal. Also, potentially plan with inflation as this could severely impact your results. To run, use ts-node in your console. +#### Basic Retirement Gap Analysis +Perfect for when you have a specific retirement balance goal (like "$1 million") and want to see if your current savings rate is sufficient. This example shows you how to calculate your "retirement gap" and demonstrates the power of compound interest and why inflation matters for long-term planning. -Running the script will output the following: +```bash +npx ts-node examples/basic-retirement-gap-analysis.ts +``` - +#### Lifestyle-Based Retirement Planning +Ideal for people who think in terms of "I want to spend $X per year in retirement" rather than accumulating a lump sum. This example works backwards from your desired lifestyle to required savings and shows how the 4% withdrawal rule works in practice. -#### Scenario 2 -Perhaps you don't know how much you want to have in retirement. Instead, you would like to be able to spend $80,000 a year in retirement and not run out of money in 30 years based on the 4% rule. You could also see what that would mean if you included inflation and wanted your $80,000 a year to go as far in 25 years as it does now. To run, use ts-node in your console. +```bash +npx ts-node examples/lifestyle-based-retirement-planning.ts +``` + +#### Advanced Dynamic Investment Strategies ✨ **NEW** +For advanced users who want to model changing investment strategies over time (like target-date funds) and compare sophisticated approaches. This comprehensive example demonstrates all glidepath modes with detailed comparisons and educational insights. -Running the script will output the following: +```bash +npx ts-node examples/advanced-dynamic-investment-strategies.ts +``` - +This example showcases: +- **Fixed return glidepaths** for declining return assumptions +- **Allocation-based strategies** mimicking target-date funds +- **Custom waypoint strategies** for precise control +- **Performance comparisons** between traditional and dynamic approaches +- **Timeline data usage** for creating charts and visualizations +- **Educational insights** about why different strategies work -More scenarios will be added as I add planned capabilities in the future. +More scenarios will be added as I continue to enhance the calculator's capabilities. ## Planned Enhancements -- **Detailed Periodic Reporting**: Provide a detailed breakdown of investments and interest accrued over each period, ideal for visualization. - **Fee Management**: Include functionality to account for management fees and their long-term impact. -- **Dynamic Interest Rates**: Adapt to changing interest rates to reflect different stages of financial planning. - **Loan and Withdrawal Impact**: Assess the effect of loans or withdrawals on your retirement savings. +- **Monte Carlo Simulations**: Probabilistic modeling for market volatility and uncertainty. +- **Tax-Advantaged Account Modeling**: Support for 401(k), IRA, Roth IRA contribution limits and tax implications. ## Upcoming Integration - **Interactive UI**: Developing an intuitive interface for easy retirement planning. diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css index c7af87d..6ee61fb 100644 --- a/docs/assets/highlight.css +++ b/docs/assets/highlight.css @@ -17,6 +17,10 @@ --dark-hl-7: #B5CEA8; --light-hl-8: #008000; --dark-hl-8: #6A9955; + --light-hl-9: #000000FF; + --dark-hl-9: #D4D4D4; + --light-hl-10: #267F99; + --dark-hl-10: #4EC9B0; --light-code-background: #FFFFFF; --dark-code-background: #1E1E1E; } @@ -31,6 +35,8 @@ --hl-6: var(--light-hl-6); --hl-7: var(--light-hl-7); --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); --code-background: var(--light-code-background); } } @@ -44,6 +50,8 @@ --hl-6: var(--dark-hl-6); --hl-7: var(--dark-hl-7); --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); --code-background: var(--dark-code-background); } } @@ -57,6 +65,8 @@ --hl-6: var(--light-hl-6); --hl-7: var(--light-hl-7); --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); --code-background: var(--light-code-background); } @@ -70,6 +80,8 @@ --hl-6: var(--dark-hl-6); --hl-7: var(--dark-hl-7); --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); --code-background: var(--dark-code-background); } @@ -82,4 +94,6 @@ .hl-6 { color: var(--hl-6); } .hl-7 { color: var(--hl-7); } .hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } +.hl-10 { color: var(--hl-10); } pre, code { background: var(--code-background); } diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 2ebb324..05e37ea 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAE42PUUvDMBRG/0ueh8OBInu0btCXdpbuYYhIll7ddclNTW7AIv53I4hrWVP2nPOdc/P0JRg+WSxFBYwODBBnUqugJVsnZqKVfIivSkvvwc/HqKsDGx3RI1IjlteLu+/ZvzUri7rK77d1XhYv62r1uF0V2e7kBQrGz8epoXdgtcQO94HR0trBRwBSXd21cBIjMbhXqeLNSXoYWNzc9hIPEPcGCfrrZCJJTyUya1obqEF624BD20SLRO0nPpIeXBjKf23gudy/g+JLSueLqdQOpNNdb/534mglBZ8Hnn8AkTxPAagCAAA=" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,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" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index 45c1b39..7dcaf57 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/classes/RetirementCalculator.html b/docs/classes/RetirementCalculator.html deleted file mode 100644 index b71e9d9..0000000 --- a/docs/classes/RetirementCalculator.html +++ /dev/null @@ -1,47 +0,0 @@ -
Private getPrivate getPrivate getPrivate getPrivate getPrivate getPrivate getPrivate Calculate the compound multiplier based on contribution and compounding frequencies. -ex. If we contribute yearly, but compound monthly, then our compound multiplier would be 12.
-Private convertDetermine the contribution needed at what frequency to reach a desired balance.
-Calculate compound interest with additional contributions made over a given period of time.
-The initial balance.
-The additional contribution amount.
-The number of years.
-The interest rate.
-The contribution frequency.
-The compounding frequency.
-An object that contains the results, and a history.
-Aggregates detailed compounding period data into yearly data. -This method is useful for visualizing the growth of an investment on an annual basis.
-The detailed compounding data from the interest calculation.
-An array of aggregated yearly data.
-Generated using TypeDoc
RetirementCalculator provides various methods to calculate retirement finances, +including inflation adjustments, balance after inflation, and compound interest calculations.
+Private getPrivate getPrivate getPrivate Calculate the total interest multiplier used for determining contributions needed to hit a goal. +Uses the geometric series formula for efficiency: sum = a(r^n - 1)/(r - 1)
+Private getPrivate getPrivate getPrivate getPrivate Calculate the compound multiplier based on contribution and compounding frequencies. +ex. If we contribute yearly, but compound monthly, then our compound multiplier would be 12.
+Private convertDetermine the contribution needed at what frequency to reach a desired balance.
+Calculate compound interest with additional contributions made over a given period of time.
+The initial balance.
+The additional contribution amount.
+The number of years.
+The interest rate.
+The contribution frequency.
+The compounding frequency.
+An object that contains the results, and a history.
+Aggregates detailed compounding period data into yearly data. +This method is useful for visualizing the growth of an investment on an annual basis.
+The detailed compounding data from the interest calculation.
+An array of aggregated yearly data.
+Calculate compound interest with age-aware glidepath strategies. +Supports fixed returns, allocation-based strategies, and custom waypoints.
+Starting account balance
+Amount contributed per contribution period
+Starting age for calculation
+Ending age for calculation
+Strategy configuration (fixed, allocation-based, or custom)
+Number of contributions per year (default: 12)
+Number of compounding periods per year (default: 12)
+When contributions are added ('start' or 'end' of period)
+Detailed glidepath calculation results with timeline data
+Private calculatePrivate Calculate the annual return rate for a given age using the specified glidepath strategy.
+Current age for calculation
+Glidepath configuration
+Starting age for age-based calculations
+Ending age for age-based calculations
+Annual return rate (decimal format)
+Private calculatePrivate calculatePrivate Calculate return for fixed-return glidepath (linear interpolation).
+Current age
+Fixed return configuration
+Starting age for calculation
+Ending age for calculation
+Annual return rate
+Private calculatePrivate Calculate return for stepped-return glidepath (Money Guy style).
+Current age
+Stepped return configuration
+Annual return rate
+Private calculatePrivate Calculate return for allocation-based glidepath.
+Current age
+Allocation-based configuration
+Starting age for calculation
+Ending age for calculation
+Annual return rate
+Private interpolatePrivate calculatePrivate Calculate blended return based on equity and bond allocation.
+Equity allocation weight (0.0 to 1.0)
+Expected annual equity return
+Expected annual bond return
+Blended annual return rate
+Private calculatePrivate Calculate return for custom waypoints glidepath.
+Current age
+Custom waypoints configuration
+Annual return rate
+Private getPrivate Get the current equity weight for allocation-based and custom waypoints configurations. +Used for timeline data enrichment.
+Current age
+Glidepath configuration
+Starting age for age-based calculations
+Ending age for age-based calculations
+Equity weight (0.0 to 1.0) or undefined for non-allocation modes
+Private convertGenerated using TypeDoc
Specific error class for calculation runtime errors. +Used for errors that occur during the calculation process.
+Static captureStatic Optional prepareOptional override for formatting stack traces
+Static stackOptional stackReadonly codeReadonly fieldReadonly valueReadonly constraintReadonly suggestionReadonly severityReadonly categoryReadonly contextReadonly timestampReadonly nameGenerated using TypeDoc
Specific error class for configuration errors. +Used for glidepath configuration structure issues.
+Static captureStatic Optional prepareOptional override for formatting stack traces
+Static stackOptional stackReadonly codeReadonly fieldReadonly valueReadonly constraintReadonly suggestionReadonly severityReadonly categoryReadonly contextReadonly timestampReadonly nameGenerated using TypeDoc
Base class for all dynamic glidepath validation errors. +Extends the native Error class with enhanced error information.
+Static captureStatic Private formatFormat error message with consistent structure.
+Static Optional prepareOptional override for formatting stack traces
+Static stackOptional stackReadonly nameReadonly codeReadonly fieldReadonly valueReadonly constraintReadonly suggestionReadonly severityReadonly categoryReadonly contextReadonly timestampGenerated using TypeDoc
Specific error class for validation errors. +Used for input parameter validation failures.
+Static captureStatic Optional prepareOptional override for formatting stack traces
+Static stackOptional stackReadonly codeReadonly fieldReadonly valueReadonly constraintReadonly suggestionReadonly severityReadonly categoryReadonly contextReadonly timestampReadonly nameGenerated using TypeDoc
Builder class for constructing validation results.
+Add an error to the validation result.
+Add a warning to the validation result.
+Add multiple errors.
+Add multiple warnings.
+Build the final validation result.
+Clear all errors and warnings.
+Private errorsPrivate warningsGenerated using TypeDoc
Generated using TypeDoc
Generated using TypeDoc
Create age-related validation errors.
+Optional endAge: numberGenerated using TypeDoc
Create allocation weight validation errors.
+Generated using TypeDoc
Create runtime calculation errors.
+Optional context: Record<string, unknown>Generated using TypeDoc
Create configuration structure errors.
+Optional expectedValues: string[]Generated using TypeDoc
Create financial parameter validation errors.
+Generated using TypeDoc
Create return rate validation errors.
+Generated using TypeDoc
Create warning errors for performance and usability issues.
+Optional context: Record<string, unknown>Generated using TypeDoc
Create waypoint-specific validation errors.
+Optional index: numberGenerated using TypeDoc
Convert errors to API-friendly format.
+Generated using TypeDoc
Format errors for console display.
+Optional showOptional showOptional groupGenerated using TypeDoc
Get summary statistics for error collection.
+Generated using TypeDoc
Group errors by category for organized display.
+Generated using TypeDoc
Group errors by severity for prioritized handling.
+Generated using TypeDoc
Type guard to check if an error is blocking (prevents calculation).
+Generated using TypeDoc
Type guard to check if an error is a calculation error.
+Generated using TypeDoc
Type guard to check if an error is a configuration error.
+Generated using TypeDoc
Type guard to check if an error is a DynamicGlidepathError.
+Generated using TypeDoc
Type guard to check if an error is a validation error.
+Generated using TypeDoc
Type guard to check if an error is a warning (non-blocking).
+Generated using TypeDoc
Type guard to check if a configuration is an allocation-based configuration.
+Generated using TypeDoc
Type guard to check if a configuration is a custom waypoints configuration.
+Generated using TypeDoc
Type guard to check if a configuration is a fixed return configuration.
+Generated using TypeDoc
Type guard to check if a configuration is a stepped return configuration.
+Generated using TypeDoc
Welcome to the Retirement Calculator – your go-to tool for comprehensive retirement planning!
+Welcome to the Retirement Calculator – your go-to tool for comprehensive retirement planning!
Are you ready to embark on the journey of securing your financial future? Planning for retirement can be both exciting and challenging. As someone with a deep passion for personal finance and a desire for a brighter financial future, I've created this tool to help you navigate the complexities of retirement planning.
To use the Retirement Calculator in your project, install it via npm:
npm i retirement-calculator
@@ -14,6 +14,12 @@
Contribution Calculation: Determine monthly contributions needed to reach your desired retirement balance.
Withdrawal Estimation: Understand how much you can safely spend from your retirement savings each year.
Inflation Adjustment: Take into account the impact of inflation on your retirement savings and planning.
+Dynamic Interest Glidepaths: Age-aware return calculations with three powerful strategies:
+- Fixed Return Glidepath: Linear decline from aggressive to conservative returns
+- Allocation-Based Glidepath: Target-date fund style with equity/bond blending
+- Custom Waypoints: Flexible strategies with user-defined age/return targets
+
+
Usage
Importing the Calculator
import { RetirementCalculator } from 'retirement-calculator';
@@ -21,19 +27,41 @@
const calculator = new RetirementCalculator();
const contributionsNeeded = getContributionNeededForDesiredBalance(1000,10000,10,.1,12,12);
// You won't necessarily hit your exact goal, so to find out what the exact total would be, run the following
const balance = calculator.getCompoundInterestWithAdditionalContributions(1000, contributionsNeeded.contributionNeededPerPeriod, 10, .1, 12, 12);
-I have made a couple example scenarios that can be found here. This may give inspiration on how to best use this tool to plan for retirement. There is a lot more to retirement than simply plugging numbers into a compounding interest calculator.
-Perhaps you have a starting balance in your retirement account, and want to get to the "prized" goal of $1,000,000. Calculate how well you are doing now, and where you need to be in order to achieve your goal. Also, potentially plan with inflation as this could severely impact your results. To run, use ts-node in your console.
-Running the script will output the following:
-
Perhaps you don't know how much you want to have in retirement. Instead, you would like to be able to spend $80,000 a year in retirement and not run out of money in 30 years based on the 4% rule. You could also see what that would mean if you included inflation and wanted your $80,000 a year to go as far in 25 years as it does now. To run, use ts-node in your console.
-Running the script will output the following:
-
More scenarios will be added as I add planned capabilities in the future.
+NEW: Age-aware retirement calculations with sophisticated glidepath strategies.
+Perfect for modeling target-date funds or declining return assumptions:
+const calculator = new RetirementCalculator();
const result = calculator.getCompoundInterestWithGlidepath(
25000, // Starting balance
1000, // Monthly contribution
25, // Starting age
65, // Retirement age
{
mode: 'fixed-return',
startReturn: 0.10, // 10% returns at age 25
endReturn: 0.055 // 5.5% returns at age 65
}
);
console.log(`Final balance: $${calculator.formatNumberWithCommas(result.finalBalance)}`);
console.log(`Effective annual return: ${(result.effectiveAnnualReturn * 100).toFixed(2)}%`);
+
+Model target-date funds with changing equity/bond allocations:
+const targetDateResult = calculator.getCompoundInterestWithGlidepath(
50000, 1500, 30, 65,
{
mode: 'allocation-based',
startEquityWeight: 0.90, // 90% stocks at 30
endEquityWeight: 0.30, // 30% stocks at 65
equityReturn: 0.12, // 12% stock returns
bondReturn: 0.04 // 4% bond returns
}
);
+
+Create sophisticated strategies with precise control:
+const customResult = calculator.getCompoundInterestWithGlidepath(
15000, 800, 25, 65,
{
mode: 'custom-waypoints',
valueType: 'equityWeight',
waypoints: [
{ age: 25, value: 1.0 }, // 100% equity at 25
{ age: 35, value: 0.85 }, // 85% equity at 35
{ age: 45, value: 0.70 }, // 70% equity at 45
{ age: 55, value: 0.50 }, // 50% equity at 55
{ age: 65, value: 0.25 } // 25% equity at 65
],
equityReturn: 0.11,
bondReturn: 0.035
}
);
// Rich timeline data for visualization
console.log(`Timeline entries: ${customResult.monthlyTimeline.length}`);
customResult.monthlyTimeline.forEach(entry => {
console.log(`Age ${entry.age.toFixed(1)}: ${(entry.currentAnnualReturn * 100).toFixed(2)}% return`);
});
+
+I have created example scenarios that can be found here. These demonstrate both traditional and dynamic glidepath approaches to retirement planning.
+Perfect for when you have a specific retirement balance goal (like "$1 million") and want to see if your current savings rate is sufficient. This example shows you how to calculate your "retirement gap" and demonstrates the power of compound interest and why inflation matters for long-term planning.
+npx ts-node examples/basic-retirement-gap-analysis.ts
+
+Ideal for people who think in terms of "I want to spend $X per year in retirement" rather than accumulating a lump sum. This example works backwards from your desired lifestyle to required savings and shows how the 4% withdrawal rule works in practice.
+npx ts-node examples/lifestyle-based-retirement-planning.ts
+
+For advanced users who want to model changing investment strategies over time (like target-date funds) and compare sophisticated approaches. This comprehensive example demonstrates all glidepath modes with detailed comparisons and educational insights.
+npx ts-node examples/advanced-dynamic-investment-strategies.ts
+
+This example showcases:
+More scenarios will be added as I continue to enhance the calculator's capabilities.
Docs were made with TypeDoc and can be found here.
This project is licensed under the MIT License.
For any inquiries or collaboration ideas, please feel free to reach out through GitHub issues on this repository. You can also connect with me on LinkedIn for professional networking and discussions.
-Generated using TypeDoc
Generated using TypeDoc
Object representing compounding interest calculations.
-Balance amount.
-Total contributions made.
-Total interest earned.
-Number of years.
-Contribution frequency.
-Compounding frequency.
-Compounding period details.
-Generated using TypeDoc
Represents the details of a single compounding period in the compound interest calculation. -This includes information on the total balance, contributions, and interest for each period.
-CompoundingPeriodDetailsType
-The specific compounding period, starting from 1.
-The total balance at the end of this compounding period.
-The cumulative total of contributions made up to this period.
-The cumulative total of interest earned up to this period.
-The amount of interest earned during this specific period.
-The portion of the current balance attributable to contributions.
-The portion of the current balance attributable to accumulated interest.
-Generated using TypeDoc
Object representing the details needed to determine contributions.
-Contribution needed per period.
-Contribution needed per period with inflation.
-Desired balance.
-Desired balance with inflation.
-Desired balance value after inflation.
-Generated using TypeDoc
Represents the aggregated data for a single year in the compound interest calculation. - YearlyCompoundingDetails
-The year number starting from 1.
-The cumulative total contributions made up to the end of the year.
-The cumulative total interest earned up to the end of the year.
-The balance at the end of the year.
-Generated using TypeDoc
Object representing compounding interest calculations.
+Balance amount.
+Total contributions made.
+Total interest earned.
+Number of years.
+Contribution frequency.
+Compounding frequency.
+Compounding period details.
+Generated using TypeDoc
Represents the details of a single compounding period in the compound interest calculation. +This includes information on the total balance, contributions, and interest for each period.
+CompoundingPeriodDetailsType
+The specific compounding period, starting from 1.
+The total balance at the end of this compounding period.
+The cumulative total of contributions made up to this period.
+The cumulative total of interest earned up to this period.
+The amount of interest earned during this specific period.
+The portion of the current balance attributable to contributions.
+The portion of the current balance attributable to accumulated interest.
+Generated using TypeDoc
Generated using TypeDoc
Object representing the details needed to determine contributions.
+Contribution needed per period.
+Contribution needed per period with inflation.
+Desired balance.
+Desired balance with inflation.
+Desired balance value after inflation.
+Generated using TypeDoc
Represents the aggregated data for a single year in the compound interest calculation. + YearlyCompoundingDetails
+The year number starting from 1.
+The cumulative total contributions made up to the end of the year.
+The cumulative total interest earned up to the end of the year.
+The balance at the end of the year.
+Generated using TypeDoc
Generated using TypeDoc
Generated using TypeDoc
Generated using TypeDoc
Generated using TypeDoc
Generated using TypeDoc
Generated using TypeDoc
Error categories for grouping related errors.
+Generated using TypeDoc
Error severity levels.
+Generated using TypeDoc
Type for error code values.
+Generated using TypeDoc
Enhanced error information interface that extends the base Error. +Provides comprehensive context for debugging and user-facing applications.
+Machine-readable error code
+Field name that caused the error
+The invalid value that was provided
+Description of the constraint that was violated
+Helpful suggestion for fixing the error
+Error severity level
+Error category for grouping
+Optional context?: Record<string, unknown>Additional context data
+Generated using TypeDoc
Validation result interface for comprehensive error reporting.
+Whether validation passed
+Array of validation errors
+Array of validation warnings
+Generated using TypeDoc
Configuration for allocation-based glidepath that blends equity and bond returns +based on linearly interpolated equity allocation by age.
+Use case: Age-based asset allocation strategies (e.g., "120 minus age" rule)
+Discriminator for the glidepath configuration type.
+Equity allocation percentage at starting age (0.0 to 1.0).
+0.90 represents 90% equity allocation
+
+Equity allocation percentage at ending age (0.0 to 1.0).
+0.30 represents 30% equity allocation
+
+Expected annual return for equity portion (decimal format). +Must be > -1.0 (cannot lose more than 100%).
+0.12 represents 12% annual equity return
+
+Expected annual return for bond portion (decimal format). +Must be > -1.0 (cannot lose more than 100%).
+0.04 represents 4% annual bond return
+
+const config: AllocationBasedGlidepathConfig = {
mode: 'allocation-based',
startEquityWeight: 0.90, // 90% equity at start
endEquityWeight: 0.30, // 30% equity at end
equityReturn: 0.12, // 12% equity returns
bondReturn: 0.04 // 4% bond returns
};
+
+Generated using TypeDoc
Error thrown when calculation results in numeric overflow.
+Generated using TypeDoc
Utility type to extract the configuration type for a specific glidepath mode.
+Generated using TypeDoc
Defines when monthly contributions are added within each month.
+Generated using TypeDoc
Configuration for custom waypoints glidepath that uses user-defined +age/value pairs with linear interpolation between points.
+Use case: Custom investment strategies with specific target allocations or returns at key ages
+Discriminator for the glidepath configuration type.
+Array of waypoints defining the glidepath curve. +Must contain at least one waypoint. +Waypoints will be automatically sorted by age.
+Specifies what the waypoint values represent.
+Optional equityExpected annual return for equity portion (decimal format). +Required when valueType is 'equityWeight', ignored when valueType is 'return'. +Must be > -1.0 (cannot lose more than 100%).
+Optional bondExpected annual return for bond portion (decimal format). +Required when valueType is 'equityWeight', ignored when valueType is 'return'. +Must be > -1.0 (cannot lose more than 100%).
+Return-based waypoints
+const config: CustomWaypointsGlidepathConfig = {
mode: 'custom-waypoints',
valueType: 'return',
waypoints: [
{ age: 25, value: 0.12 }, // 12% at 25
{ age: 40, value: 0.08 }, // 8% at 40
{ age: 65, value: 0.05 } // 5% at 65
]
};
+
+Equity allocation waypoints
+const config: CustomWaypointsGlidepathConfig = {
mode: 'custom-waypoints',
valueType: 'equityWeight',
waypoints: [
{ age: 20, value: 1.0 }, // 100% equity at 20
{ age: 35, value: 0.8 }, // 80% equity at 35
{ age: 50, value: 0.6 }, // 60% equity at 50
{ age: 65, value: 0.3 } // 30% equity at 65
],
equityReturn: 0.11,
bondReturn: 0.035
};
+
+Generated using TypeDoc
Utility type for custom waypoints configuration with required equity/bond returns.
+Generated using TypeDoc
Union type representing all possible glidepath configuration modes. +Uses discriminated union pattern with 'mode' as the discriminator.
+Generated using TypeDoc
Comprehensive result object returned by the dynamic glidepath method. +Contains final calculations, metadata, timeline data, and summary statistics.
+Total account balance at the end of the simulation period. +Rounded to the nearest cent for precision.
+Sum of all monthly contributions made during the simulation period.
+Total interest earned through compound growth during the simulation period.
+Total number of months simulated. +Calculated as Math.ceil((endAge - startAge) * 12)
+Starting age from the input parameters.
+Ending age from the input parameters.
+The glidepath mode that was used for this calculation.
+Detailed month-by-month timeline data. +Each entry represents the state at the end of that month. +Useful for creating charts and detailed analysis.
+Effective compound annual growth rate over the entire simulation period. +Calculated as (finalBalance / initialBalance)^(1/years) - 1
+Average monthly return rate across all months in the simulation. +Simple arithmetic mean of all monthly return rates used.
+const result: DynamicGlidepathResult = calculator.getCompoundInterestWithDynamicGlidepath(
25000, 1000, 30, 65, config
);
console.log(`Final balance: $${result.finalBalance.toLocaleString()}`);
console.log(`Total months: ${result.totalMonths}`);
console.log(`Effective annual return: ${(result.effectiveAnnualReturn * 100).toFixed(2)}%`);
+
+Generated using TypeDoc
Configuration for fixed return glidepath that linearly interpolates +between start and end return rates based on age.
+Use case: Target-date funds that reduce returns as retirement approaches
+Discriminator for the glidepath configuration type.
+Annual return rate at the starting age (decimal format). +Must be > -1.0 (cannot lose more than 100%).
+0.10 represents 10% annual return
+
+Annual return rate at the ending age (decimal format). +Must be > -1.0 (cannot lose more than 100%).
+0.055 represents 5.5% annual return
+
+const config: FixedReturnGlidepathConfig = {
mode: 'fixed-return',
startReturn: 0.10, // 10% at starting age
endReturn: 0.055 // 5.5% at ending age
};
+
+Generated using TypeDoc
Identifies the type of glidepath strategy being used.
+Generated using TypeDoc
Represents a single waypoint in a custom glidepath configuration.
+Age at which this waypoint applies. +Must be positive.
+Value at this waypoint.
+const waypoint: GlidepathWaypoint = {
age: 35,
value: 0.08 // 8% return or 80% equity weight, depending on valueType
};
+
+Generated using TypeDoc
Error thrown when age parameters are invalid.
+Generated using TypeDoc
Error thrown when allocation weights are invalid.
+Generated using TypeDoc
Error thrown when financial parameters are invalid.
+Generated using TypeDoc
Error thrown when glidepath configuration is invalid.
+Generated using TypeDoc
Error thrown when return rates are invalid.
+Generated using TypeDoc
Error thrown when waypoints configuration is invalid.
+Generated using TypeDoc
Represents the detailed state of the account at the end of a specific month. +Used for timeline visualization and detailed analysis.
+Month number in the simulation (1-based). +Month 1 is the first month, month 12 is the end of the first year, etc.
+User's age at the end of this month. +Increments by 1/12 each month from the starting age.
+Total account balance at the end of this month. +Includes initial balance, all contributions, and compound interest.
+Cumulative total of all contributions made up to and including this month.
+Cumulative total of all interest earned up to and including this month.
+Amount of interest earned during this specific month.
+Annual return rate that was used for this month's calculation. +This is the rate determined by the glidepath strategy for the user's age this month.
+Monthly return rate that was applied during this month. +Converted from annual rate using: (1 + annualRate)^(1/12) - 1
+Optional currentCurrent equity allocation weight for this month. +Only present for allocation-based and custom waypoints with equityWeight valueType. +Undefined for fixed-return glidepaths.
+const entry: MonthlyTimelineEntry = {
month: 120,
age: 39.92,
currentBalance: 125750.50,
cumulativeContributions: 120000,
cumulativeInterest: 5750.50,
monthlyInterestEarned: 825.33,
currentAnnualReturn: 0.085,
currentMonthlyReturn: 0.006825,
currentEquityWeight: 0.75 // Only present for allocation-based modes
};
+
+Generated using TypeDoc
Error thrown when numerical precision loss is detected.
+Generated using TypeDoc
Utility type to make certain properties of a type required.
+Generated using TypeDoc
Generated using TypeDoc
Base error type for retirement calculator-specific errors.
+Generated using TypeDoc
Configuration for stepped return glidepath that declines by a fixed rate per year +until reaching a terminal return, then holds that return.
+Use case: Money Guy Show strategy and other step-down approaches
+Discriminator for the glidepath configuration type.
+Starting annual return rate before decline begins (decimal format). +Must be > -1.0 (cannot lose more than 100%).
+0.10 represents 10% annual return
+
+Annual decline rate applied each year (decimal format). +Must be >= 0 (cannot have negative decline rates).
+0.001 represents 0.1% decline per year
+
+Terminal annual return rate that is held after terminalAge (decimal format). +Must be > -1.0 (cannot lose more than 100%).
+0.055 represents 5.5% annual return floor
+
+Age at which the decline begins. +Must be positive and less than terminalAge.
+20 means decline starts at age 20
+
+Age at which the terminal return is reached and held. +Must be greater than declineStartAge. +Defaults to 65 if not specified.
+65 means terminal return is reached at age 65
+
+const config: SteppedReturnGlidepathConfig = {
mode: 'stepped-return',
baseReturn: 0.10, // 10% starting return
declineRate: 0.001, // 0.1% decline per year
terminalReturn: 0.055, // 5.5% floor
declineStartAge: 20, // Start declining at 20
terminalAge: 65 // Reach terminal at 65
};
+
+Generated using TypeDoc
Const Readonly Default configuration values for dynamic glidepath calculations. +These provide sensible starting points for retirement planning scenarios.
+Readonly FIXED_Default fixed return glidepath configuration. +Represents a typical target-date fund progression.
+Readonly START_Starting return rate for aggressive investing (10%)
+Readonly END_Ending return rate for conservative investing (5.5%)
+Readonly ALLOCATION_Default allocation-based glidepath configuration. +Follows the common "120 minus age" equity allocation rule progression.
+Readonly START_Starting equity weight for young investors (90%)
+Readonly END_Ending equity weight near retirement (30%)
+Readonly EQUITY_Expected annual return for equity investments (12%)
+Readonly BOND_Expected annual return for bond investments (4%)
+Readonly AGES: { Default ages for glidepath calculations.
+Readonly START_Typical starting career age
+Readonly END_Standard retirement age
+Generated using TypeDoc
Const Readonly Error messages for dynamic glidepath validation failures. +These provide clear, actionable feedback to developers and users.
+Readonly AGES: { Age-related validation errors.
+Readonly NEGATIVE_Readonly NEGATIVE_Readonly START_Readonly AGE_Readonly AGE_Readonly FINANCIAL: { Financial parameter validation errors.
+Readonly NEGATIVE_Readonly NEGATIVE_Readonly BALANCE_Readonly RETURNS: { Return rate validation errors.
+Readonly RETURN_Readonly RETURN_Readonly HIGH_Readonly ALLOCATIONS: { Allocation weight validation errors.
+Readonly WEIGHT_Readonly WEIGHT_Readonly MODES: { Glidepath mode validation errors.
+Readonly INVALID_Readonly MISSING_Readonly WAYPOINTS: { Waypoint validation errors.
+Readonly EMPTY_Readonly INVALID_Readonly INVALID_Readonly TOO_Readonly MISSING_Readonly MISSING_Readonly GENERAL: { General configuration errors.
+Readonly INVALID_Readonly CONFIGURATION_Generated using TypeDoc
Const Readonly Mathematical constants and precision settings for glidepath calculations. +These ensure numerical stability and consistent rounding behavior.
+Readonly PRECISION: { Precision and rounding constants.
+Readonly CURRENCY_Number of decimal places for monetary amounts
+Readonly CURRENCY_Multiplier for currency rounding (100 for cents)
+Readonly PERCENTAGE_Number of decimal places for percentage calculations
+Readonly INTEREST_Number of decimal places for interest rate calculations
+Readonly EPSILON: { Epsilon values for floating-point comparisons.
+Readonly GENERAL: 1e-10General floating-point comparison tolerance
+Readonly CURRENCY: 0.0001Currency comparison tolerance (0.01 cents)
+Readonly PERCENTAGE: 1e-8Percentage comparison tolerance
+Readonly CONVERSION: { Mathematical conversion constants.
+Readonly MONTHS_Months per year for age calculations
+Readonly WEEKS_Weeks per year for contribution calculations
+Readonly DAYS_Days per year for precise calculations
+Generated using TypeDoc
Const Readonly Performance optimization thresholds for glidepath calculations. +These help determine when to use memory-optimized calculation modes.
+Readonly TIMELINE: { Timeline generation thresholds.
+Readonly LARGE_Number of months above which to consider memory optimization
+Readonly PERFORMANCE_Number of months above which to warn about performance
+Readonly CACHE: { Cache size limits for performance optimization.
+Readonly MAX_Maximum number of cached monthly rate conversions
+Readonly MAX_Maximum number of cached waypoint interpolations
+Generated using TypeDoc
Const Pre-configured glidepath strategies based on popular financial planning approaches. +Each preset includes documentation links to the original methodology.
+Readonly MONEY_Money Guy Show strategy: 10% returns declining 0.1% per year to 5.5% floor at age 65.
+This strategy holds 10% returns until age 20, then declines by exactly 0.1% per year +until reaching the 5.5% floor at age 65, then holds that terminal return.
+Source: https://www.moneyguy.com/ +Reference: Financial Order of Operations and investment return assumptions
+Readonly mode: "stepped-return"Readonly baseReadonly declineReadonly terminalReadonly declineReadonly terminalReadonly BOGLEHEADS_Bogleheads "100 minus age" equity allocation strategy.
+Conservative interpretation with minimum 20% equity allocation. +Uses historical US total stock market returns (10%) and intermediate bonds (4%).
+Source: https://www.bogleheads.org/wiki/Asset_allocation +Reference: Age-based allocation guidelines and three-fund portfolio
+Readonly BOGLEHEADS_Bogleheads "110 minus age" more aggressive equity allocation strategy.
+More aggressive interpretation for longer time horizons and higher risk tolerance. +Maintains higher equity allocation throughout the lifecycle.
+Source: https://www.bogleheads.org/wiki/Asset_allocation +Reference: Age-based allocation variations for aggressive investors
+Readonly BOGLEHEADS_Bogleheads "120 minus age" very aggressive equity allocation strategy.
+Most aggressive interpretation for very long time horizons and high risk tolerance. +Suitable for young investors with decades until retirement.
+Source: https://www.bogleheads.org/wiki/Asset_allocation +Reference: Age-based allocation variations for very aggressive investors
+Generated using TypeDoc
Const Readonly Configuration templates for common glidepath scenarios. +These provide ready-to-use configurations for typical retirement planning needs.
+Readonly CONSERVATIVE: { Conservative glidepath with lower volatility.
+Readonly FIXED_Readonly START_Readonly END_Readonly ALLOCATION_Readonly START_Readonly END_Readonly EQUITY_Readonly BOND_Readonly AGGRESSIVE: { Aggressive glidepath with higher growth potential.
+Readonly FIXED_Readonly START_Readonly END_Readonly ALLOCATION_Readonly START_Readonly END_Readonly EQUITY_Readonly BOND_Readonly MODERATE: { Moderate/balanced glidepath (same as defaults).
+Readonly FIXED_Readonly START_Starting return rate for aggressive investing (10%)
+Readonly END_Ending return rate for conservative investing (5.5%)
+Readonly ALLOCATION_Readonly START_Starting equity weight for young investors (90%)
+Readonly END_Ending equity weight near retirement (30%)
+Readonly EQUITY_Expected annual return for equity investments (12%)
+Readonly BOND_Expected annual return for bond investments (4%)
+Generated using TypeDoc
Const Readonly Validation constraints for dynamic glidepath parameters. +These ensure mathematical soundness and prevent invalid configurations.
+Readonly AGES: { Age validation limits.
+Readonly MIN_Minimum allowed age (must be positive)
+Readonly MAX_Maximum reasonable age for calculations
+Readonly MIN_Minimum age difference for meaningful glidepath
+Readonly RETURNS: { Return rate validation limits.
+Readonly MIN_Minimum return rate (-99% loss maximum)
+Readonly MAX_Maximum reasonable return rate (100% annual gain)
+Readonly HIGH_Typical range warning threshold for high returns
+Readonly ALLOCATIONS: { Allocation weight validation limits.
+Readonly MIN_Minimum allocation weight (0%)
+Readonly MAX_Maximum allocation weight (100%)
+Readonly FINANCIAL: { Financial parameter validation limits.
+Readonly MIN_Minimum balance (must be non-negative)
+Readonly MIN_Minimum contribution (must be non-negative)
+Readonly MAX_Maximum reasonable balance for calculations
+Readonly WAYPOINTS: { Waypoint validation limits.
+Readonly MIN_Minimum number of waypoints required
+Readonly MAX_Maximum recommended waypoints for performance
+Generated using TypeDoc
Const Enumeration of all possible error codes for dynamic glidepath validation. +These codes provide machine-readable error identification.
+Readonly NEGATIVE_Readonly INVALID_Readonly INSUFFICIENT_Readonly NEGATIVE_Readonly NEGATIVE_Readonly IMPOSSIBLE_Readonly INVALID_Readonly INVALID_Readonly INVALID_Readonly INVALID_Readonly UNKNOWN_Readonly INVALID_Readonly EMPTY_Readonly INVALID_Readonly INVALID_Readonly INVALID_Readonly MISSING_Readonly MISSING_Readonly LONG_Readonly LARGE_Readonly UNUSUAL_Readonly EXTREME_Readonly EXTREME_Readonly WAYPOINTS_Readonly WAYPOINT_Readonly CALCULATION_Readonly STRATEGY_Readonly SIMULATION_Generated using TypeDoc
RetirementCalculator provides various methods to calculate retirement finances, -including inflation adjustments, balance after inflation, and compound interest calculations.
-