Trading  ·  BraivIQ AI Engineering Playbook

AI Trading Charts: Annotations With Provenance, A Wording Check And A Person Who Publishes

AI trading charts are safest when code finds the events, a model only words them, and a person publishes. On 3 November 2026 Anthropic said text from Claude Mythos 5, Claude Opus 4.7 and Claude Sonnet 4.6 carries its text watermark on listed platforms, and that on Sonnet 4.6 a request with non-default temperature, top_p or top_k might not carry it. This playbook builds a chart annotation pipeline on sample bars: deterministic event detection, a wording check that refuses advice, and a provenance record with your own label and a named approver.

Published  ·  Updated  ·  11 min read  ·  By BraivIQ Engineering

Trading screens with charts on a desk, illustrating AI trading charts with annotations that carry provenance

Key takeaways

  • Anthropic said on 3 November 2026 that text from Claude Mythos 5, Claude Opus 4.7 and Claude Sonnet 4.6 carries its text watermark on the platforms it lists.
  • On Claude Sonnet 4.6, text from a request with non-default temperature, top_p or top_k might not carry the watermark, so keep your own label.
  • Let code find chart events and every figure. A model may polish the wording but must not add numbers.
  • Run a wording check that refuses predictions, recommendations and price targets, and publish only after a named approval.
  • This is engineering for operations. It uses synthetic data and contains no trading signals or advice.

AI trading charts that add written notes to a chart carry two risks: a model may invent a figure, and its wording may drift into a view on the market. The design that keeps both under control is simple. Code detects the events and calculates every number. A model, if used at all, only rephrases. A check refuses anything that predicts or recommends. A person publishes, and the record shows how each note was made.

Both samples run on Python 3.14.4 with the standard library only, on synthetic five-minute bars.

What did Anthropic say about watermarking on 3 November?

Anthropic's release notes for 3 November 2026 say text generated by Claude Mythos 5, Claude Opus 4.7 and Claude Sonnet 4.6 carries Anthropic's text watermark on the platforms listed in its guidance on how Claude marks AI-generated content. They add that on Claude Sonnet 4.6, text generated for a request that sets temperature, top_p or top_k to a non-default value might not carry it.

For a firm publishing chart notes, the practical point is that a provider watermark is helpful but not something to rely on alone. Your own label and record should say which notes were AI-assisted, whatever the model or settings.

What does an AI trading charts pipeline look like?

AI trading charts annotation diagram: sample OHLC bars feed an event detector in code, a model may polish the wording without adding figures, a wording check refuses predictions and recommendations, a provenance record keeps the model, sampling settings and an AI-assisted label, a desk supervisor approves before the note shows on charts and a hash-chained log keeps every draft and decision.
Describes. Never advises. Sample data only. Tap to open full size.

How do you detect chart events in code?

chart_events.py
"""Detect chart events from sample OHLC bars and describe them without advice.

The model may later polish the wording, but the events and every figure come from this code. The
check at the end refuses wording that predicts, recommends or targets a price. Python 3.14 standard
library only. Synthetic bars only. Not a trading signal.
"""
from __future__ import annotations

import re
import statistics

BARS = [  # (time, open, high, low, close, volume), synthetic
    ("09:00", 100.0, 100.6, 99.7, 100.2, 1200), ("09:05", 100.2, 100.5, 99.9, 100.1, 1100),
    ("09:10", 100.1, 100.4, 99.8, 100.3, 1000), ("09:15", 100.3, 100.6, 99.9, 100.0, 1150),
    ("09:20", 100.0, 100.5, 99.8, 100.4, 1050), ("09:25", 100.4, 101.9, 100.3, 101.7, 3900),
    ("09:30", 102.6, 102.9, 102.1, 102.4, 2100),
]
ADVICE = re.compile(r"\b(buy|sell|should|target|will (rise|fall)|expect|recommend|breakout likely)\b", re.I)


def events(bars: list[tuple[str, float, float, float, float, int]]) -> list[str]:
    out: list[str] = []
    for i in range(5, len(bars)):
        window = bars[i - 5:i]
        hi, lo = max(b[2] for b in window), min(b[3] for b in window)
        avg_vol = statistics.mean(b[5] for b in window)
        t, o, h, l, c, v = bars[i]
        if h > hi:
            out.append(f"At {t} the high of {h:.1f} was above the previous five-bar range of {lo:.1f} to {hi:.1f}.")
        if v > 2 * avg_vol:
            out.append(f"Volume at {t} was {v / avg_vol:.1f} times the five-bar average.")
        prev_close = bars[i - 1][4]
        if abs(o - prev_close) / prev_close > 0.005:
            out.append(f"The bar at {t} opened at {o:.1f}, {o - prev_close:+.1f} from the previous close.")
    return out


def wording_ok(text: str) -> bool:
    return ADVICE.search(text) is None


if __name__ == "__main__":
    for e in events(BARS):
        print("OK  " if wording_ok(e) else "BAD ", e)
    print("model draft check:", wording_ok("Price will rise after this breakout, consider buying."))

