vW6 CP3405 · Design Thinking III
TR3 2026
Starts Monday 12 Oct — engine passes its self-test Wednesday 14 Oct 12:00 — prediction locks Wednesday 14 Oct 23:59 SGT — everything else due Saturday 17 Oct 23:59 SGT — presented Monday 19 Oct

Sprint 6 — vW6 — Gold, Three Timeframes

This sprint you build something real: your own version of Investing.com's gold technical page. Your code reads gold prices, runs the same moving averages and indicators that page shows, and rates gold on the hourly, daily and weekly charts. On Monday, Prof Tan will open Investing.com on his phone while you show your dashboard, and compare the two line by line. Your numbers should match, and where they don't, you should be able to say why.

The Sprint Goal

By Wednesday noon, your gold engine passes its self-test. By Wednesday night, lock your four weekly calls, with your engine's gold call beside the team's. By Saturday night, replay your engine over recent weeks to see how often it would have been right, and measure your Sprint 5 miss.

What Changed From Sprint 5, and Why

ChangeWhy
New: a gold technical engine, built by R3 and R6, with a starter file and a self-testA weekly call gives you one scored result per market. An engine rates gold on three timeframes and can be checked against a professional tool, live.
Gold is now a closing price, not a directionA direction is only right or wrong. A price shows how far off you were, the same as your other three calls.
Your engine's gold call sits beside your team'sYour judgment should add something the engine can't. Now you can see whether it does.
New: a replay of your engine over recent bars, owned by R4It gives you dozens of scored predictions this week instead of waiting months for enough weekly results.
Levels are numbers. spx_close, ndx_close, gold_close and tnx_close must be numbersA Nasdaq-100 call was filed as "UP". A word can't be scored against a closing level.
Dashboards are never hosted. No GitHub Pages, no Netlify, no deployment workflowsDashboards were put on public hosting, which exposes your calls to anyone with the link. Your dashboard is opened from your repo.
Every team member posts their own Wednesday check-in in Discord, and R1 compiles themIn some teams most members never posted all week.
A FigJam card with only a title is not a cardSome boards had title-only cards, and one board hadn't moved since Sprint 3.
A late call stays late. It's recorded and labelled, never counted as lockedCalls were committed after the lock and marked as drafts.

New: Your Gold Technical Engine

Open the Investing.com page above. For each timeframe it shows one rating, from Strong Sell to Strong Buy, worked out from a table of moving averages and a table of indicators, each voting Buy or Sell. It also shows pivot points. You will build the same thing for gold futures, December 2026 (Yahoo symbol GCZ26.CMX), on three timeframes: hourly, daily and weekly. Those are tabs on the Investing.com page too.

Start from the starter kit: sprint6-starter.zip. Put its contents in an engine/ folder in your repo. The download and file handling are written for you. You write the 14 functions marked TODO: the maths and the voting rules, each explained in the file. Then run python engine/test_engine.py. It checks your numbers and votes against the course reference engine on frozen gold data, and tells you exactly which line is wrong. Commit its output to checks/engine-test.txt.

The 12 moving-average votes

For each length n = 5, 10, 20, 50, 100 and 200 bars, a simple moving average (SMA, the plain average of the last n closes) and an exponential moving average (EMA, which gives recent closes more weight). Each votes Buy if the latest close is above it and Sell if below. These are the same 12 rows as Investing.com's Moving Averages table.

The 6 indicator votes

IndicatorWhat it measuresBuySellNeutral
RSI(14)Size of up-moves against down-moves over 14 bars, 0 to 100above 50below 50above 70 or below 30
STOCH(9,6)Where the close sits in its 9-bar range%K above %D, and %K below 80%K below %D, and %K above 20otherwise
MACD(12,26,9)Short-term trend against longer-term trendMACD line above signal linebelowequal
CCI(14)Distance of the typical price from its 14-bar averageabove 0below 0above +200 or below −200
Williams %R(14)Where the close sits in its 14-bar range, −100 to 0above −50below −50above −20 or below −80
ROC(12)Percentage change from 12 bars agoabove 0below 0exactly 0

All six appear on Investing.com's Technical Indicators table, so every row you show can be compared. The exact formula for each is in the starter file.

Votes, rating, prediction and pivots

Score: S = (B − D) ÷ 18
where B is the number of Buy votes, D the number of Sell votes, and 18 the total. S runs from −1 (all Sell) to +1 (all Buy).

Rating: S of 0.5 or more is Strong Buy · 0.1 up to 0.5 is Buy · between −0.1 and 0.1 is Neutral · −0.5 up to −0.1 is Sell · −0.5 or less is Strong Sell.

Predicted next close: P = C + 0.1 × S × ATR
where C is the latest close, S the score, and ATR (average true range) the typical size of one bar's move over the last 14 bars. A Strong Buy predicts a small rise, Neutral predicts no change. The 0.1 was set by testing: a larger step overshoots.

