Tool lesson

Seasonal: Read Event Trajectory And Volatility Around Day Zero

A beginner-safe Seasonal lesson for reading event trajectory charts as timing context: anchor day zero, separate pre-event from post-event movement, and reject paths that are too noisy to carry forward.

12 minBeginner5 chapters

Educational only

The examples teach workflow and risk framing. They do not provide trade recommendations, personalized advice, leverage guidance, or guaranteed outcomes.

Chapter 01

Anchor the event at day zero

Trader question

What is day zero, and which days are before or after the event?

Event trajectory starts by aligning every historical occurrence to the same D0 marker. Without that anchor, the learner cannot tell whether the chart is showing anticipation, event-day movement, or post-event follow-through.

Desk checklist

  • Find the D0 reference line.
  • Confirm the selected event and metal lane.
  • Separate D- days from D+ days before interpreting the line.

Interactive proof

Event-relative performance chart, day-zero reference line, and event inspector

Use the trajectory lab to toggle the full window and point to the day-zero anchor before reading the path.

1Day zeroEvent anchorThe event date becomes D0 so the learner can compare what happened before, during, and after the event.
2Pre-event pathAnticipation checkIf most of the move happened before D0, the event row may describe positioning into the event rather than reaction after it.
3Post-event pathFollow-through checkIf the path only expands after D0, the learner should separate the event response from the pre-event setup.
4Volatility bandNoise envelopeA wide band says historical paths disagreed. It is a warning about uncertainty, not stronger conviction.
5Occurrence countReliability gateThe path label must stay tentative when samples are thin, the worst return is extreme, or year-wise behavior is scattered.

Day zero is the anchor; trajectory, volatility band, occurrences, and worst return decide whether an event path is early, late, mixed, or too noisy.

Interactive desk lab

Seasonal Event Trajectory Lab

A practical Seasonal Analysis event trajectory lab for anchoring day zero, toggling pre-event/event-day/post-event windows, reading volatility bands and occurrences, then labeling the path as early, late, mixed, or too noisy.

Native scroll

A practical Seasonal Analysis event trajectory lab for anchoring day zero, toggling pre-event/event-day/post-event windows, reading volatility bands and occurrences, then labeling the path as early, late, mixed, or too noisy.

55s Remotion sceneSeasonalDayZeroTrajectoryVideo

Day zero timeline

Previous event paths align around D0, fan into an average band, and end with a volatility warning.

Storyboard beats4 cues
1

Three prior-year paths enter the frame one at a time.

2

The paths align on the same day-zero event marker.

3

An average path and uncertainty band appear over the paths.

4

The final frame asks whether the move happened before, during, or after D0.

Remotion code

SeasonalDayZeroTrajectoryVideo

The snippet is stored with the lesson so a future Remotion project can render the chapter video.

Show component snippet
import {AbsoluteFill, Easing, Sequence, interpolate, useCurrentFrame} from "remotion";

const paths = [
  {label: "Year A", color: "#2454a6", values: [-0.2, 0.1, 0.4, 0.7, 0.9, 1.1, 1.0, 0.8]},
  {label: "Year B", color: "#047857", values: [-0.4, -0.1, 0.3, 0.5, 0.4, 0.2, 0.1, -0.1]},
  {label: "Year C", color: "#b42318", values: [0.2, 0.4, 0.6, 0.4, -0.2, -0.8, -0.6, -0.3]},
];

const pointsFor = (values: number[]) =>
  values.map((value, index) => String(100 + index * 122) + "," + String(260 - value * 92)).join(" ");

export const SeasonalDayZeroTrajectoryVideo = () => {
  const frame = useCurrentFrame();
  const reveal = interpolate(frame, [20, 98], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
    easing: Easing.bezier(0.16, 1, 0.3, 1),
  });
  const band = interpolate(frame, [90, 128], [0, 1], {
    extrapolateLeft: "clamp",
    extrapolateRight: "clamp",
    easing: Easing.bezier(0.16, 1, 0.3, 1),
  });

  return (
    <AbsoluteFill style={{background: "#fff8e8", color: "#071126", padding: 72}}>
      <h1 style={{fontSize: 52, lineHeight: 1}}>Align every event to day zero.</h1>
      <svg viewBox="0 0 980 420" style={{marginTop: 42, width: "100%", height: 420, background: "#fffdf7", border: "2px solid #ad862d"}}>
        <line x1="466" y1="44" x2="466" y2="360" stroke="#d9971f" strokeWidth="5" />
        <text x="438" y="36" fill="#805407" fontSize="25" fontWeight="900">D0</text>
        <line x1="70" y1="260" x2="928" y2="260" stroke="#d9c69a" strokeWidth="2" />
        <path d="M100 192 C220 168 344 150 466 158 C588 166 710 192 954 210 L954 300 C710 280 588 250 466 238 C344 226 220 238 100 252 Z" fill="#d9971f" opacity={band * 0.2} />
        {paths.map((path, index) => (
          <polyline key={path.label} points={pointsFor(path.values)} fill="none" stroke={path.color} strokeWidth="7" strokeLinecap="round" strokeLinejoin="round" opacity={interpolate(reveal, [index * 0.18, index * 0.18 + 0.25], [0, 1], {extrapolateLeft: "clamp", extrapolateRight: "clamp"})} />
        ))}
      </svg>
      <Sequence from={132} layout="none">
        <p style={{fontSize: 28, color: "#805407"}}>Question: did the path move before D0, at D0, or after D0?</p>
      </Sequence>
    </AbsoluteFill>
  );
};

Sources used for this tutorial

Next step

Open the tool with the checklist beside you.

Move from the lesson into the matching Bullion Brains tool, keep the checklist visible, and treat the output as evidence until the caveats are clear.

Open Seasonal Analysis