@sdelsad/commodity-desk-daily 1.0.17 → 1.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/STYLE.md +439 -0
- package/__pycache__/build_page.cpython-314.pyc +0 -0
- package/__pycache__/chart.cpython-314.pyc +0 -0
- package/build_email.py +773 -0
- package/build_page.py +1237 -0
- package/build_post.py +291 -0
- package/chart.py +563 -0
- package/conversions.md +156 -0
- package/curriculum.md +294 -0
- package/ep01.md +144 -0
- package/ep01.mp3 +0 -0
- package/ep01.script.txt +71 -0
- package/ep02.md +141 -0
- package/ep02.script.txt +70 -0
- package/ep03.md +163 -0
- package/ep03.script.txt +61 -0
- package/ep04.md +192 -0
- package/ep04.mp3 +0 -0
- package/ep04.script.txt +69 -0
- package/fetch_context.py +123 -0
- package/generate_audio.py +120 -0
- package/package.json +12 -12
- package/publish_episode.py +367 -0
- package/setup.sh +23 -0
package/STYLE.md
ADDED
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
# Soft Commodity Trading — show bible
|
|
2
|
+
|
|
3
|
+
Read this before writing any episode. It defines what the show is and how it
|
|
4
|
+
sounds. The daily prompt tells you *which* episode to make; this file tells you
|
|
5
|
+
*how* to make it.
|
|
6
|
+
|
|
7
|
+
## The one rule about output
|
|
8
|
+
|
|
9
|
+
**Write `epNN.md`. Do not hand-write the page or the e-mail.**
|
|
10
|
+
|
|
11
|
+
`build_page.py` and `build_email.py` both render that one file. The e-mail used
|
|
12
|
+
to be improvised each morning against a section spec, and it drifted — so the
|
|
13
|
+
spec now lives in code:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
python3 package/build_email.py --notes epNN.md --number N --title "..." \
|
|
17
|
+
--dek "..." --audio-url URL --page-url URL --duration 739 --date "..." \
|
|
18
|
+
--charts URL1,URL2,URL3 --glossary glossary_final.md \
|
|
19
|
+
--drill-index 5 --drill-file conversions.md --out epNN_email.html
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
It emits the eight sections in their fixed order and the plain-text
|
|
23
|
+
alternative beside them. The conversion drill is pulled from `conversions.md`
|
|
24
|
+
by index, so it no longer has to be retyped; what still has to be *written* is
|
|
25
|
+
the one fresh exercise for the drill (put it in the quiz area and its answer
|
|
26
|
+
with the solutions), because the point is different numbers every cycle.
|
|
27
|
+
|
|
28
|
+
Everything below is about the substance that goes into `epNN.md`. Getting that
|
|
29
|
+
right is the whole job; the presentation is already handled.
|
|
30
|
+
|
|
31
|
+
## What the show is
|
|
32
|
+
|
|
33
|
+
A daily ~10-minute briefing on the physical commodity trading business, for
|
|
34
|
+
anyone learning how it actually works: aspiring traders, analysts, students,
|
|
35
|
+
people newly on a desk. It is a **public show**, freely shared.
|
|
36
|
+
|
|
37
|
+
Assume the listener is a strong quantitative graduate who has studied
|
|
38
|
+
derivatives — futures, options, hedging are known ground. Do not re-teach
|
|
39
|
+
pricing theory. Teach at **desk level**: how traders talk, what they watch, what
|
|
40
|
+
they actually do with these instruments between 7am and 6pm.
|
|
41
|
+
|
|
42
|
+
## Density — the rule that matters most
|
|
43
|
+
|
|
44
|
+
The listener understands a clean explanation in three minutes. An episode that
|
|
45
|
+
spends ten minutes on one such concept is padding, and padding is the fastest
|
|
46
|
+
way to lose them.
|
|
47
|
+
|
|
48
|
+
- Every episode carries **two substantive concepts**, or **one concept taken to
|
|
49
|
+
real depth** — mechanics, edge cases, failure modes, second-order effects.
|
|
50
|
+
Never one idea stretched across ten minutes.
|
|
51
|
+
- State the concept cleanly, work one concrete numerical example, then **go
|
|
52
|
+
somewhere they could not have gone alone**: what breaks, what the desk argues
|
|
53
|
+
about, why the obvious move is wrong.
|
|
54
|
+
- Say each thing **once**. No "as we said earlier", no restating the definition
|
|
55
|
+
in three different ways, no summary that repeats the body verbatim. The
|
|
56
|
+
takeaway names what to remember — it does not re-explain it.
|
|
57
|
+
- Cut every sentence that only announces what you are about to say.
|
|
58
|
+
- If you finish the brief with time left, do not stretch — add depth: a second
|
|
59
|
+
worked example with different numbers, a failure case, a subtlety
|
|
60
|
+
practitioners get wrong.
|
|
61
|
+
|
|
62
|
+
Test before writing: *what does this episode teach that an intelligent person
|
|
63
|
+
could not have worked out from the definition alone?* If the answer is thin,
|
|
64
|
+
the episode is too thin.
|
|
65
|
+
|
|
66
|
+
## Framing rules — non-negotiable
|
|
67
|
+
|
|
68
|
+
- Never address a specific individual. No names. No references to a listener's
|
|
69
|
+
employer, job, internship, start date, or plans. Nothing like "your new
|
|
70
|
+
employer", "when you start in September", "on your first day".
|
|
71
|
+
- "You" is allowed **only** in the generic teaching sense: "say you're long
|
|
72
|
+
fifty thousand tons", "you're hedged — so what's left?".
|
|
73
|
+
- Trading houses (ADM, Bunge, Cargill, Louis Dreyfus, COFCO, Olam, Viterra,
|
|
74
|
+
Glencore) appear as concrete examples and in history segments. Keep it light
|
|
75
|
+
and factual, never promotional, and **rotate** which one you use so no single
|
|
76
|
+
firm dominates the show.
|
|
77
|
+
- Everything published — audio, written edition, quiz, solutions, notes file —
|
|
78
|
+
must stand alone as a show anybody could learn from.
|
|
79
|
+
|
|
80
|
+
## How it sounds
|
|
81
|
+
|
|
82
|
+
Written for the ear, not the page.
|
|
83
|
+
|
|
84
|
+
- Most sentences under 15 words. One idea per sentence.
|
|
85
|
+
- Oral beats and deliberate fragments: "Space. Time. Form."
|
|
86
|
+
- Direct address in the generic sense. Rhetorical questions to open a section.
|
|
87
|
+
- Repeat key terms on purpose — the listener cannot scroll back.
|
|
88
|
+
- Always at least one **worked number**: a margin, a spread, a cargo P&L.
|
|
89
|
+
Abstractions do not survive audio.
|
|
90
|
+
- Signposting: "Three things move basis. Here's the first."
|
|
91
|
+
- Never read a list aloud as a list. Turn it into a sequence with beats.
|
|
92
|
+
|
|
93
|
+
Avoid: corporate filler, throat-clearing intros ("In today's episode we will
|
|
94
|
+
explore..."), stacked subordinate clauses, and any sentence you could not say
|
|
95
|
+
out loud in one breath.
|
|
96
|
+
|
|
97
|
+
## Structure of every episode
|
|
98
|
+
|
|
99
|
+
1. **Cold open** (2–3 segments): a hook — a surprising claim, a question, a
|
|
100
|
+
number. Name the show, the episode number and the topic inside it, not
|
|
101
|
+
before it. The spoken identifier is exactly: *"This is Soft Commodity
|
|
102
|
+
Trading, episode N."* Never any other name — the show was previously called
|
|
103
|
+
*Commodity Desk Daily* and that name must not appear anywhere any more.
|
|
104
|
+
2. **Market pulse** (150–250 words): today's real moves, researched live.
|
|
105
|
+
Concrete figures only if sourced today. Never invent a price. **It must
|
|
106
|
+
build, not repeat** — see below.
|
|
107
|
+
3. **The lesson** (the bulk): story-driven, desk-level, one worked example
|
|
108
|
+
carried through. Callbacks to earlier episodes only when they were genuinely
|
|
109
|
+
covered — check the context files.
|
|
110
|
+
4. **Takeaway** (3–4 segments): what to actually remember, in plain terms.
|
|
111
|
+
5. **Trail** (1–2 segments): tomorrow's topic, and a pointer to the quiz.
|
|
112
|
+
|
|
113
|
+
## Teaching the language of the desk
|
|
114
|
+
|
|
115
|
+
Concepts can be read anywhere. How a desk actually *talks* cannot — this is one
|
|
116
|
+
of the show's most valuable products. Treat units, conventions and market
|
|
117
|
+
speech as first-class content, not decoration.
|
|
118
|
+
|
|
119
|
+
### The unit moment (15–20 seconds, every time a unit or convention first appears)
|
|
120
|
+
|
|
121
|
+
Three beats, then move on:
|
|
122
|
+
|
|
123
|
+
1. **What it measures** — "a bushel is a volume measure, not a weight."
|
|
124
|
+
2. **The number that matters** — "sixty pounds for soybeans and wheat,
|
|
125
|
+
fifty-six for corn, so the tonne conversion differs by commodity. A Chicago
|
|
126
|
+
contract is five thousand bushels, quoted in cents per bushel."
|
|
127
|
+
3. **One sentence of why** — "it comes from the English grain trade, where
|
|
128
|
+
grain was measured by volume before it was weighed; the U S kept it, the rest
|
|
129
|
+
of the world moved to dollars per tonne — which is why a trader converts
|
|
130
|
+
between the two all day."
|
|
131
|
+
|
|
132
|
+
Do this for: bushels, cents/bushel, lots and contract sizes, dollars per tonne,
|
|
133
|
+
cwt, metric vs short tons, points and ticks, differentials ("plus eighty"),
|
|
134
|
+
laycan, and any quoting convention the episode uses. Never let a unit go by
|
|
135
|
+
unexplained the first time — and never explain it twice.
|
|
136
|
+
|
|
137
|
+
### Desk dialogue
|
|
138
|
+
|
|
139
|
+
When a quoting convention or a piece of market language has just been
|
|
140
|
+
introduced, and the topic is one where the language genuinely matters (basis,
|
|
141
|
+
differentials, spreads, tenders, market color, chartering), stage a short
|
|
142
|
+
exchange — 20–30 seconds, four to six lines — then spend ten seconds unpacking
|
|
143
|
+
what just happened.
|
|
144
|
+
|
|
145
|
+
Write dialogue lines with an uppercase speaker label; the audio pipeline renders
|
|
146
|
+
them with two distinct voices, separate from the narrator:
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
Here is how that trade actually gets quoted. ||| 0.5
|
|
150
|
+
BUYER: November Santos, what have you got? ||| 0.25
|
|
151
|
+
SELLER: I make you plus eighty-five. ||| 0.25
|
|
152
|
+
BUYER: That's rich. Last one I saw trade was plus seventy-eight. ||| 0.25
|
|
153
|
+
SELLER: On prompt, yes. You're asking me for November. ||| 0.6
|
|
154
|
+
Notice what just happened. Neither of them said a price. ||| 0.4
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
Use at most two speakers per exchange, and keep labels short and consistent
|
|
158
|
+
(BUYER / SELLER, TRADER / BROKER, DESK / EXECUTION). Make the exchange
|
|
159
|
+
*realistic*: clipped, elliptical, no full sentences, no politeness rituals. The
|
|
160
|
+
value is that it sounds like an actual squawk, not a textbook illustration.
|
|
161
|
+
|
|
162
|
+
No quota: if the day's topic is risk limits or trade finance and a dialogue
|
|
163
|
+
would be forced, skip it. Better none than a fake one.
|
|
164
|
+
|
|
165
|
+
### Ramp-up (episodes 1 to 4 only)
|
|
166
|
+
|
|
167
|
+
Early listeners have no vocabulary yet. In the first four episodes, briefly
|
|
168
|
+
re-anchor terms introduced in previous episodes when they reappear — half a
|
|
169
|
+
sentence, in passing ("the differential, the plus-or-minus against futures").
|
|
170
|
+
From episode 5 onward, assume the vocabulary is owned and stop re-explaining.
|
|
171
|
+
|
|
172
|
+
The audio never dumbs down: the listener should be slightly stretched. The
|
|
173
|
+
written glossary carries the safety net.
|
|
174
|
+
|
|
175
|
+
### The glossary
|
|
176
|
+
|
|
177
|
+
Every episode passes its new terms at publish time via `--glossary`, formatted
|
|
178
|
+
`term = definition; term2 = definition2`. Definitions must not contain
|
|
179
|
+
semicolons. The toolkit keeps a cumulative, deduplicated `glossary.md` (first
|
|
180
|
+
definition wins, tagged with the episode that introduced it). Both the e-mail
|
|
181
|
+
and the episode page carry it — collapsed and filterable on the page, in full
|
|
182
|
+
at the foot of the e-mail — so nothing heard in the audio is unrecoverable, and
|
|
183
|
+
the term the reader half-remembers is one search box away on any episode.
|
|
184
|
+
|
|
185
|
+
This makes the glossary line at publish time load-bearing rather than
|
|
186
|
+
housekeeping. Pass every term the episode introduced, and write the definition
|
|
187
|
+
so it stands alone months later, out of context.
|
|
188
|
+
|
|
189
|
+
## The market pulse: how to write it
|
|
190
|
+
|
|
191
|
+
The pulse is a **briefing for a reader**, not notes about the show. Two failures
|
|
192
|
+
to avoid absolutely.
|
|
193
|
+
|
|
194
|
+
**Never write about the episode.** No "today we go one level deeper than
|
|
195
|
+
yesterday", no "as we'll see later". The listener does not care how the show is
|
|
196
|
+
constructed. Say what the market did.
|
|
197
|
+
|
|
198
|
+
**Never chain a mechanism through punctuation.** This is unreadable:
|
|
199
|
+
|
|
200
|
+
> *yield × harvested acres → production; + carry-in → supply; − feed, exports,
|
|
201
|
+
> ethanol and food → ending stocks; ÷ total use → stocks-to-use*
|
|
202
|
+
|
|
203
|
+
If a mechanism has steps, either walk it in real sentences (fine in audio,
|
|
204
|
+
where it unfolds slowly) or lay it out as a short list or table (in the written
|
|
205
|
+
edition). Never as a run-on of semicolons and arrows.
|
|
206
|
+
|
|
207
|
+
### The written pulse
|
|
208
|
+
|
|
209
|
+
- Open with the single thing that matters today, in a short bold line.
|
|
210
|
+
- Give levels in a small **table** — commodity, contract month, price — rather
|
|
211
|
+
than burying three numbers in a sentence.
|
|
212
|
+
- **Head the move column `Change`.** The renderer colours that column — a
|
|
213
|
+
restrained green up, red down — and prints the sign explicitly, so `0.6` in a
|
|
214
|
+
change column becomes `+0.6`. Write the moves the way you would say them
|
|
215
|
+
(`−0.6%`, `+21½¢`, `~unchanged`); the sign and the hue are added for you.
|
|
216
|
+
Numeric columns are detected and right-aligned on their own.
|
|
217
|
+
- Then 60–120 words of plain prose: what moved, why, and what to watch.
|
|
218
|
+
- Include the geopolitical read (see below) — acute if there is news, structural
|
|
219
|
+
otherwise.
|
|
220
|
+
- One idea per sentence. Any term not already in `glossary.md` gets three words
|
|
221
|
+
of explanation, or is not used.
|
|
222
|
+
- Prefer the concrete over the technical: "a full vessel queue at Santos" beats
|
|
223
|
+
"elevated origin basis pressure".
|
|
224
|
+
|
|
225
|
+
### The geopolitical read — every day, without exception
|
|
226
|
+
|
|
227
|
+
Agricultural markets are moved as much by governments and conflict as by
|
|
228
|
+
weather. The pulse must carry a geopolitical dimension **every episode**, not
|
|
229
|
+
only when something explodes.
|
|
230
|
+
|
|
231
|
+
Two modes:
|
|
232
|
+
|
|
233
|
+
- **Acute** — something happened: strikes on port or energy infrastructure, a
|
|
234
|
+
new sanction or its enforcement, an export ban or tax, a tender cancelled, a
|
|
235
|
+
shipping lane rerouted, an insurance market repricing war risk. Cover it, and
|
|
236
|
+
above all give the **transmission mechanism to price**.
|
|
237
|
+
- **Structural** — on quiet days, take one background theme and explain a piece
|
|
238
|
+
of it. These are slow forces that set the map everyone trades on.
|
|
239
|
+
|
|
240
|
+
**Always name the mechanism.** "War, so prices up" is not analysis. The chains
|
|
241
|
+
that actually matter:
|
|
242
|
+
|
|
243
|
+
- **Export capacity** — damaged loading infrastructure, mined or blocked
|
|
244
|
+
waters, closed corridors: supply exists but cannot leave.
|
|
245
|
+
- **Freight and insurance** — war-risk premium on hulls, longer routings,
|
|
246
|
+
bunker cost. This lands on the arb before it lands on the flat price.
|
|
247
|
+
- **Flow substitution** — buyers switch origin, which widens the basis at the
|
|
248
|
+
new origin and collapses it at the old one. Often the biggest P&L effect.
|
|
249
|
+
- **Policy retaliation** — tariffs, quotas, licence regimes, retaliatory
|
|
250
|
+
buying bans that redirect entire trade axes.
|
|
251
|
+
- **Inputs** — sanctions or gas prices hitting fertiliser, which shows up two
|
|
252
|
+
seasons later in planted acres and yields.
|
|
253
|
+
- **Currency and payment** — devaluation changing farmer selling behaviour,
|
|
254
|
+
payment channels and settlement currency shifting who can transact.
|
|
255
|
+
|
|
256
|
+
Standing structural themes to rotate through on quiet days: the Black Sea's
|
|
257
|
+
permanent reshaping of wheat flows and the corridor economics that followed;
|
|
258
|
+
Red Sea routing and its cost on Asia-Europe freight; the China–Brazil soybean
|
|
259
|
+
axis and what it did to US export share; India's on-again-off-again rice and
|
|
260
|
+
sugar export policy; fertiliser supply and the gas price; state reserve
|
|
261
|
+
building as a form of insurance; sanctions regimes and the shipping and
|
|
262
|
+
insurance workarounds that grow around them.
|
|
263
|
+
|
|
264
|
+
**Tone: analytic, never partisan.** Describe flows, capacity, costs and policy
|
|
265
|
+
as market facts and explain how they reach a price. Do not take sides in a
|
|
266
|
+
conflict, do not speculate about military outcomes, do not editorialise about
|
|
267
|
+
who is right. If a fact is contested, say that it is contested and give the
|
|
268
|
+
market's reaction rather than adjudicating it. Never invent an event: if the
|
|
269
|
+
research turned up nothing acute today, use a structural theme instead.
|
|
270
|
+
|
|
271
|
+
Keep it to 40–80 words inside the pulse. Episode 26 treats the Black Sea and
|
|
272
|
+
policy shocks in depth — the daily read is a briefing, not that lesson.
|
|
273
|
+
|
|
274
|
+
### Connect the pulse to the lesson
|
|
275
|
+
|
|
276
|
+
The pulse and the lesson must not be two strangers stapled together.
|
|
277
|
+
|
|
278
|
+
- **When a real link exists, use it as the bridge into the lesson.** A WASDE day
|
|
279
|
+
leads naturally into balance sheets; a freight spike leads into the arb; a
|
|
280
|
+
Brazilian frost leads into volatility. Say the link in one sentence and move
|
|
281
|
+
on — do not force it into a theme.
|
|
282
|
+
- **When there is no honest link, do not invent one.** Close the pulse cleanly
|
|
283
|
+
("that's the tape — now to today's subject") and start the lesson.
|
|
284
|
+
- Best of all: pick the *example* in the lesson from what is live in the market
|
|
285
|
+
that morning. If wheat is the mover, use wheat numbers in the worked example.
|
|
286
|
+
The lesson stays on curriculum; only its illustration follows the news.
|
|
287
|
+
|
|
288
|
+
## The market pulse must escalate, never repeat
|
|
289
|
+
|
|
290
|
+
`covered.md` records the pulse topics of previous episodes. Read it first.
|
|
291
|
+
|
|
292
|
+
Recurring events — a WASDE, a crop tour, a policy deadline, an ongoing weather
|
|
293
|
+
story — are worth several mentions across days, but **each mention must go
|
|
294
|
+
deeper than the last**. Prices are refreshed daily and that is fine; the
|
|
295
|
+
*commentary* is what must not loop.
|
|
296
|
+
|
|
297
|
+
Worked example, a week with WASDE on Wednesday:
|
|
298
|
+
|
|
299
|
+
- **Monday** — name it: there is a WASDE on Wednesday, this is what the report
|
|
300
|
+
is and roughly why the market cares. One or two sentences.
|
|
301
|
+
- **Tuesday** — assume it is known, and go into the mechanics: what the trade
|
|
302
|
+
expects for yield, where the range of estimates sits, why positioning ahead of
|
|
303
|
+
it looks the way it does.
|
|
304
|
+
- **Wednesday** — the print itself: the surprise versus expectation, and the
|
|
305
|
+
reaction.
|
|
306
|
+
- **Thursday** — the aftermath: what the number did to the balance sheet, what
|
|
307
|
+
it means for basis and spreads over the coming weeks.
|
|
308
|
+
|
|
309
|
+
If a topic genuinely has nothing new, drop it and cover something else — a
|
|
310
|
+
different commodity, a different exchange, a flow story. Repeating yesterday's
|
|
311
|
+
sentence with today's price is the one thing the pulse must never do.
|
|
312
|
+
|
|
313
|
+
Record what you covered: the `--covered` line you pass at publish time must end
|
|
314
|
+
with `Pulse: <topics touched, one clause each>` so tomorrow's episode can build
|
|
315
|
+
on it.
|
|
316
|
+
|
|
317
|
+
## The spoken script format
|
|
318
|
+
|
|
319
|
+
One segment per line: `TEXT ||| PAUSE`, pause in seconds *after* the segment.
|
|
320
|
+
|
|
321
|
+
- `0.3` — mid-thought, sentences that flow together
|
|
322
|
+
- `0.5` — after a completed idea
|
|
323
|
+
- `0.7`–`0.8` — after a punchline, or at a section break
|
|
324
|
+
|
|
325
|
+
Segments are 1–3 short sentences. Total 1400–1600 words of speech ≈ 10 minutes.
|
|
326
|
+
|
|
327
|
+
TTS constraints: no markdown symbols, no bullet characters. Spell out acronyms
|
|
328
|
+
that are read letter by letter — `U S D A`, `C M E`, `F O B`. Write prices in
|
|
329
|
+
words: "four dollars sixty four", "futures minus twenty".
|
|
330
|
+
|
|
331
|
+
## The written edition
|
|
332
|
+
|
|
333
|
+
A genuine article, not a transcript. Flowing paragraphs, normal punctuation and
|
|
334
|
+
spellings (USDA, CME, $4.64), markdown subheadings, a cleanly laid-out worked
|
|
335
|
+
example. Same substance and order as the audio, recomposed for the eye. Someone
|
|
336
|
+
who cannot listen should get the full lesson from it.
|
|
337
|
+
|
|
338
|
+
Readability rules, since the page and the email are read rather than heard:
|
|
339
|
+
|
|
340
|
+
- **No semicolon chains and no arrow soup.** Anything with more than two steps
|
|
341
|
+
becomes a list or a table.
|
|
342
|
+
- **Put numbers in tables**, not in the middle of sentences. A four-line P&L
|
|
343
|
+
table is read in two seconds; the same figures in prose are read twice and
|
|
344
|
+
still not retained.
|
|
345
|
+
- **One idea per sentence**, and no sentence longer than about 25 words.
|
|
346
|
+
- **Never describe the show itself** — no "as we said yesterday", no "this
|
|
347
|
+
episode covers". Write the substance directly.
|
|
348
|
+
- Bold the term being defined, not whole clauses. If everything is bold,
|
|
349
|
+
nothing is.
|
|
350
|
+
|
|
351
|
+
## Charts — two or three in every episode
|
|
352
|
+
|
|
353
|
+
A number is a point. A chart is a shape, and the shape is what the listener
|
|
354
|
+
actually needs: a trend, a spread, a decomposition, a before-and-after. Every
|
|
355
|
+
episode carries **two to three charts**, and they are not decoration.
|
|
356
|
+
|
|
357
|
+
Where they go: **one in the market pulse**, always, whenever there are figures
|
|
358
|
+
worth a shape. **One or two in the lesson**, illustrating the mechanism being
|
|
359
|
+
taught. A chart that only repeats a sentence should be cut.
|
|
360
|
+
|
|
361
|
+
Write them as fenced `chart` blocks inside `epNN.md`. `build_page.py` turns each
|
|
362
|
+
one into an inline SVG on the page and, with `--charts-prefix`, into a PNG for
|
|
363
|
+
the e-mail. Three shapes cover almost everything:
|
|
364
|
+
|
|
365
|
+
| Type | Use it for |
|
|
366
|
+
|---|---|
|
|
367
|
+
| `line` | anything through time, and the forward curve (contract months on the x axis) |
|
|
368
|
+
| `bar` | like-for-like comparison: costs, origins, before and after |
|
|
369
|
+
| `waterfall` | any economics decomposition: the arb, the crush, the carry, a P&L bridge |
|
|
370
|
+
|
|
371
|
+
Set `"mode": "index"` on a line chart to rebase every series to 100 at the first
|
|
372
|
+
point. Use it whenever two markets trade at different levels, otherwise the
|
|
373
|
+
cheaper one flatlines at the bottom and the chart says nothing.
|
|
374
|
+
|
|
375
|
+
Rules:
|
|
376
|
+
|
|
377
|
+
- **Never invent a number.** Every point comes from something researched today,
|
|
378
|
+
or from the worked example the episode is teaching. If the series is not
|
|
379
|
+
sourced, there is no chart.
|
|
380
|
+
- **Always give `unit`, `source` and a `caption`.** The caption states the
|
|
381
|
+
takeaway, not the contents: "Corn led the fall, and the spread went with it",
|
|
382
|
+
never "Corn and wheat prices over time".
|
|
383
|
+
- **Keep `title` to about six words.** It sets in large type on both outputs.
|
|
384
|
+
Captions and sources wrap onto as many lines as they need, so they can be
|
|
385
|
+
full sentences — the caption is doing the teaching, and in an e-mail with
|
|
386
|
+
images turned off it is the only thing the reader gets.
|
|
387
|
+
- **Keep x-axis labels short.** They share the width between them: eight date
|
|
388
|
+
labels are fine, three long phrases are the practical limit on a bar chart.
|
|
389
|
+
- Use `null` for a missing print. It draws a gap, which is honest. A zero is a
|
|
390
|
+
lie.
|
|
391
|
+
- Two or three series at most. Beyond that it is a table.
|
|
392
|
+
- **The audio must never depend on a chart.** No "as you can see", no "look at
|
|
393
|
+
the chart". The spoken version says the number and its meaning out loud, and
|
|
394
|
+
may point at the e-mail once, at most.
|
|
395
|
+
|
|
396
|
+
Example, the arb decomposed:
|
|
397
|
+
|
|
398
|
+
```chart
|
|
399
|
+
{"type":"waterfall","unit":"c/bu","title":"Santos to Shandong, one Panamax",
|
|
400
|
+
"caption":"A dollar of flat price nets to zero. Ten cents of basis is a third of the trade.",
|
|
401
|
+
"source":"Worked example, episode 2",
|
|
402
|
+
"steps":[{"label":"Gross spread","value":100,"kind":"base"},
|
|
403
|
+
{"label":"Freight","value":-60},
|
|
404
|
+
{"label":"Finance, insurance, port","value":-10},
|
|
405
|
+
{"label":"Margin","kind":"total"}]}
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
## The quiz
|
|
409
|
+
|
|
410
|
+
Three blocks: today (J-0), the previous episode (J-1), three episodes back
|
|
411
|
+
(J-3) — 2–3 questions each, skipping blocks whose episode number is below 1.
|
|
412
|
+
|
|
413
|
+
Base J-1 and J-3 questions on what those episodes **actually said** — their
|
|
414
|
+
notes are fetched into the working directory. Never quiz on material the show
|
|
415
|
+
has not covered.
|
|
416
|
+
|
|
417
|
+
Questions must require application and reasoning. Good: "You're long 60,000 t
|
|
418
|
+
of physical beans hedged with futures. Freight rallies twenty dollars before
|
|
419
|
+
you fix the vessel. Where does that show up in your P&L, and was your hedge
|
|
420
|
+
wrong?" Bad: "What does FOB stand for?"
|
|
421
|
+
|
|
422
|
+
Write full model solutions: the reasoning, the numbers, and the trap the
|
|
423
|
+
question was testing.
|
|
424
|
+
|
|
425
|
+
**Number them `**Q1.**` and `**A1.**`, one paragraph opener each.** The page
|
|
426
|
+
turns every answer into its own reveal, matched to its question by that number,
|
|
427
|
+
so a reader can check Q1 without seeing Q2. Answers that are not numbered, or
|
|
428
|
+
numbered differently from their questions, fall back to a single lump.
|
|
429
|
+
|
|
430
|
+
## Continuity
|
|
431
|
+
|
|
432
|
+
Before writing, read the context files fetched into the working directory:
|
|
433
|
+
|
|
434
|
+
- `covered.md` — a running log of every episode aired and what it covered.
|
|
435
|
+
Use it to avoid repeating material and to make callbacks that are real.
|
|
436
|
+
- `prev_epNN.md` — the notes for J-1 and J-3, for the quiz.
|
|
437
|
+
|
|
438
|
+
If a concept was already explained in depth, reference it in one line and move
|
|
439
|
+
on. The show should feel like it is building, not resetting every morning.
|
|
Binary file
|
|
Binary file
|