Pivot points: P = (H + L + C) ÷ 3 · R1 = 2P − L · S1 = 2P − H
where H, L and C are the high, low and close of the last completed bar on that timeframe. P is the pivot, R1 the first resistance above it and S1 the first support below it.

Comparing with Investing.com

Your engine writes signals/latest.json, with the time of the bar it used in UTC (the same as GMT, which Investing.com uses). Compare at the same bar time and on the same timeframe tab. Your moving averages should agree with Investing.com's to within about 0.2%. Indicators can differ a little more, because Investing.com's price feed can differ from Yahoo's by a few dollars and fast indicators react to that. The summary rating may differ, because Investing.com counts more indicators than these six. Be ready to explain any difference, row by row.

The Weekly Calls

Deadline: Wednesday 14 Oct, 23:59 Singapore time. Same four markets, same owners, read the same way as in Sprint 5, with one change: gold is now the closing price of GCZ26.CMX on Friday 16 Oct, in US dollars per ounce, from the Close column of Yahoo's daily Historical Data, not Adj Close and not the spot price. Every reason names a catalyst from catalysts/vW6.json.

In predictions/vW6.json, gold_direction becomes gold_close, and a new line holds your engine's weekly-chart gold prediction at the moment you lock:

"team_call":   { "spx_close": 0.00, "ndx_close": 0.00, "gold_close": 0.00, "tnx_close": 0.00 },
"engine_call": { "gold_close": 0.00 },

If your team's gold call differs from the engine's, the gold reason says why.

New: The Replay (R4)

Run your engine as if it were running at each of the last 35 hourly bars, the last 20 daily bars and the last 10 weekly bars, using only the bars up to that point. Compare each prediction with the close that actually came next. Save every row in replay/vW6.csv (bar time, timeframe, close, score, rating, predicted, actual, miss, no-change miss) and a summary for each timeframe in replay/vW6.json.

Miss = |P − A| ÷ A × 100
where P is the predicted close, A the actual close, and |…| the size of the miss, whether above or below.

"No change" miss: the same formula with P = C, the last close. This is the simplest possible forecast. Report both: an engine that can't beat "no change" isn't adding anything, and you should say so.

Direction right: the share of Buy and Strong Buy ratings followed by a higher close, plus Sell and Strong Sell ratings followed by a lower close, out of all non-Neutral ratings.

Delta and Prescription: Your Sprint 5 Call

Measure your Sprint 5 call against the Friday 9 Oct closes in actuals/vW5.json, for all four markets. The yield is scored in basis points (one basis point is 0.01 percentage points). Your Sprint 5 gold call was a direction, so its delta is right or wrong. If your Sprint 5 call was committed after the lock, measure it and label it late. If you had none, say so. The prescription is one specific change for next sprint.

Where Every File Goes

your-team-repo/
├── engine/
│   ├── tech_summary.py          R3 + R6 · self-test passing Wed 12:00
│   ├── test_engine.py           from the starter kit, unchanged
│   └── starter/                 from the starter kit, unchanged
├── checks/engine-test.txt       R3 · Wed 12:00
├── signals/latest.json          engine · each time you run it
├── catalysts/vW6.json           R2 · Tue 23:59
├── checkin/wednesday.md         R1 · Wed 12:00
├── data/
│   ├── roles.json               R1 · Tue 23:59
│   ├── github_activity.json     R6 · Tue 23:59, then daily
│   └── figjam_status.json       R1 · Tue 23:59, then daily
├── predictions/vW6.json         R1 · Wed 23:59
├── llm-synthesis/vW6.json       R6 · Wed 23:59
├── human-score/vW6.json         R5 · Wed 23:59
├── replay/vW6.csv               R4 · Sat 23:59
├── replay/vW6.json              R4 · Sat 23:59
├── actuals/vW6.json             R4 · Sat 23:59
├── delta/vW6.json               R4 · Sat 23:59
├── prescriptions/vW6.json       R4 + R1 · Sat 23:59
├── instruments.json             R3 + R6 · keep current
├── ui/index.html                R5 · Tue 23:59, then daily
└── evidence/                    supporting material only

A file anywhere else counts as missing. Fix any Sprint 5 file with the wrong path or name by Tuesday night.

The Backlog — All Six Roles

R1Product Owner & Scrum Master: lock the calls, keep the board real

File predictions/vW6.json with the team's four calls and the engine's gold call, and set r1_confirms to true. By Wednesday 12:00, compile checkin/wednesday.md from every team member's own Discord check-in, with a link to each post. Anyone who hasn't posted by noon is raised in Discord and with Prof Tan the same day. Keep your team's Sprint 6 section of the shared FigJam board current. With R4, write the prescription.

DONE MEANS — a confirmed entry with all four team calls and the engine's gold call by Wednesday 23:59, a check-in linking every member's Discord post by 12:00, and every Done card linked to its file on main.
R2Almanac & Macro: catalysts and the S&P 500 call