Python 3.14.4, standard library only. Run once as shown. Synthetic bars only. Not a trading signal.

Four descriptive notes come out of seven synthetic bars: two highs above the previous five-bar range, a volume bar 3.5 times the five-bar average and an opening move from the previous close. Each note states what happened with the figure behind it. A model draft that says a price will rise and suggests buying fails the check.

How do you record provenance and approval?

annotation_record.py
"""Provenance and approval for AI-drafted chart annotations.

Anthropic's release notes (3 November 2026) say text from Claude Mythos 5, Claude Opus 4.7 and Claude
Sonnet 4.6 carries Anthropic's text watermark on listed platforms, and that on Sonnet 4.6 a request with a
non-default temperature, top_p or top_k might not carry it. This record keeps your own label anyway, flags
non-default sampling, and publishes only after a named approval. Python 3.14 standard library only.
"""
from __future__ import annotations

import hashlib
import json
from datetime import datetime, timezone

LOG: list[dict[str, object]] = []


def record(entry: dict[str, object]) -> str:
    prev = str(LOG[-1]["hash"]) if LOG else "0" * 64
    body = {**entry, "prev": prev, "at": datetime.now(timezone.utc).isoformat()}
    h = hashlib.sha256(json.dumps(body, sort_keys=True).encode()).hexdigest()
    LOG.append({**body, "hash": h})
    return h


def draft(text: str, model: str, sampling: dict[str, float]) -> dict[str, object]:
    notes = []
    if model == "claude-sonnet-4-6" and sampling:
        notes.append("non-default sampling: provider watermark may be absent, rely on our label")
    entry = {"text": text, "model": model, "sampling": sampling, "label": "AI-assisted description",
             "notes": notes, "status": "draft"}
    record({"event": "drafted", **entry})
    return entry


def publish(entry: dict[str, object], approver: str | None) -> str:
    if not approver:
        record({"event": "publish_refused", "text": entry["text"]})
        return "refused: needs a named approver"
    record({"event": "published", "text": entry["text"], "approver": approver, "label": entry["label"]})
    return f"published with label '{entry['label']}', approved by {approver}"


if __name__ == "__main__":
    a = draft("Volume at 09:25 was 3.6 times the five-bar average.", "claude-sonnet-4-6", {"temperature": 0.7})
    print("notes:", a["notes"])
    print(publish(a, None))
    print(publish(a, "desk.supervisor@example.co.uk"))
    for e in LOG:
        print(f"  {e['event']:<16} {str(e['hash'])[:12]}")

Python 3.14.4, standard library only. Run once as shown. Sample data only.

The draft from Claude Sonnet 4.6 with a temperature of 0.7 is flagged, because the watermark might be absent. Publishing without an approver is refused. With a named supervisor it publishes under the AI-assisted label, and the log holds three chained entries.

What breaks in production?

  • **Figures added by the model.** Compare every number in the final text with the numbers the detector produced, and refuse anything new.
  • **Wording lists that are too short.** Advice can be phrased many ways. Review refusals and passes regularly and add phrases you find.
  • **Labels lost in display.** A chart library may truncate notes. Make the AI-assisted label part of the rendered note, not a tooltip.
  • **Sampling settings changed quietly.** Record the settings on every draft, as the sample does.
  • **Thin markets.** Range and volume rules built on liquid sample data may fire constantly on thin instruments. Tune per instrument and log the settings.

What are the alternatives to model-written chart notes?

OptionGood fitTrade-off
Templates only, no modelMost chart notesPlain wording, no drift and no invented figures
Model rephrases template output, as aboveNotes that need to read naturallyNeeds the wording and figure checks
Model writes freely from dataInternal research draftsHighest risk of advice drift and invented figures

Our playbook on surveillance threshold testing renders events on Lightweight Charts, and trade-break workflows covers operations. Our blog on transaction reporting and Market Watch 86 covers the regulatory context for brokers.

Where should a trading firm start?

Write your list of chart events and the exact sentence each one produces, before any model is involved. Our case studies include surveillance for a global investment bank where people made the call on what each alert meant. As a Workflow Automation Agency we build the approval and provenance steps first, and a 14-day Proof Run shows them on sample data.

Frequently asked questions

Does Claude watermark its text?

Anthropic said on 3 November 2026 that text generated by Claude Mythos 5, Claude Opus 4.7 and Claude Sonnet 4.6 carries its text watermark on the platforms it lists, and that non-default sampling on Sonnet 4.6 might mean the watermark is absent.

Can AI annotate trading charts without giving advice?

Yes, if code finds the events and figures, the wording only describes what happened, a check refuses predictions and recommendations, and a person approves before anything is published.

Should chart notes rely on the provider watermark?

Not alone. Keep your own AI-assisted label and a record of the model, settings and approver for every note.

References

  1. Anthropic, "Claude Developer Platform release notes", October and November 2026. https://platform.claude.com/docs/en/release-notes/overview