Trading Psychology
Chapter: 4.8 Trading Psychology Level: 3 — Production (from-scratch derivations, code-from-memory, explain-out-loud) Time limit: 45 minutes Total marks: 60
Instructions: Show all working. Where calculations are asked, derive from first principles. For "explain-out-loud" prompts, write as if teaching a peer.
Question 1 — Discipline, Process & Expectancy (12 marks)
A trader follows a written plan with a fixed setup. Over 50 journaled trades: 20 wins averaging +150 each.
(a) Derive the win rate, average win/loss ratio (R), and per-trade expectancy from first principles. State each formula before substituting. (6)
(b) Compute total expected profit over 50 trades and confirm it matches the actual net P&L. (3)
(c) Explain out loud why a process-over-outcome focus (4.8.10) means this trader should keep trading the setup even after a 6-trade losing streak. Reference expectancy in your answer. (3)
Question 2 — Fear, Greed & FOMO (10 marks)
(a) Derive, from scratch, a simple position-sizing formula that risks a fixed 1% of a 2 per share. Show the formula, then compute the share quantity. (5)
(b) Explain out loud how this fixed-risk rule mechanically neutralises both greed (4.8.2) and FOMO (4.8.3) at trade entry. (5)
Question 3 — Revenge Trading & Tilt (Code from memory) (12 marks)
Write, from memory, pseudocode (or Python) for a "circuit breaker" that prevents revenge trading (4.8.4) and tilt (4.8.5). It must:
- Track consecutive losses,
- Lock out trading after 3 consecutive losses OR after daily loss exceeds 3% of account,
- Reset the streak on a win,
- Print a lockout message.
(8) for correct logic/structure; (4) for explaining out loud which lines address tilt vs revenge trading.
Question 4 — Backtesting vs Paper Trading (10 marks)
(a) Derive the profit factor metric from scratch and compute it for a backtest with gross profits 5,000. State the pass/fail threshold you'd use. (4)
(b) Explain out loud three ways a clean backtest (4.8.8) can still fail in live trading, and how paper/demo trading (4.8.9) catches a subset of these. (6)
Question 5 — Losing Streaks & Drawdown (10 marks)
An account starts at $50,000 and suffers 5 consecutive 4% losses.
(a) Derive the compounding drawdown formula and compute the balance after 5 losses. (4)
(b) Compute the percentage gain now required to return to $50,000, and explain out loud why this asymmetry (4.8.11) justifies strict risk limits. (4)
(c) State one journal (4.8.7) field that would help diagnose whether the streak is variance or a broken strategy. (2)
Question 6 — Pre-Market Routine (6 marks)
Design, from memory, a 6-step pre-market routine (4.8.12) and a 3-item post-market review checklist. Beside each item, name the psychological failure it prevents. (6)
Answer keyMark scheme & solutions
Q1 (12 marks)
(a) Formulas + substitution:
- Win rate (40%). (1 formula + 1 value)
- R = average win / average loss . (1 + 1)
- Expectancy where . E = (0.40 \times 300) - (0.60 \times 150) = 120 - 90 = +\30$ per trade. (1 + 1)
(b) Total = 50 \times 30 = \1{,}50020\times300 - 30\times150 = 6000 - 4500 = $1{,}500$. Match ✓. (3)
(c) Expectancy is positive (+$30/trade), so over a large sample the setup makes money. A 6-loss streak is variance, not evidence the edge is gone. Process focus (4.8.10) means judging decisions by whether they followed the plan, not by individual outcomes; abandoning a +EV system after normal variance destroys the edge. (3)
Q2 (10 marks)
(a) Risk per trade = 1\% \times 40000 = \400\text{Shares} = \frac{\text{Risk$}}{\text{Stop distance}}= \frac{400}{2} = 200$ shares. (2)
(b) Greed pushes for oversized positions to "win big"; a fixed 1% rule caps position size mechanically regardless of conviction, so a greed impulse cannot enlarge risk. FOMO drives chasing untested entries; because size is derived from the pre-defined stop, a chased entry with a far/undefined stop yields a tiny share count, removing the incentive to chase. Rule replaces emotion with arithmetic. (5, ~2.5 each concept)
Q3 (12 marks)
Model answer:
class CircuitBreaker:
def __init__(self, account):
self.account = account
self.consec_losses = 0
self.daily_loss = 0.0
self.locked = False
def record_trade(self, pnl):
if pnl < 0:
self.consec_losses += 1 # tilt / revenge trigger
self.daily_loss += -pnl
else:
self.consec_losses = 0 # reset on win
if (self.consec_losses >= 3 or
self.daily_loss > 0.03 * self.account):
self.locked = True
print("LOCKED OUT: stop trading for today.")
def can_trade(self):
return not self.lockedMarking: streak tracking (2), daily-loss cap at 3% (2), reset on win (2), lockout print/flag (2). (8)
Explain-out-loud (4): the consec_losses >= 3 branch addresses revenge trading — it stops the trader from firing off more trades to "win back" losses. The daily_loss > 3% branch and the hard locked flag address tilt — it removes decision-making capacity while emotionally compromised, enforcing a cool-off regardless of intent. (4)
Q4 (10 marks)
(a) Profit factor . (2 formula + 1 value) Threshold: is required to be profitable; a robust live-ready system typically wants . So 1.6 passes. (1)
(b) Three failure modes (2 each):
- Overfitting/curve-fitting — parameters tuned to historical noise; demo trading on unseen live data exposes this.
- Slippage & fees not modelled — backtest fills are idealised; paper trading shows realistic fills/latency.
- Execution & psychology — backtest has no hesitation, no fat-fingers, no emotional deviation; demo trading reveals whether the trader can actually pull the trigger. (Paper trading catches slippage/execution/psychology but not overfitting, since it still uses the same fitted rules.) (6)
Q5 (10 marks)
(a) Compounding: . (2) ; B = 50000 \times 0.8154 = \40{,}769.03$. (2)
(b) Loss fraction . Required gain . (2) Asymmetry: an 18.5% loss needs a 22.6% gain to recover — losses compound harder than gains recover, so capping per-trade risk (4.8.11) prevents drawdowns from becoming mathematically hard to climb out of. (2)
(c) Any of: "setup / rule-adherence tag", or "R-multiple per trade" — comparing actual win rate & R over the streak against the tested expectancy tells you if results are within normal variance (keep going) or the edge has degraded (stop/revise). (2)
Q6 (6 marks)
Award 0.5 per routine item, 0.5 per named failure prevented (12 half-marks ≈ 6).
Pre-market (6 steps): (1) Check overnight news → prevents blind entries/surprise; (2) Mark key levels → prevents impulsive, unplanned trades; (3) Define risk budget & max daily loss → prevents tilt/revenge; (4) Review trading plan/watchlist → prevents FOMO chasing; (5) Emotional/state check-in → prevents trading on tilt; (6) Set alerts, no manual staring → prevents greed/overtrading.
Post-market (3): (1) Log every trade with reason → journal discipline; (2) Score rule-adherence (process, not P&L) → process-over-outcome; (3) Note one improvement → prevents repeated mistakes / builds consistency.
[
{"claim":"Q1 expectancy per trade is $30", "code":"W=Rational(20,50); aw=300; al=150; E=(W*aw)-((1-W)*al); result=(E==30)"},
{"claim":"Q1 total profit over 50 trades is $1500", "code":"total=20*300-30*150; result=(total==1500)"},
{"claim":"Q2 position size is 200 shares", "code":"risk=Rational(1,100)*40000; shares=risk/2; result=(shares==200)"},
{"claim":"Q4 profit factor is 1.6", "code":"pf=Rational(8000,5000); result=(pf==Rational(8,5))"},
{"claim":"Q5 balance after 5 losses approx 40769.03", "code":"B=50000*(Rational(96,100))**5; result=(abs(float(B)-40769.03)<0.5)"},
{"claim":"Q5 required recovery gain approx 22.64%", "code":"B=50000*(Rational(96,100))**5; g=(50000-B)/B; result=(abs(float(g)-0.2264)<0.001)"}
]