morris_learn#

  • Series: lecture-python.myst

  • File: lectures/morris_learn.md

  • Audit date: 2026-08-26

  • Corpus snapshot: e25fdf2345

  • Categories audited: writing, math, code, figures, references, links, admonitions (JAX out of scope)

  • Overall score: 8.5 / 10

  • Priority: HIGH

Score breakdown#

Category

Score

One-line note

Writing

3/10

qe-writing-001 ×2; qe-writing-009 (proposed) ×2; qe-writing-005 ×4, +6 more.

Math

9.5/10

qe-math-009 ×4.

Code

8.5/10

qe-code-001 ×4.

JAX

out of scope

JAX rules target lecture-jax.

Figures

10/10

no mechanical violations detected.

References

8.5/10

qe-ref-001 ×2.

Links

10/10

no mechanical violations detected.

Admonitions

10/10

no mechanical violations detected.

Issues#

Critical#

None found.

High severity#

  • [qe-writing-006] — Capitalize lecture titles properly. Count: 1. Lines: 330. Example: H2 Title Case: ‘Two Traders’ (Traders).

  • [qe-writing-008] — Remove excessive whitespace between words. Count: 48. Lines: 40, 49, 54, 55, 56, 58, 104, 105, 128, 140, …. Example: 2 spaces.

