Calculate your precise investment performance using the MWRR (XIRR) method
MWRR Calculator
Enter your initial investment, cash flows, and ending value to calculate your Money Weighted Return.
The amount you started with.
Current value of your investments.
Money Weighted Return (Annualized)
0.00%
Calculated using the XIRR formula
Total Invested
$0.00
Net Profit/Loss
$0.00
Total Return (Absolute)
0.00%
Chart shows cumulative cash flow vs. ending value interpolation.
Cash Flow Summary
Date
Type
Amount
Money Weighted Return Calculator Online: The Ultimate Guide
Investing is not just about picking the right assets; it's about measuring performance accurately. When you make multiple deposits and withdrawals over time, a simple percentage growth calculation fails to tell the true story. This is where a money weighted return calculator online becomes essential. It accounts for the timing and size of your cash flows to provide a precise measure of your personal investment performance.
Quick Definition: The Money Weighted Rate of Return (MWRR) is the discount rate that equates the present value of all cash outflows (investments) with the present value of all cash inflows (withdrawals and ending value). It is equivalent to the Internal Rate of Return (IRR).
What is Money Weighted Return (MWRR)?
The Money Weighted Return (MWRR) is a metric used to evaluate the performance of an investment portfolio where the investor controls the timing of cash flows. Unlike the Time Weighted Return (TWRR), which eliminates the effect of cash inflows and outflows to measure the manager's performance, MWRR measures the investor's actual return.
If you are an individual investor contributing to a 401(k), adding to a brokerage account, or withdrawing funds for retirement, the money weighted return calculator online is the most accurate tool to understand how your specific timing decisions affected your wealth.
Who Should Use This Calculator?
Individual Investors: To track personal portfolio performance including monthly contributions.
Real Estate Investors: To calculate returns on properties with irregular renovation costs and rental income.
Financial Planners: To show clients their actual realized growth rate.
MWRR Formula and Mathematical Explanation
The math behind our money weighted return calculator online is based on the Extended Internal Rate of Return (XIRR) formula. Since cash flows occur on irregular dates, we cannot use the standard IRR formula. Instead, we solve for the rate r in the following equation:
0 = Σ [ C(i) / (1 + r)^((d(i) – d(0)) / 365) ]
Where:
Variable
Meaning
Unit
C(i)
Cash flow amount (negative for deposit, positive for withdrawal)
Currency ($)
r
Money Weighted Return (Annualized)
Percentage (%)
d(i)
Date of the specific cash flow
Date
d(0)
Start date of the first investment
Date
Because this equation cannot be solved algebraically for r, our calculator uses a numerical method (Newton-Raphson) to find the precise rate that balances the equation to zero.
Practical Examples (Real-World Use Cases)
Example 1: The Lucky Timer
Imagine you invest $10,000 on January 1st. The market drops, and you invest another $10,000 on June 1st at the bottom. By December 31st, the portfolio is worth $25,000.
Inputs: Jan 1: -$10,000 | June 1: -$10,000 | Dec 31: +$25,000
Result: Your MWRR will be significantly higher than the market average because you added more money when prices were low. This highlights the impact of "buying the dip."
Example 2: The Poor Timer
You invest $10,000 on January 1st. The market soars, and you get excited, adding $10,000 on June 1st at the peak. The market corrects, and by December 31st, you have $21,000.
Inputs: Jan 1: -$10,000 | June 1: -$10,000 | Dec 31: +$21,000
Result: Even if the fund itself had a positive year, your personal MWRR might be lower because a large portion of your capital was invested at the peak.
How to Use This Money Weighted Return Calculator Online
Enter Initial Investment: Input the starting amount and the date you opened the account.
Add Cash Flows: Click "Add Cash Flow" for every deposit or withdrawal. Select "Deposit" for money adding to the account and "Withdrawal" for money taken out.
Enter Ending Value: Input the current market value of your portfolio and today's date (or the end date of the period).
Analyze Results: The calculator instantly computes your annualized return. Use the chart to visualize your net cash flow versus the final value.
Key Factors That Affect MWRR Results
When using a money weighted return calculator online, keep in mind that several factors influence the final percentage:
Timing of Cash Flows: Adding money before a market rally boosts MWRR; adding money before a crash hurts it.
Size of Cash Flows: Large deposits have a heavier "weight" on the return than small ones. A 50% gain on $100 is less impactful than a 10% loss on $100,000.
Market Volatility: High volatility combined with frequent contributions can lead to significant divergence between MWRR and TWRR.
Investment Duration: Short timeframes with high returns can show astronomically high annualized rates that may not be sustainable.
Fees and Expenses: Since MWRR is based on net cash flows, all fees deducted from the account automatically lower your calculated return.
Inflation: This calculator provides the nominal return. To find the real return, you would need to subtract the inflation rate.
Frequently Asked Questions (FAQ)
What is the difference between MWRR and TWRR?
MWRR accounts for the timing and size of your cash flows, reflecting your personal performance. TWRR (Time Weighted Return) eliminates the impact of cash flows to measure the investment manager's performance purely based on asset selection.
Why is my MWRR negative even if the market is up?
If you deposited a large sum of money right before a market drop, your personal return (MWRR) could be negative because the majority of your capital suffered a loss, even if the market index was positive for the full year.
Can I use this for real estate?
Yes. Treat the purchase price and renovation costs as deposits (negative cash flows) and rental income or refinance proceeds as withdrawals (positive cash flows). The final sale price is the ending value.
Does this calculator use XIRR?
Yes, this money weighted return calculator online uses the XIRR algorithm, which is the industry standard for calculating returns with irregular dates.
What is a good Money Weighted Return?
A "good" return depends on your risk profile and asset class. Generally, 7-10% is considered a solid long-term return for a diversified stock portfolio.
How do I handle dividends?
If dividends are reinvested automatically, do not enter them as cash flows. They are internal to the portfolio. Only enter dividends if you withdraw them as cash.
Why does the calculator show an error?
Ensure you have at least one negative cash flow (investment) and one positive cash flow (withdrawal or ending value). Also, check that dates are in chronological order.
Is MWRR the same as CAGR?
No. CAGR (Compound Annual Growth Rate) only looks at the start and end value, assuming no external cash flows. MWRR accounts for all deposits and withdrawals in between.
// Initialize default dates
var today = new Date();
var oneYearAgo = new Date();
oneYearAgo.setFullYear(today.getFullYear() – 1);
// Set default values
document.getElementById('endDate').valueAsDate = today;
document.getElementById('startDate').valueAsDate = oneYearAgo;
document.getElementById('initialAmount').value = "10000";
document.getElementById('endAmount').value = "11000";
// State for dynamic rows
var cashFlowCount = 0;
// Add initial cash flow row
addCashFlowRow();
// Function to add a cash flow row
function addCashFlowRow() {
cashFlowCount++;
var container = document.getElementById('cashFlowContainer');
var div = document.createElement('div');
div.className = 'cash-flow-row';
div.id = 'row-' + cashFlowCount;
var html = ";
// Date Input
html += '
';
html += ";
html += '
';
// Type Select
html += '
';
html += ";
html += 'Deposit (+ to acct)';
html += 'Withdrawal (- from acct)';
html += ";
html += '
';
// Amount Input
html += '
';
html += ";
html += '
';
// Remove Button
html += '';
div.innerHTML = html;
container.appendChild(div);
// Set default date for new row to somewhere in between if possible, or today
var inputs = div.getElementsByTagName('input');
inputs[0].valueAsDate = new Date();
}
function removeRow(id) {
var row = document.getElementById('row-' + id);
if (row) {
row.parentNode.removeChild(row);
calculateMWRR();
}
}
function resetCalculator() {
document.getElementById('initialAmount').value = "10000";
document.getElementById('endAmount').value = "11000";
document.getElementById('startDate').valueAsDate = oneYearAgo;
document.getElementById('endDate').valueAsDate = today;
document.getElementById('cashFlowContainer').innerHTML = ";
cashFlowCount = 0;
addCashFlowRow();
calculateMWRR();
}
function getDaysBetween(d1, d2) {
var oneDay = 24 * 60 * 60 * 1000;
return Math.round((d2 – d1) / oneDay);
}
// XIRR Calculation Logic
function calculateXIRR(values, dates) {
var guess = 0.1;
var x0 = guess;
var x1 = 0.0;
var err = 1e-6;
var maxIter = 100;
var i = 0;
// Normalize dates to days from start
var minDate = dates[0];
for(var k=1; k<dates.length; k++) {
if(dates[k] < minDate) minDate = dates[k];
}
var days = [];
for(var k=0; k<dates.length; k++) {
days.push(getDaysBetween(minDate, dates[k]) / 365.0);
}
// Newton-Raphson method
for (i = 0; i < maxIter; i++) {
var fValue = 0.0;
var fDerivative = 0.0;
for (var j = 0; j < values.length; j++) {
var val = values[j];
var d = days[j];
var base = 1.0 + x0;
// Avoid division by zero or negative base issues
if (base <= 0) base = 0.000001;
fValue += val / Math.pow(base, d);
fDerivative += -d * val / Math.pow(base, d + 1);
}
if (Math.abs(fDerivative) < 1e-10) {
break;
}
var newGuess = x0 – fValue / fDerivative;
if (Math.abs(newGuess – x0) < err) {
return newGuess;
}
x0 = newGuess;
}
return x0;
}
function calculateMWRR() {
// 1. Gather Inputs
var initialAmt = parseFloat(document.getElementById('initialAmount').value);
var startDt = new Date(document.getElementById('startDate').value);
var endAmt = parseFloat(document.getElementById('endAmount').value);
var endDt = new Date(document.getElementById('endDate').value);
if (isNaN(initialAmt) || isNaN(endAmt) || !startDt.getTime() || !endDt.getTime()) {
return; // Invalid basic inputs
}
// 2. Build Cash Flow Array
// Format: { amount: Number, date: Date, type: String }
// Note for XIRR:
// Outflows (Investments) are NEGATIVE.
// Inflows (Withdrawals) are POSITIVE.
// Ending Value is treated as a POSITIVE inflow (liquidation).
var cashFlows = [];
// Add Initial Investment (Negative)
cashFlows.push({
amount: -Math.abs(initialAmt),
date: startDt,
type: 'Initial'
});
// Add Intermediate Cash Flows
var rows = document.getElementsByClassName('cash-flow-row');
var totalDeposits = initialAmt;
var totalWithdrawals = 0;
for (var i = 0; i 0) {
if (typeInput.value === 'deposit') {
cashFlows.push({ amount: -amt, date: d, type: 'Deposit' });
totalDeposits += amt;
} else {
cashFlows.push({ amount: amt, date: d, type: 'Withdrawal' });
totalWithdrawals += amt;
}
}
}
// Add Ending Value (Positive)
cashFlows.push({
amount: Math.abs(endAmt),
date: endDt,
type: 'Ending Value'
});
// 3. Sort by Date
cashFlows.sort(function(a, b) {
return a.date – b.date;
});
// 4. Prepare Arrays for XIRR
var xirrValues = [];
var xirrDates = [];
for (var k = 0; k 0) {
absReturn = (netProfit / totalDeposits) * 100;
}
document.getElementById('totalInvested').innerText = "$" + totalDeposits.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('netProfit').innerText = "$" + netProfit.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2});
document.getElementById('absReturn').innerText = absReturn.toFixed(2) + "%";
// Update Table
updateSummaryTable(cashFlows);
// Update Chart
drawChart(cashFlows, startDt, endDt, initialAmt, endAmt);
}
function updateSummaryTable(flows) {
var tbody = document.querySelector('#summaryTable tbody');
tbody.innerHTML = ";
for (var i = 0; i < flows.length; i++) {
var tr = document.createElement('tr');
var dateStr = flows[i].date.toLocaleDateString();
var type = flows[i].type;
var amt = flows[i].amount;
// Format amount
var amtStr = "$" + Math.abs(amt).toLocaleString(undefined, {minimumFractionDigits: 2});
if (amt < 0) amtStr = "-" + amtStr;
else amtStr = "+" + amtStr;
tr.innerHTML = '
' + dateStr + '
' + type + '
' + amtStr + '
';
tbody.appendChild(tr);
}
}
function drawChart(flows, startDt, endDt, initial, end) {
var canvas = document.getElementById('mwrrChart');
var ctx = canvas.getContext('2d');
// Resize canvas for high DPI
var dpr = window.devicePixelRatio || 1;
var rect = canvas.getBoundingClientRect();
canvas.width = rect.width * dpr;
canvas.height = rect.height * dpr;
ctx.scale(dpr, dpr);
var width = rect.width;
var height = rect.height;
var padding = 40;
ctx.clearRect(0, 0, width, height);
// Basic validation
if (flows.length < 2) return;
// Determine Time Range
var minTime = startDt.getTime();
var maxTime = endDt.getTime();
var timeSpan = maxTime – minTime;
if (timeSpan <= 0) return;
// Calculate Cumulative Net Cash Flow over time for visualization
// We will plot points for every flow
var points = [];
var runningTotal = 0;
// We want to visualize "Invested Capital" vs "Value" roughly
// But since we don't have daily valuation data, we will plot:
// 1. Cumulative Net Investment (Step line)
// 2. A straight line from Start Value to End Value (Simplified Growth)
var cumulativeInvested = 0;
var investPoints = [];
for (var i = 0; i < flows.length; i++) {
// If amount is negative, we invested more. If positive (withdrawal), we reduced investment.
// Note: Ending value is a flow, but not an investment.
if (flows[i].type !== 'Ending Value') {
// Invert sign: Negative flow = Positive Investment
cumulativeInvested += -(flows[i].amount);
}
var x = padding + ((flows[i].date.getTime() – minTime) / timeSpan) * (width – 2 * padding);
investPoints.push({x: x, y: cumulativeInvested});
}
// Add end point for invested line
var xEnd = padding + (width – 2 * padding);
investPoints.push({x: xEnd, y: cumulativeInvested});
// Determine Y Scale
// Max value is either max invested or ending value
var maxY = Math.max(cumulativeInvested, end);
// Check intermediate peaks in invested capital
for(var p=0; p maxY) maxY = investPoints[p].y;
}
var minY = 0;
var yRange = maxY – minY;
if (yRange === 0) yRange = 100;
// Helper to map Y
function getY(val) {
return height – padding – ((val – minY) / yRange) * (height – 2 * padding);
}
// Draw Axes
ctx.beginPath();
ctx.strokeStyle = '#ccc';
ctx.lineWidth = 1;
// Y Axis
ctx.moveTo(padding, padding);
ctx.lineTo(padding, height – padding);
// X Axis
ctx.moveTo(padding, height – padding);
ctx.lineTo(width – padding, height – padding);
ctx.stroke();
// Draw Invested Line (Stepped)
ctx.beginPath();
ctx.strokeStyle = '#6c757d'; // Grey for invested capital
ctx.lineWidth = 2;
ctx.setLineDash([5, 5]);
if (investPoints.length > 0) {
ctx.moveTo(investPoints[0].x, getY(investPoints[0].y));
for (var j = 0; j < investPoints.length – 1; j++) {
// Step logic: Horizontal then Vertical
ctx.lineTo(investPoints[j+1].x, getY(investPoints[j].y));
ctx.lineTo(investPoints[j+1].x, getY(investPoints[j+1].y));
}
}
ctx.stroke();
ctx.setLineDash([]);
// Draw Growth Line (Simplified: Start Investment to End Value)
// In reality, MWRR curve is exponential, but linear approx connects start to end for visual
ctx.beginPath();
ctx.strokeStyle = '#28a745'; // Green for value
ctx.lineWidth = 3;
ctx.moveTo(padding, getY(initial));
ctx.lineTo(width – padding, getY(end));
ctx.stroke();
// Labels
ctx.fillStyle = '#333';
ctx.font = '12px Arial';
ctx.fillText("Start", padding, height – padding + 15);
ctx.fillText("End", width – padding – 20, height – padding + 15);
// Legend
ctx.fillStyle = '#6c757d';
ctx.fillText("– Net Invested Capital", padding + 10, padding – 10);
ctx.fillStyle = '#28a745';
ctx.fillText("— Portfolio Value (Approx)", padding + 150, padding – 10);
}
function copyResults() {
var mwrr = document.getElementById('mwrrResult').innerText;
var profit = document.getElementById('netProfit').innerText;
var text = "My Money Weighted Return (MWRR): " + mwrr + "\nNet Profit: " + profit + "\nCalculated using the Money Weighted Return Calculator Online.";
var tempInput = document.createElement("textarea");
tempInput.value = text;
document.body.appendChild(tempInput);
tempInput.select();
document.execCommand("copy");
document.body.removeChild(tempInput);
var btn = document.querySelector('.btn-outline');
var originalText = btn.innerText;
btn.innerText = "Copied!";
setTimeout(function(){ btn.innerText = originalText; }, 2000);
}
// Initial Calculation
calculateMWRR();