Economic Moats & Macro
Level 5 (Mastery): Cross-Domain Analysis, Modeling & Proof
Time limit: 90 minutes Total marks: 60
Instructions: Show all working. Where computation is required, present formulae before substitution. Math must be exact where possible; round monetary values to 2 decimals and rates to 2 decimal places (basis points where noted). Answer all three questions.
Question 1 — Moats, Porter's Forces & Management (20 marks)
A hypothetical firm, NetLedger Ltd, operates a B2B payments network. You are given:
- Each new business joining the network raises the value to existing members. Value to a member is modeled by Metcalfe's proportionality: network value where is the number of connected businesses and is a constant.
- The firm has 2,000 businesses today, growing to 2,500 next year.
- Gross margin is 78%; the nearest competitor's gross margin is 61%.
- Customer switching cost is estimated at ₹4.2 lakh per business (integration + retraining).
(a) Compute the percentage increase in modeled network value as grows from 2,000 to 2,500. Show the algebra symbolically first, then evaluate. (5)
(b) Prove that under this Metcalfe model the marginal network value grows linearly in , and state precisely why this constitutes a widening network-effect moat (not merely a static one). (5)
(c) Identify which two of Porter's Five Forces are most directly weakened by the combination of (i) the network effect and (ii) the ₹4.2 lakh switching cost. Justify each mapping in one or two sentences. (4)
(d) The CEO's compensation is 85% equity, vesting over 5 years, with buybacks funded by debt while ROIC (14%) comfortably exceeds WACC (9%). Assess management quality: give three distinct evidence-based judgements (positive or negative), each tied to a specific figure or moat interaction. (6)
Question 2 — Rates, Bond–Equity Cross-Domain Valuation (22 marks)
The RBI holds the repo rate at 6.50%, then cuts it by 50 bps. Assume the risk-free rate moves 1:1 with the repo.
(a) A 3-year annual-coupon government bond has face value ₹1,000, coupon 7%. Compute its price before and after the rate cut, using discount rate = risk-free rate = repo rate. Then compute the modified duration at the pre-cut yield, and use it to approximate the price change; compare with the exact change and comment on the approximation error. (10)
(b) For equities, a dividend-discount (Gordon) model gives price . A stock has , growth . Its required return is with equity risk premium ERP = 5.5%. Using = repo rate, compute before and after the 50 bps cut, and the percentage price change. (6)
(c) Derive, from the Gordon model, a general expression for the sensitivity and use it to explain analytically why low-growth, long-duration equities react more violently to rate changes than high-yield value stocks. Connect this to why bond and equity prices generally move inversely to rates. (6)
Question 3 — Macro Cycle Simulation & Sector Rotation (18 marks)
You are given a discrete model of an economy over 8 quarters. Output gap (%) and inflation (%) evolve; the central bank sets the policy rate via a Taylor-type rule:
with , target inflation .
Quarterly data:
| t | (%) | (%) |
|---|---|---|
| 1 | -2.0 | 3.0 |
| 2 | -1.0 | 3.5 |
| 3 | 1.0 | 5.0 |
| 4 | 2.5 | 6.0 |
| 5 | 1.5 | 5.5 |
| 6 | -0.5 | 4.5 |
(a) Compute for all six quarters using the rule. (6)
(b) Classify each quarter into a business-cycle phase (early recovery, expansion/peak, slowdown, contraction) using the signs/trends of and and the direction of . Justify with the data. (6)
(c) Write pseudocode (or Python) for a function recommend_sector(g, pi, i_prev, i_now) that returns a sector recommendation (e.g., cyclicals/industrials, consumer staples/utilities, financials, tech/growth) consistent with the standard sector-rotation map. Then apply it to the transition from t=3 to t=4 and state the recommended overweight sector with reasoning. (6)
Answer keyMark scheme & solutions
Question 1
(a) [5 marks] . Percentage increase — cancels. (2 for symbolic cancellation)
. . (1)
Increase . (1)
≈ 56.27% increase (a 25% increase in members yields a ~56% value increase — super-linear). (1)
(b) [5 marks] . (3 for correct expansion) This is linear in (slope ). (1) Because each additional member adds value proportional to the current size , the moat widens as the firm grows: the incumbent's per-member value advantage over a small rival grows without bound, raising the entry barrier over time rather than staying fixed. (1)
(c) [4 marks]
- Threat of new entrants — weakened by the network effect: a new entrant starts with small , hence tiny , and cannot match incumbent value. (2)
- Bargaining power of buyers (customers) — weakened by the ₹4.2 lakh switching cost, which locks members in and reduces their leverage to demand price cuts or leave. (2) (Accept "rivalry among competitors" for the network point if well argued, but entrants/buyers is the tightest mapping.)
(d) [6 marks] Any three, 2 marks each:
- Positive — value creation: ROIC 14% > WACC 9% (a 5-point spread) means capital is deployed above its cost; buybacks funded here are accretive because the moat sustains high returns. (2)
- Positive — alignment: 85% equity, 5-year vesting aligns CEO with long-term shareholder value and discourages short-termism. (2)
- Caution/negative — leverage risk: debt-funded buybacks increase financial leverage; sustainable only while ROIC>WACC and moat holds — if rates rise or network erodes, the leveraged structure amplifies downside. Flag as a risk to monitor. (2)
Question 2
(a) [10 marks] Pre-cut rate . Coupon = ₹70/yr, face ₹1,000.
(≈). (3)
Post-cut : . (2)
Exact change . (1)
Macaulay duration at 6.50%: yrs. Modified duration yrs. (2)
Approx price change . (1)
Comparison: approximation (+₹13.35) underestimates exact (+₹14.14) by ~₹0.79 because duration is a linear (first-order) estimate ignoring positive convexity, which makes the true price gain slightly larger. (1)
(b) [6 marks] Pre-cut: . . (2) Post-cut: . . (2) % change . (2)
(c) [6 marks] . (3) The magnitude blows up as , i.e. when growth is close to (long-duration/high-growth priced-for-the-future stocks). So a small rate rise (higher ) causes a proportionally larger price fall for these than for high-yield value stocks where is large and the denominator is stable. (2) Because , prices move inversely to rates — identical in sign to bonds, whose PV of fixed cash flows also falls when discount rates rise. (1)
Question 3
(a) [6 marks] Rule: . (1 mark each row)
| t | calc | |
|---|---|---|
| 1 | 3.50% | |
| 2 | 4.75% | |
| 3 | 8.00% | |
| 4 | 10.25% | |
| 5 | 9.00% | |
| 6 | 6.50% |
(b) [6 marks] (1 mark each)
- t1: , low , low rate → contraction / trough.
- t2: still negative but rising, rising, rate rising → early recovery.
- t3: , high & rising, rate rising sharply → expansion.
- t4: peak (2.5), peak (6.0), highest rate → peak / overheating.
- t5: falling, falling, rate falling → slowdown.
- t6: again, near target, rate down to 6.50% → early contraction / late slowdown.
(c) [6 marks] Function [3], application [3]:
def recommend_sector(g, pi, i_prev, i_now):
rising_rates = i_now > i_prev
if g < 0 and rising_rates: # early recovery
return "cyclicals/industrials"
if g > 0 and rising_rates: # expansion -> peak
return "financials (rate-sensitive) / energy"
if g > 0 and not rising_rates: # slowdown begins
return "consumer staples/utilities"
if g < 0 and not rising_rates: # contraction, easing
return "tech/growth (long-duration benefits from cuts)"
return "balanced"Application t3→t4: , rose 8.00→10.25 (rising) → returns "financials / energy". Reasoning: at the overheating peak with rising rates, banks earn wider net interest margins and commodity/energy names benefit from inflation, while long-duration growth is penalised by rising discount rates. (3)
[
{"claim":"Q1a network value increase ~56.27%","code":"V=lambda n:n*(n-1); r=(V(2500)-V(2000))/V(2000)*100; result=abs(r-56.2656)<0.01"},
{"claim":"Q1b marginal value equals 2kn","code":"from sympy import symbols,expand,simplify; n,k=symbols('n k'); dV=expand(k*(n+1)*n - k*n*(n-1)); result=simplify(dV-2*k*n)==0"},
{"claim":"Q2a pre-cut bond price ~1012.49","code":"P=70/1.065+70/1.065**2+1070/1.065**3; result=abs(P-1012.49)<0.05"},
{"claim":"Q2a exact change ~14.14","code":"P0=70/1.065+70/1.065**2+1070/1.065**3; P1=70/1.06+70/1.06**2+1070/1.06**3; result=abs((P1-P0)-14.14)<0.1"},
{"claim":"Q2b equity % change ~7.69","code":"P0=12/0.07; P1=12/0.065; ch=(P1-P0)/P0*100; result=abs(ch-7.6923)<0.01"},
{"claim":"Q3a Taylor rate t4 = 10.25","code":"i=2+6+0.5*(6-4)+0.5*2.5; result=abs(i-10.25)<1e-9"},
{"claim":"Q3a Taylor rate t2 = 4.75","code":"i=2+3.5+0.5*(3.5-4)+0.5*(-1.0); result=abs(i-4.75)<1e-9"}
]