Medium severity#

  • [qe-code-001] (reviewer) — Follow PEP8 unless closer to mathematical notation. Count: 4. Lines: 484, 572, 589, 412. Example: 395 and 484 put LaTeX inside non-raw docstrings, so \t is a tab escape and the docstrings are corrupted at import time: """Return p(s,t,r) = r \tilde p(s,t,r) for two traders.""" renders as r <TAB>ilde p(s,t,r), and Compute \tilde p(s,t) for two Beta-prior traders the same way (verified with repr()). Both need an r prefix. 572-574 breaks one expression across three lines with a trailing operator and three different indents: conts.append(μ * / (1.0 + price_array[s+1, t+1]) /      + (1.0 - μ) * price_array[s, t+1]), where the equivalent two-trader code at 414-417 uses backslash continuations and the surrounding style is neither. Three f-strings carry no placeholders (589, 613, 693), which is F541. And 412 is a whitespace-only line inside a loop body; top-level defs are separated by one blank line where PEP8 asks for two (385/387, 391/393), and the two nested defs at 420-423 have none between them.

  • [qe-math-009] (reviewer) — Choose simplicity in mathematical notation. Count: 4. Lines: 499, 104, 267, 96. Example: the two figures use a symbol the lecture never defines. 499 and 531 label their axes \(p^*(0,0,r)\) and \(p^*(t/2,t,0.05)\), and 506 and 508 discuss \(p^*(0,0,r)\) - but the star in this lecture belongs to \(\mu\): {prf:definition} most_optimistic_valuation at 249-256 defines \(\mu^*(s,t) = \max_i \mu_i(s,t)\), and the normalized price is plain \(p(s,t,r)\) at 280. So the only notation a reader sees drawn is notation that appears nowhere in the definitions, and \(p^*\) invites reading it as “the price under the most optimistic trader”, which is not what it is. Second, the mean of trader \(i\)’s posterior has two names: \(\hat\theta_i\) at 104-105, where the fundamental value is \(\sum_{j\ge1}\beta^j\hat\theta_i = \hat\theta_i/r\), and \(\mu_i(s,t)\) from 227 onward; \(\hat\theta_i\) appears once and never again. Third, braces carry two jobs: they are sets at 82 (\(\{d_t\}\)), 85 (\(\{0,1\}\)), 358 (\(\max\{\mu_1, \mu_2\}\)) and 548 (\(\{(a_i,b_i)\}_{i=1}^N\)), and plain grouping delimiters inside an already-bracketed expression at 267 and 375 (\(\mu^*(s,t) \{1 + \tilde p(s+1,t+1,r)\}\)), where parentheses would read unambiguously. And \(\mathcal{I}\) (96, 255, 319) is the lecture’s only calligraphic symbol - \(\Theta\) at 146 is plain - for a set of traders that is never used as anything but an index range.

  • [qe-ref-001] — Use correct citation style. Count: 2. Lines: 158, 620. Example: {cite} in author position: ‘{cite}`harsanyi1968games3` argued’.

  • [qe-writing-001] — Use one sentence per paragraph. Count: 2. Lines: 151, 220. Example: 2 sentences in one paragraph.

  • [qe-writing-002] (reviewer) — Keep writing clear, concise, and valuable. Count: 4. Lines: 40, 238, 620, 146. Example: two sentences are garbled in ways that change what they say. 40: “Morris replaced Harrison and Kreps’s traders with hard-wired beliefs about the dividend stream with traders who use Bayes’ Law to update their beliefs” - the first “with” reads as the thing the traders are replaced by, so the sentence has to be re-parsed to recover “traders with hard-wired beliefs … with traders who use Bayes’ Law”. 238-239: “Fundamental valuations equal expected present values of dividends that our heterogeneous traders attach to the option of holding the asset forever” - a valuation cannot attach to an option; the intended object is the present value the traders attach to holding the asset forever. 620 carries a stray word: “opening market prices of initial public offerings seem higher than values prices that emerge later”. And 146-147 is 48 words with “the model” three times in one clause (“economic theorists reduce the set of models to a single model by imputing to all agents inside the model the same prior”), with 142 a further 42. Smaller items in the same vein: 598 has no full stop, and the message printed at 613, “No global optimist and speculative premium exists”, says the opposite of what it means to report.

  • [qe-writing-003] (reviewer) — Maintain logical flow. Count: 3. Lines: 300, 344, 428. Example: the algorithm described is not the algorithm implemented. 300-309 sets out value-function iteration - “Set \(p^0(s,t,r) = 0\) for all \((s,t,r)\)”, then the recursion for \(p^{n+1}\), then “The sequence \(\{p^n(s,t,r)\}\) converges to the equilibrium price” - and the code that follows does finite-horizon backward induction instead (365, 399-418), initialised not at zero but at a perpetuity terminal condition under the most optimistic belief (378, 402-405). Neither is wrong, but nothing links them: the note at 367-370 justifies working with finite \(T\) without mentioning that the iterative scheme just described has been dropped. Second, the units shift silently. 104-105 says the fundamental value is \(\hat\theta_i/r\); 230 says \(\mu_i(s,t)\) is the fundamental valuation; 280 reconciles them with \(p = r\tilde p\). {prf:theorem} two_trader_optimist then asserts \(p(s,t,r) = \mu_1(s,t)\) (350) - a normalized statement - and Case A verifies it in dollars, printing \(\tilde p(0,0) = 2.0\) against trader 1’s perpetuity value of \(2.0\) (443-448). The arithmetic is right (I checked: \(\beta/(1-\beta) \cdot 2/3 = 2\)), but the identity stated is never the identity tested, and item 2 of the theorem reads “In this case where \(p(s,t,r) = \mu_1(s,t)\)”, which is not a sentence. Third, two labels belong to a different lecture: the anchor (hk_go)= at 428 is never referenced, and the lecture’s only exercise is labelled hk_ex3 (627), numbering it as the third exercise of {doc}`harrison_kreps`.

  • [qe-writing-004] — Avoid unnecessary capitalization in narrative text. Count: 1. Lines: 154. Example: mid-sentence ‘Priors’.

  • [qe-writing-005] (reviewer) — Use bold for definitions, italic for emphasis. Count: 4. Lines: 252, 632, 53, 117. Example: definitions are bolded in some blocks and italicised in others, including in two adjacent prf:definition directives. {prf:definition} most_optimistic_valuation italicises its own term at 252 (“the most optimistic fundamental valuation is”) while {prf:definition} speculative_premium bolds its own at 322 (“Define the speculative premium as”), and 230 bolds fundamental valuation - the parent term of the one italicised at 252. The same split runs through the prose: bold for rate-dominates (337) and global optimist (349), italic for prior distributions (53), posterior distributions (54), risk-neutral (96), ex dividend (113), heterogeneous priors (132), Harsanyi Common Priors Doctrine (154) and global optimist again at 632 - the same term bolded at 349. Separately 117 sets an entire sentence in italic, “Short sales are prohibited”, where the lecture’s own correct emphasis is a single word (can / cannot at 121-122, every at 314, forever at 239).

  • [qe-writing-007] (reviewer) — Use visual elements to enhance understanding. Count: 2. Lines: 454, 528. Example: the mechanism the lecture is about is never drawn. 353 (“the identity of the most optimistic trader can switch as dividends accrue”) and 454 (“These produce crossing posteriors, so there is no global optimist”) are the pivot of the whole argument, and no figure shows \(\mu_1(s,t)\) and \(\mu_2(s,t)\) against \(t\) along a dividend path with the crossings marked - four lines of code given posterior_mean at 381, and the one picture that would make rate dominance and its failure visible side by side. Second, the speculative premium is defined as the gap \(p(s,t,r) - \mu^*(s,t) > 0\) (325) and never drawn as a gap: the figure at 528-533 plots the price against a horizontal line at \(0.5\), which equals \(\mu^*\) only because that figure walks the symmetric path \(s = t/2\) (as 543 explains); a second line for \(\mu^*(s,t)\) would show the definition directly and would survive off the symmetric path. Relatedly, Case A - the no-premium half of the lecture’s central contrast - is reported as three printed numbers (443-445) while Case B gets both figures, so only one side of the result is ever seen.

  • [qe-writing-009 (proposed)] — Write “IID” — not “i.i.d.” or “iid”. Count: 2. Lines: 82, 104. Example: i.i.d…