Build catalysts/vW6.json by Tuesday 23:59, as in Sprint 5. You own the S&P 500 weekly call.

DONE MEANS — a catalyst calendar of real releases with sources, and an S&P 500 call that names a catalyst.
R3Technical: engine part 1, and the Nasdaq-100 call

In the starter file, write sma, ema, ma_votes, score_and_rating, predict and pivots. Get the whole self-test passing with R6 by Wednesday 12:00 and commit its output. Be ready to explain any moving-average vote. You own the Nasdaq-100 weekly call.

DONE MEANS — your functions written, the self-test showing ALL CHECKS PASSED in checks/engine-test.txt, and a Nasdaq-100 call that names a catalyst.
R4Data & Calibration: the gold call, the replay, the Sprint 5 miss

You own the gold weekly call, as a price. Write the replay and commit replay/vW6.csv and replay/vW6.json. Record the Friday 16 Oct closes for all four markets, with sources, in actuals/vW6.json. Produce delta/vW6.json for your Sprint 5 call, and with R1 write prescriptions/vW6.json.

DONE MEANS — a gold price call that names a catalyst, a replay of 65 scored predictions with the no-change comparison, four actual closes with sources, and one specific prescription.
R5Human Score & UI: judge the calls, build the gold technical panel

Human Score on all four weekly calls in human-score/vW6.json before the Wednesday lock, including whether you agree with the engine on gold. Add the Gold Technical panel to ui/index.html (see below), keep all ten panels reading committed files, and show "X / 10 files loaded" at the top. Your dashboard is opened from the repo. It is never hosted.

DONE MEANS — Human Scores for all four calls before Wednesday 23:59, and a dashboard at 10 / 10 by Saturday 23:59, with no hand-typed values.
R6LLM, GitHub & 10-Year Yield: engine part 2, the yield call, the release

In the starter file, write rsi, macd, stochastic, cci, williams_r, roc, atr and indicator_votes, with R3, by Wednesday 12:00. You own the 10-year yield weekly call. Query ChatGPT, Gemini and DeepSeek with identical prompts on all four markets and commit llm-synthesis/vW6.json before the lock. Refresh data/github_activity.json daily. Cut the vW6 tag once, before Saturday 23:59, and never move it.

DONE MEANS — your functions written and passing the self-test, a yield call that names a catalyst, LLM synthesis before the lock, and a vW6 tag cut once, on time.

Your Dashboard

The nine Sprint 5 panels, now reading vW6 files, plus one new panel. The line at the top reads "X / 10 files loaded".

PanelAttributeReads
New: Gold Technicaldata-panel="gold-technical"signals/latest.json

Lay it out like Investing.com's page so the two can be compared at a glance: tabs for Hourly, Daily and Weekly; for the selected tab, the rating and score, the bar time in GMT, the Moving Averages table (12 rows, value and Buy/Sell), the Technical Indicators table (6 rows, value and Buy/Sell), and the pivot points. The Replay panel's numbers can go in the same panel or in the Delta panel.

Timeline — One Deadline Per Item

When (Singapore time)What
Mon 12 OctSprint 6 starts. Download the starter kit
Tue 13 Oct 23:59Catalyst calendar, roles, GitHub and FigJam files. Dashboard current with the "X / 10" line. Sprint 5 files fixed
Wed 14 Oct 12:00Engine self-test passing, output in checks/engine-test.txt. Every member's own Discord check-in. checkin/wednesday.md. Blockers raised
Wed 14 Oct 23:59Prediction locks, with the engine's gold call. LLM synthesis, Human Score
Sat 17 Oct 23:59Replay, actuals, delta, prescription, vW6 tag. Dashboard at 10 / 10
Sun 18 OctNothing is due. Your work is reviewed ahead of Monday
Mon 19 OctPresentations

Monday 19 October

Practical A: Team 1, then Team 2, then Team 3.
Practical B: Team 4, in the Practical B session.
  1. Live progress block, 4 minutes, the real thing on screen, not screenshots:
    • R5, 2 minutes: run python engine/tech_summary.py, open ui/index.html from your repo, show "X / 10 files loaded", and walk through the Gold Technical panel while Prof Tan checks the same timeframe on Investing.com.
    • R6, 1 minute: GitHub: this week's merges into main, the self-test output, and the vW6 tag.
    • R1, 1 minute: FigJam Done cards, each linked to its file on main.
  2. Slides, R1 to R6, using the Sprint 5 presentation template. R4's slide shows the replay: how often the engine was right, and whether it beat "no change".
  3. Oral defense of all four calls and of the engine. Any team member can be asked to explain any vote, or why a number differs from Investing.com.

CP3405 Design Thinking III · TR3 2026 · Sprint 6 — Gold, Three Timeframes