Instructions to use tjarvis91/vfaix-vpa-options-trader with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use tjarvis91/vfaix-vpa-options-trader with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="tjarvis91/vfaix-vpa-options-trader") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("tjarvis91/vfaix-vpa-options-trader") model = AutoModelForMultimodalLM.from_pretrained("tjarvis91/vfaix-vpa-options-trader", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use tjarvis91/vfaix-vpa-options-trader with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "tjarvis91/vfaix-vpa-options-trader" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "tjarvis91/vfaix-vpa-options-trader", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/tjarvis91/vfaix-vpa-options-trader
- SGLang
How to use tjarvis91/vfaix-vpa-options-trader with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "tjarvis91/vfaix-vpa-options-trader" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "tjarvis91/vfaix-vpa-options-trader", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "tjarvis91/vfaix-vpa-options-trader" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "tjarvis91/vfaix-vpa-options-trader", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use tjarvis91/vfaix-vpa-options-trader with Docker Model Runner:
docker model run hf.co/tjarvis91/vfaix-vpa-options-trader
Franken-B is live: audit-grade methodology, the tournament that picked it, and the regressions we publish anyway
Franken-B is live. Here is the audit-grade story behind it.
Independent behavioral-model systems lab. One consumer GPU. No datacenter, no investors, no API rental. We build small models that have to survive contact with realistic costs -- and we publish what worked, what didn't, and what's still broken.
This is the launch thread for Franken-B, the new VFAi-X flagship trading-decision model. We are publishing it the same way we publish everything: with the methodology, the regressions, the rejected challengers, and the selection-bias finding that makes every win-rate number on this page provisional.
If you came for the topline: the same overlay won on all three of our streams (2yr / penny / 180d, n>10,000 acted trades), and Franken-B is the first and only model in the family to PASS bootstrap CI versus V5.0 on penny at p = 0.023. The honest follow-up is in section "The selection-bias finding" -- read it before quoting any return number from this thread.
The rest of this post is the deep audit: recipe, tournament results, corrector loop, fusion regressions, FAQ for ML/AI readers.
What was released
- Repo:
tjarvis91/vfaix-vpa-options-trader - Windows installer:
VFAi-X-3.5v26-2.2-FrankenB-Setup.exe(1.1 GB; first launch pulls the model) - Companion sniper (V6): vfai-x-3.5-9b-options @ vfai-x-sniper-options branch
- Previous V3.7 flagship: vfai-x-3.5-9b-options @ v3.7 branch
- License: Apache 2.0
What got shipped is the Franken-B base -- the cleanest configuration out of the tournament. The corrector adapter that scored best on a hand-built strict suite was deliberately not merged, because every corrector we trained damaged the vision/chart performance that makes this base model special. We publish the corrector failures below.
Headline numbers (audit-defensible, no dollar amounts)
Strict-suite (323-row hand-built boundary battery, 6 suites)
| Pack | Franken-B base |
|---|---|
| Strict-prompt total | 197/273 = 72.2% (full 323-row composite below) |
| Brutal action_pass | 30/33 = 90.9% |
| App_integrated mean | 99.0% |
| Today_holdout direction | 48.0% (matches V3.5) |
| Today_holdout BUY skew | 96.0% (known weakness, called out) |
| Legacy_cases | 25/30 = 83.3% |
| Combined_v2 | 71/80 = 88.8% |
| V4 | 91/100 = 91.0% |
| Position_focus | 36/40 = 90.0% |
| Edge_20260516 | 38/40 = 95.0% |
| Adversarial | 25/30 = 83.3% -- below V6's 100%, called out |
| Corpus suite-average (10 packs) | 88.5% |
Overlay-gated profitability (overlay locked, audit-defensible, percentages only)
Universal overlay: lev=15, hard_stop=-5%, theta_drag=0.5, position_size=20%, min_conv=70, max_pos=8.
| Stream | Acted trades | WR | Return | Profit factor |
|---|---|---|---|---|
| 2yr | 5,030 | 48.7% | +8,245% | 4.51 |
| penny | 5,149 | 38.7% | +35,155% | 31.77 |
| 180d | 2,544 | 49.5% | +4,711% | 4.95 |
12,723 acted trades total. Take rate near 100% on 2yr/180d, 99.2% on penny. Action mix on 2yr is 1,539 BUY / 1,491 SELL -- the first balanced lineage we have ever produced. (Earlier V3.7s was extreme SELL-heavy; V6 was BUY-only at 1.7% take.)
Bootstrap CI vs V5.0 baseline
The honest test. Same overlay, same dates, same answer key:
| Stream | Diff per trade | 95% CI | p | Verdict |
|---|---|---|---|---|
| penny (n=5,149) | -- | -- | 0.023 | PASS |
| 2yr | -- | crosses zero | -- | TIE |
| 180d | -- | crosses zero | -- | TIE |
Franken-B is the only model in the entire VFAi-X family to clear penny bootstrap vs V5.0 with p<0.05. Every other candidate -- V3.7s, V5.x repair probes, V6 -- sits inside a CI that crosses zero.
Fusion harness (n=200, chart + text)
| Strategy | Franken-B base | V3.7s | V6 | V3.5 |
|---|---|---|---|---|
| text_only | +64.86% | +78.19% | +0.24% | +97.05% |
| vision_only | +106.76% | +43.99% | +49.22% | +43.31% |
| fused_with_app_gate | +103.32% | +68.06% | +25.76% | +75.75% |
Franken-B vision is ~2.4x the next-best result in the family at this n.
The recipe (and why order is not commutative)
Qwen3.5-9B (base)
-> V3.7s merged base (text/fusion sidecar, full LM layers)
-> V50 LM LoRA (abstention + direction repair, all LM layers q/k/v/o + mlp)
-> V58 last-3 LoRA (layers 29/30/31 only, r=64, alpha=128, 300 steps)
V58 is not a vision adapter. It only touches model.language_model.layers.29/30/31. Its chart-fusion edge comes from last-layer language-side arbitration over chart-derived tokens passed from the visual encoder. That is the discovery we found surprising and worth publishing.
The order matters and we tested it:
| Recipe attempted | Result |
|---|---|
V37s -> V58 (skip V50) |
take-rate jumped to 87.5%, prose drift, 7/8 strict, rejected |
V37s -> V6 -> V58 |
7/8 valid, schema miss, rejected |
V37s -> V58 -> V6 |
same schema miss reversed |
V37s -> V50 -> V58 -> V6 |
8/8 strict, but repetition/malformed output, rejected |
V55 -> V50 (double-V50) |
take 50%, over-abstains |
V55 -> V50 -> V58 |
50% -- V58 couldn't restore direction after double V50 |
V50 alone |
NO_TRADE 8/8 -- collapsed to abstention |
V37s -> V50 -> V58 |
8/8, 75% take, balanced action mix -- winner |
The reading: V50 sandwiched between V37s and V58 stabilizes format before V58 applies its directional pressure. Any other arrangement of the same parts regressed. We call this composition-lock -- the recipe behavior depends on order in a way that cannot be flattened into a single repair adapter. This is the most interesting methodology finding from the work.
The tournament that picked Franken-B
22 stacked-adapter recipes ran through a CPU smoke battery on 2026-05-20. Each candidate was scored on five gates: valid count, strict format, convention match, action mix, take-rate. Sweet-spot take-rate band: 62%-75%. 0% = collapsed to abstention (reject). 87.5% = over-actioning (reject).
Two finalists promoted to GPU: franken_v37s_v50_v58 (this flagship) and franken_v6x = V55 -> V6 -> V58. Both passed 8/8 strict at 75% take with balanced action mix. Of the 22 recipes, only these two cleared all gates.
After release-day audit on the full 323-row strict suite, only the Franken-B base showed positive vision AND positive fused returns simultaneously. Six candidates flagged vision_negative in the final matrix; four also flagged fused_negative.
The corrector loop (why we did not merge the corrector)
After the tournament we audited Franken-B against the strict suite and found four regression categories. Instead of retraining the whole stack, we built a 109-row law-crystal dataset and trained a 4-bit QLoRA corrector adapter on top.
Crystallization details
A "law crystal" is a compressed state-action atom -- pattern + trend + volatility + position state + correct action. Each crystal carries a sample_weight (clamped, mean roughly: BUY ~2.09x, SELL ~2.08x, HOLD ~1.71x, NO_TRADE ~0.81x). Training objective:
Learn the compressed trading law first, then bind raw charts, basic English, and fresh telemetry around it.
v5 corrector corpus
| Tag | Rows | Purpose |
|---|---|---|
frankenB_v3_law_crystal |
54 | Surviving v3 corrector failure modes |
frankenB_loop_law_crystal |
40 | New failures from v4 (target-supply gain, MTF loss) |
frankenB_v5_boundary_contrast |
15 | Same context x {POSITION: none, open_winner, invalidated} |
| Total | 109 |
Why we did not merge
Every weight-level corrector damaged fusion. Each corrector iteration was trained, evaluated, and rejected:
| Corrector | Strict | Vision | Fused | Adversarial | Outcome |
|---|---|---|---|---|---|
| Franken-B base (no corrector) | 72.16% | +106.76% | +103.32% | 83.3% | SHIPPED |
| v5_full | 81.73% | -21.90% (-128.66pp) | +30.91% | -- | rejected (vision collapse) |
| v6_corrector | -- | -55.92% | -5.04% | 86.67% | rejected (vision collapse) |
| v58R (latest challenger, 2026-05-22) | sanity match | +2.55% (only positive corrector) | -- | 73.3% (regressed) | rejected (adversarial regression) |
The strict-suite gain was not worth the fusion loss. Composition-lock again -- the chart-fusion behavior is held jointly by V37s+V50+V58, and any additional weight-level repair destabilizes it. The shipped model is the un-corrected base.
This is the most uncomfortable result we have to publish. We are publishing it anyway because the alternative -- shipping a model that scored higher on a 323-row strict suite but lost the property that made it special -- would have been dishonest.
The selection-bias finding (read this before quoting numbers)
We audited our own answer keys. The market-replay legacy keys total 286,000 directional rows across 3 streams, with zero losers by construction:
| Answer key | Rows | BUY | NO_TRADE/HOLD | SELL | Losers |
|---|---|---|---|---|---|
| eval_2yr | 100,817 | 42,211 | 17,848 | 40,758 | 0 |
| eval_penny | 181,667 | 65,106 | 56,561 | 60,000 | 0 |
| eval_180d | 3,516 | 1,233 | 950 | 1,333 | 0 |
| Total | 286,000 | -- | -- | -- | 0 |
These keys were built from retrospectively-labeled profitable trades. Any model scored against them is graded on a curated profitable subset. Every win-rate / PF / return percentage above is an upper bound conditioned on this bias.
What it does not falsify: the relative comparisons (Franken-B vs V3.7s vs V6 on identical keys), the bootstrap p-value vs V5.0 baseline, the action-mix balance, the fusion harness numbers, the strict-suite pass rates, the composition-lock finding.
What we are doing about it: walk-forward validation -- split 2yr into 4 quarters of ~1,250 trades, lock overlay on Q1, apply forward to Q2/Q3/Q4. Measure overlay drift on fresh distributions. This is queued, not done. We will publish the result when it lands, regardless of outcome.
FAQ (for ML/AI readers)
Q: Why "Franken"?
A: 22 candidate recipes were built by stacking small specialist LoRA adapters on top of a merged base. Each adapter fixes one thing. The combination that won was not the one we predicted -- it came out of a tournament bracket. We started calling the winning recipes Frankenstein assemblies; the name stuck. Originally code-named tour_franken_b_saved / promote_v37s_v50_v58 in the tournament tables.
Q: Why ship the base instead of the corrected version?
A: Every corrector cost vision. The strict suite is 323 rows; the fusion harness is 200 rows; the per-stream backtest is 5,000-12,000 acted trades. The strict-suite gain was concentrated on a few dozen rows. The vision loss was a structural property change across the whole input distribution. Sample size won.
Q: Why publish the vision regressions publicly?
A: Composition-lock is the most interesting finding in the work. Showing that V58R, V5, and V6 correctors all damaged fusion in the same way is honest signal that the recipe behavior is non-trivial. We expect the v58R failure mode (BUY/SELL imbalance in the fusion training corpus producing direction-acc loss but disproportionate return loss) to generalize to other multimodal stacks. If it does, that is the publishable result.
Q: What is this not?
A: Not a quant fund. Not a trading bot. Not an LLM startup. Not financial advice. It is a one-person research lab publishing the entire stack -- weights, audits, failed correctors, eval contract findings -- as open-source artifacts under Apache 2.0. The model is the artifact. The method is the contribution.
Q: What is the hardware ceiling?
A: One RTX 5070 Ti, 16 GB VRAM. That caps LoRA training to QLoRA-4bit at r=64 on a 9B base. Full SFT and r>128 are out. The merged 9B (~18.4 GB) runs in vLLM via fp8 quantization. Everything in this thread was produced inside this envelope. The throughput envelope we now sustain is ~13.6K tokens/sec sustained on this card, up from a baseline of 2,392 tokens/sec when we started measuring -- a 5.69x speedup earned through stacked architectural choices, not new silicon.
Q: Why open-source the whole stack including the failures?
A: Two reasons. First, composition-lock is only credibly reproducible if the audit trail is visible. Second, the field benefits more from honest negative results than from hidden positive ones. Most "frontier" trading-model results in the academic and hobbyist literature evaporate when you account for realistic execution friction -- we have made the same mistakes ourselves and the publishing discipline is the only thing that catches it.
Q: What is the v58R challenger?
A: A rebuilt V58-scope adapter (581-row corpus, 256 V51 capability + 170 FB fusion anchors + 96 HOLD reinforcement + 44 adversarial counterweight + 15 boundary contrast). Trained at r=64, alpha=128, lr=2e-6 (lowered from V58's 5e-6), 200 steps (down from 300). REJECTED on 2026-05-22. It was the only corrector to keep vision technically positive (+2.55%), but adversarial collapsed to 73.3% (vs base 83.3%). Root cause: 73 BUY fusion anchors vs 33 SELL in the training corpus (2.2:1 imbalance) -- direction_acc dropped 7.5pp but return dropped ~104pp due to PnL asymmetry on chart-misread BUYs. Adapter + merged model preserved on disk; we may iterate it once we rebalance the corpus.
Q: How do I load it?
from transformers import AutoModelForImageTextToText, AutoProcessor
import torch
model = AutoModelForImageTextToText.from_pretrained(
"tjarvis91/vfaix-vpa-options-trader",
torch_dtype=torch.bfloat16,
device_map="auto",
trust_remote_code=True,
)
processor = AutoProcessor.from_pretrained("tjarvis91/vfaix-vpa-options-trader", trust_remote_code=True)
Or for the desktop trading app, just run the Windows installer -- it pulls the model on first launch.
Q: Where are the V3.7 and V6 Sniper models?
A: Same family, different repo:
- V3.7:
tjarvis91/vfai-x-3.5-9b-options --revision v3.7 - V6 Sniper:
tjarvis91/vfai-x-3.5-9b-options --revision vfai-x-sniper-options(audit thread)
The installer pulls Franken-B by default. V3.7 and Sniper are opt-in for research, ensembles, or rollback.
Q: Is the model evaluated outside the selection-biased keys?
A: Not yet. Walk-forward validation on the 2yr stream is queued. Live paper trading >1 month is not done. Regime-conditional results (bull / chop / drawdown) are not tested as a moderator. These are the things that would falsify Franken-B as a flagship and we want them to.
What you can do with this
- Load it and probe it. The vision/chart fusion is the most interesting surface. We are interested in finding cases where the +106% vision result breaks.
- Run the audit. Every report referenced above is on disk and will be progressively published. Pull requests on the model card welcome.
- Replicate composition-lock. If you have a different base model and a similar set of LoRA specialists, run a tournament. We are curious whether the order-matters property generalizes.
- Break the bull-skew on today_holdout. 96% BUY is the dominant remaining weakness. We have not solved it.
What this isn't
- Not financial advice.
- Not guaranteed-profitable. The headline returns are conditioned on selection-biased answer keys; fresh hold-out is pending.
- Not a closed result. v58R is rejected; the next challenger will iterate the BUY/SELL imbalance in the fusion corpus.
- Not a one-person rebrand of GPT. The base is Qwen3.5-9B (VL). The adapters are ours. The audits are ours. The recipe is the contribution.
If this work is useful to you and you want to support the next training run: ko-fi.com/tjarvis91
-- VFAi-X. Independent behavioral-model systems lab. Local-first. Open-source. No billion-dollar infrastructure.
Live discussion + the deployed Q-Chat router:
- ๐ซ Discord community (builders training their own trading/finance models) โ https://discord.gg/PtuHZDv5ju
- ๐ Public research devlog โ https://github.com/thron-j/qovaryx-ai-research
- ๐ค All published models โ https://huggingface.co/tjarvis91
- โ Support the next training run โ https://ko-fi.com/tjarvis91
Type /qchat ask <question> in the server to send a query through our compact intent-router (live demo of the published thesis, running on free HF CPU).
No signals. No financial advice. Engineering only.