Low severity#

None found.

Strengths#

  • The lecture is explicit about exactly what it inherits from Harrison-Kreps and what it changes, three times over and at increasing detail: 34-40 states the substitution in one sentence, 47-56 lists the five features of Morris’s environment as a bulleted contrast ending in the consequence (“therefore they disagree about the value of the asset”), and 90-94 repeats the contrast at the point in the model where it bites.

  • The Harsanyi digression (136-189) defends a contested modelling choice instead of assuming it: it states the objection (138-142), explains the common-prior device that avoids it (144-147), attributes the doctrine (158-161), places Harrison-Kreps and Morris on either side of it (164-169, “abandons the Harsanyi doctrine less completely”), and then gives two respectable and different priors for the same ignorance - uniform and Jeffreys \(\text{Beta}(.5,.5)\) (184-185) - which is what makes the heterogeneity concrete rather than arbitrary.

  • The two cases are constructed to isolate one thing: Case A (429-448) and Case B (450-472) call the same price_learning_two_agents with the same \(\beta\) and \(T\) and differ only in the two prior pairs, so the presence and absence of the premium can be attributed to rate dominance and nothing else.

  • Every quantitative claim in the lecture checks out. I recomputed all of them: at \(r = 0.05\) the normalized price at \((0,0)\) is \(0.5442\), a premium of \(8.85\%\) over the common fundamental \(0.5\), which is the “about \(8-9\%\)” of 510; Case A’s dollar price at \((0,0)\) is exactly \(2.0\), trader 1’s perpetuity value, as 448 claims; and the three-trader price \(1.938\) exceeds the largest valuation \(1.80\), as 594 claims.

  • The rate-dominance condition is checked by code rather than asserted where it matters most - 600-614 tests all three traders in the \(N\)-trader example, and the exercise at 626-695 turns that check into a reusable function applied to four different prior sets, two with a dominant trader and two without.

  • The finite-horizon truncation is justified rather than adopted silently: the note at 367-370 cites the argument on page 1122 of {cite:t}`Morris1996` that the \(T \to \infty\) limit of finite-horizon economies excludes the Ponzi-component equilibria, so the reader knows why \(T = 200\) is not just convenience.

  • Prerequisites are named as links at the top rather than assumed (63-67: {doc}`harrison_kreps`, {doc}`likelihood_ratio_process`, {doc}`likelihood_bayes`), and the conjugacy fact the whole computation rests on is stated in its own note at 219-221.