Use this 3 month weighted moving average calculator to smooth volatile monthly data by applying customized weights to each of the last three months, see the weighted moving average instantly, track intermediate sums, and visualize trends.
3 Month Weighted Moving Average Calculator
Most recent month (e.g., sales units, visitors, production).
Value from one month ago.
Value from two months ago.
Highest weight for most recent data if you want faster responsiveness.
Medium weight to balance recency with stability.
Lowest weight for older data to reduce noise.
Weighted Moving Average: 0.00
Formula: (M1×W1 + M2×W2 + M3×W3) / (W1+W2+W3)
Weighted Sum: 0.00
Total Weight: 0.00
Normalized Weights: 0.00 / 0.00 / 0.00
Trend Hint: –
Month
Value
Weight
Weighted Value
Total
0
0
0
3-month inputs with applied weights for the weighted moving average.
Blue line: raw monthly values | Green line: weighted moving average line (constant across the three months).
What is 3 month weighted moving average calculator?
The 3 month weighted moving average calculator is a focused tool that applies higher importance to recent monthly data while still respecting earlier points, creating a smoother signal for analysts who must react quickly without overreacting to noise. It is ideal for revenue managers, inventory planners, marketing analysts, and finance leaders who need to detect turning points without abandoning stability. A common misconception is that a 3 month weighted moving average calculator ignores older data entirely—weights simply scale influence, they do not delete history. Another misconception is that the 3 month weighted moving average calculator is only for seasonality; in reality it is powerful for demand planning, cash flow smoothing, and KPI tracking.
3 month weighted moving average calculator Formula and Mathematical Explanation
Mathematically, the 3 month weighted moving average calculator multiplies each monthly observation by an assigned weight, sums the weighted values, and divides by the sum of the weights. Giving larger weights to the latest months increases sensitivity to recent movements.
Step-by-step derivation:
Let M1 be the latest month, M2 the prior month, M3 the month before that.
Assign weights W1, W2, W3 that reflect desired emphasis.
Compute weighted sum S = (M1×W1) + (M2×W2) + (M3×W3).
Compute total weight T = W1 + W2 + W3.
The 3 month weighted moving average calculator result is WMA = S / T.
Variable
Meaning
Unit
Typical Range
M1
Most recent month value
units of metric
10 to 1,000,000
M2
Prior month value
units of metric
10 to 1,000,000
M3
Second prior month value
units of metric
10 to 1,000,000
W1
Weight on latest data
dimensionless
0.1 to 5.0
W2
Weight on middle data
dimensionless
0.1 to 5.0
W3
Weight on oldest data
dimensionless
0.1 to 5.0
WMA
Weighted moving average result
units of metric
10 to 1,000,000
Variables inside the 3 month weighted moving average calculator and their typical magnitudes.
Practical Examples (Real-World Use Cases)
Example 1: Subscription revenue smoothing
Inputs: M1=$95k, M2=$105k, M3=$120k with weights W1=0.5, W2=0.3, W3=0.2. The 3 month weighted moving average calculator yields WMA = (95×0.5 + 105×0.3 + 120×0.2)/(1.0) = 103.5k. Interpretation: the revenue trend is softening because recent value is below the weighted average, suggesting churn mitigation should be prioritized.
Example 2: Inventory demand planning
Inputs: M1=540 units, M2=500 units, M3=460 units with weights W1=0.6, W2=0.25, W3=0.15. The 3 month weighted moving average calculator returns WMA = (540×0.6 + 500×0.25 + 460×0.15)/(1.0) = 519 units. Interpretation: rising demand means procurement should raise purchase orders toward 519 units to avoid stockouts while keeping carrying costs contained.
How to Use This 3 month weighted moving average calculator
Enter the latest three monthly data points in the value fields.
Set weights to emphasize recency (higher W1) or stability (balanced weights).
Review the intermediate weighted sum and total weight for sanity checks.
Check the table to confirm each weighted value aligns with expectations.
Use the chart: if the green weighted line is below the blue raw points, momentum is declining.
Copy results to share assumptions with finance, operations, or marketing teams.
Reading results: a 3 month weighted moving average calculator above the latest raw month implies underlying momentum remains strong; a lower weighted value hints at softening demand. Decision guidance: adjust budgets, reorder quantities, or campaign pacing based on whether the weighted line trends up or down.
Key Factors That Affect 3 month weighted moving average calculator Results
Weight distribution: heavier W1 increases sensitivity to sudden shifts.
Data volatility: higher variance in M1-M3 makes the 3 month weighted moving average calculator more informative than a simple average.
Seasonality: if months span seasonal peaks, consider rebalancing weights to avoid overreaction.
Data quality: missing or anomalous values distort the weighted sum; clean inputs first.
Time horizon alignment: using exactly three months suits short cycles; mismatched horizons reduce signal quality.
Lag tolerance: lower W1 and higher W3 introduce stability but increase lag in the 3 month weighted moving average calculator signal.
Metric type: revenue, units, or traffic may require different weight intensity to reflect business sensitivity.
Risk posture: conservative planners prefer smoother weights to avoid over-ordering or over-spending.
Frequently Asked Questions (FAQ)
Does the 3 month weighted moving average calculator require weights to sum to 1? No, any positive weights work because the formula divides by total weight.
Can weights be zero? Yes, but a zero weight removes that month from influence; avoid all zeros.
What if one month is missing? Substitute a realistic estimate or reduce weight to keep the 3 month weighted moving average calculator stable.
Is this better than exponential smoothing? Use the 3 month weighted moving average calculator when you need transparent weights; exponential smoothing automates decay.
How often should I update weights? Update when business dynamics change—new pricing, seasonality shifts, or marketing mixes.
Can I use negative weights? No, negative weights distort the 3 month weighted moving average calculator by inverting signals.
What if values are cumulative? Use period-over-period values, not cumulative totals, for an accurate moving average.
How do I interpret divergence from the latest month? If WMA exceeds M1, underlying momentum is stronger than the latest point; if below, momentum is weakening.
Seasonality index builder – Adjust 3 month weighted moving average calculator inputs for seasonal peaks.
Cash flow smoother – Apply the 3 month weighted moving average calculator logic to inflows and outflows.
var month1Input=document.getElementById("month1Value");
var month2Input=document.getElementById("month2Value");
var month3Input=document.getElementById("month3Value");
var weight1Input=document.getElementById("weight1");
var weight2Input=document.getElementById("weight2");
var weight3Input=document.getElementById("weight3");
var err1=document.getElementById("err1");
var err2=document.getElementById("err2");
var err3=document.getElementById("err3");
var err4=document.getElementById("err4");
var err5=document.getElementById("err5");
var err6=document.getElementById("err6");
var resultMain=document.getElementById("resultMain");
var intermediate1=document.getElementById("intermediate1");
var intermediate2=document.getElementById("intermediate2");
var intermediate3=document.getElementById("intermediate3");
var intermediate4=document.getElementById("intermediate4");
var tableBody=document.getElementById("tableBody");
var totalValue=document.getElementById("totalValue");
var totalWeight=document.getElementById("totalWeight");
var totalWeighted=document.getElementById("totalWeighted");
var chartCanvas=document.getElementById("trendChart");
var ctx=chartCanvas.getContext("2d");
function validNumber(val){
return !isNaN(val) && val!=="" && isFinite(val);
}
function setError(el,msg){el.textContent=msg;}
function clearError(el){el.textContent="";}
function computeWMA(){
var m1=parseFloat(month1Input.value);
var m2=parseFloat(month2Input.value);
var m3=parseFloat(month3Input.value);
var w1=parseFloat(weight1Input.value);
var w2=parseFloat(weight2Input.value);
var w3=parseFloat(weight3Input.value);
var valid=true;
if(!validNumber(m1)||m1<0){setError(err1,"Enter a non-negative number.");valid=false;}else{clearError(err1);}
if(!validNumber(m2)||m2<0){setError(err2,"Enter a non-negative number.");valid=false;}else{clearError(err2);}
if(!validNumber(m3)||m3<0){setError(err3,"Enter a non-negative number.");valid=false;}else{clearError(err3);}
if(!validNumber(w1)||w1<=0){setError(err4,"Weight must be positive.");valid=false;}else{clearError(err4);}
if(!validNumber(w2)||w2<=0){setError(err5,"Weight must be positive.");valid=false;}else{clearError(err5);}
if(!validNumber(w3)||w3wma){trendHint="Latest value is above weighted trend (strengthening)";}
else if(m1<wma){trendHint="Latest value is below weighted trend (softening)";}
intermediate4.textContent="Trend Hint: "+trendHint;
renderTable(m1,m2,m3,w1,w2,w3,weighted1,weighted2,weighted3,sumWeighted,sumWeight);
drawChart([m1,m2,m3],[wma,wma,wma]);
}
function renderTable(m1,m2,m3,w1,w2,w3,wd1,wd2,wd3,sumWeighted,sumWeight){
var rows="";
rows+="
Month 1
"+m1.toFixed(2)+"
"+w1.toFixed(2)+"
"+wd1.toFixed(2)+"
";
rows+="
Month 2
"+m2.toFixed(2)+"
"+w2.toFixed(2)+"
"+wd2.toFixed(2)+"
";
rows+="
Month 3
"+m3.toFixed(2)+"
"+w3.toFixed(2)+"
"+wd3.toFixed(2)+"
";
tableBody.innerHTML=rows;
totalValue.textContent=(m1+m2+m3).toFixed(2);
totalWeight.textContent=sumWeight.toFixed(2);
totalWeighted.textContent=sumWeighted.toFixed(2);
}
function drawChart(rawValues,wmaSeries){
var width=chartCanvas.width;
var height=chartCanvas.height;
ctx.clearRect(0,0,width,height);
var padding=50;
var xPoints=[padding,width/2,padding+ (width-2*padding)];
var maxVal=Math.max.apply(null,rawValues.concat(wmaSeries));
var minVal=Math.min.apply(null,rawValues.concat(wmaSeries));
if(maxVal===minVal){maxVal=maxVal+1;minVal=minVal-1;}
function yPos(val){
return height-padding-((val-minVal)/(maxVal-minVal))*(height-2*padding);
}
ctx.strokeStyle="#dfe3e8";
ctx.lineWidth=1;
for(var i=0;i<4;i++){
var y=padding+i*((height-2*padding)/3);
ctx.beginPath();ctx.moveTo(padding,y);ctx.lineTo(width-padding,y);ctx.stroke();
}
ctx.fillStyle="#0c2c5c";
ctx.font="12px Arial";
ctx.fillText("Values",padding,20);
ctx.fillText("Months",width-80,height-10);
ctx.strokeStyle="#004a99";
ctx.lineWidth=3;
ctx.beginPath();
for(i=0;i<rawValues.length;i++){
var yR=yPos(rawValues[i]);
var xR=xPoints[i];
if(i===0){ctx.moveTo(xR,yR);}else{ctx.lineTo(xR,yR);}
}
ctx.stroke();
ctx.fillStyle="#004a99";
for(i=0;i<rawValues.length;i++){
ctx.beginPath();ctx.arc(xPoints[i],yPos(rawValues[i]),5,0,Math.PI*2);ctx.fill();
}
ctx.strokeStyle="#28a745";
ctx.lineWidth=2;
ctx.beginPath();
for(i=0;i<wmaSeries.length;i++){
var yW=yPos(wmaSeries[i]);
var xW=xPoints[i];
if(i===0){ctx.moveTo(xW,yW);}else{ctx.lineTo(xW,yW);}
}
ctx.stroke();
ctx.fillStyle="#28a745";
for(i=0;i<wmaSeries.length;i++){
ctx.beginPath();ctx.arc(xPoints[i],yPos(wmaSeries[i]),4,0,Math.PI*2);ctx.fill();
}
}
function resetDefaults(){
month1Input.value="95";
month2Input.value="105";
month3Input.value="120";
weight1Input.value="0.5";
weight2Input.value="0.3";
weight3Input.value="0.2";
clearError(err1);clearError(err2);clearError(err3);clearError(err4);clearError(err5);clearError(err6);
computeWMA();
}
function copyResults(){
var text="3 Month Weighted Moving Average Results\n";
text+=resultMain.textContent+"\n";
text+=intermediate1.textContent+"\n";
text+=intermediate2.textContent+"\n";
text+=intermediate3.textContent+"\n";
text+=intermediate4.textContent+"\n";
if(navigator.clipboard&&navigator.clipboard.writeText){
navigator.clipboard.writeText(text);
}else{
var temp=document.createElement("textarea");
temp.value=text;
document.body.appendChild(temp);
temp.select();
document.execCommand("copy");
document.body.removeChild(temp);
}
}
month1Input.oninput=computeWMA;
month2Input.oninput=computeWMA;
month3Input.oninput=computeWMA;
weight1Input.oninput=computeWMA;
weight2Input.oninput=computeWMA;
weight3Input.oninput=computeWMA;
computeWMA();