Tests whether pictures of price charts at three time scales — a 104-bar weekly chart, a 126-bar daily chart and a 140-bar hourly chart — tell a model anything about a US stock's next 20 days of volatility, its chance of a 10% drawdown, or whether it beats the median stock over 5 days, beyond 33 ordinary numerical features computed from the same price history. The universe is 979 US stocks with daily and hourly bars from 2001 to 2026. The figures on this page come from a 60-stock pilot run of the full pipeline; the 979-stock run uses the same notebook and has not been run yet.
Seven ImageNet-pretrained backbones — ResNet-18, EfficientNet-B0, ViT-B/16, ConvNeXt-Tiny, Swin-T, DINOv2-S and MobileNetV3 — are used frozen, alongside three randomly initialised ResNet-18s as controls. Splits follow time (train 2001–2016, validation 2017–2019, test 2020–2022, each with a 20-day purge), and 2023–2026 is a sealed holdout behind a single-use, hash-logged guard. Image features are reduced by PCA, ridge, logistic and boosted-tree heads are tuned on validation only (1,200 configurations, all logged), and every comparison carries a month-block bootstrap confidence interval. A rule written before the test years were read lets an image model win only if its validation gain over the best numbers-only model clears a 95% interval.
Pilot results. Twenty-day volatility: R² 0.553 on validation, 0.496 on test and 0.550 on the holdout (Swin-T chart features plus numbers, boosted trees). Drawdown of 10% or more within 20 days: AUC 0.711 on validation and 0.656 on test (DINOv2-S features plus numbers). Five-day direction: AUC 0.510 on test and 0.490 on the holdout, with both intervals spanning 0.5 — no detectable edge. Label-shuffle controls find nothing (volatility R² −0.115, direction AUC 0.507), as they should.
A Gradio dashboard takes three TradingView screenshots of one stock (1W, 1D, 1H). It reads each image's ticker, timeframe and last-bar open, high, low and close with OCR — correct on all 66 real screenshots it was tested against — and confirms the ticker by matching that legend to market data, which also pins the analysis to the screenshot's own date. It then rebuilds the exact model inputs and returns expected volatility, drawdown probability, direction probability and a NO TRADE decision. The dashboard is built and tested but not hosted yet: Hugging Face now charges for Gradio Spaces.
The numbers carry the signal
Chart images did not add a significant improvement on the test years (volatility ΔR² +0.004, 95% CI −0.004 to +0.012), even though they cleared the validation gate. There is a structural reason: the renderer scales every chart to fill its panel, so a picture shows a stock's shape but not how volatile it is, and that level is most of what the volatility target measures. Direction has no edge, so the decision layer defaults to NO TRADE. On the test years its risk flag still did useful work: realised volatility of 50% a year in flagged cases against 27% otherwise, and 10% drawdowns 37% of the time against 18%.