Qandy 1.0 27B

The 27B member of Starburst, QANDY's family of reasoning models for crypto perpetual-futures trading.

Release status: recipe and evaluation release. Weights are not included. This repository contains the LoRA adapter configurations, tokenizer, chat template, training and serving scripts, and full evaluation results for Qandy 1.0 27B. The LoRA weight files (adapter_model.safetensors) are not part of this release, so the model cannot be loaded from this repo as-is. Everything needed to reproduce it is documented below.

What it does

Give Qandy a compact market snapshot for one symbol: multi-timeframe RSI, Ichimoku, VWAP, funding, open interest, spot and perp CVD, taker flow, long/short ratios, liquidation distance, and support and resistance levels. It reasons through those signals step by step, then commits to one decision:

  • LONG, SHORT, or NO TRADE
  • leverage, entry, stop and target
  • the key support and resistance levels behind the call

It is trained to cite only the signals that appear in the snapshot, so every line of its reasoning can be checked against the input.

Why it is different

  • Trained on outcomes, not just on winners. Supervised fine-tuning teaches the desk's decision format. A second KTO preference stage then pushes the model away from 458 real losing trades.
  • Counterfactual "missed winner" labels. Skips that would have reached at least +1R were relabelled as undesirable (the "cf" in its internal name). This targets the over-cautious skip bias seen in earlier 27B runs.
  • Readable reasoning. Every answer has a <think> trace that walks through structure, momentum, flow and risk before the final Decision: line.
  • Honest evaluation. We publish the numbers below, including where this model fell short of its smaller sibling.

Model details

Developer QANDY
Family Starburst (internal version: Starburst 2.9-cf, 27B)
Base model Jackrong/Qwopus3.6-27B-v2 (bf16, dense; derived from Qwen/Qwen3.6-27B)
Architecture Qwen3_5ForConditionalGeneration. The vision tower is frozen; the model is trained and used text-only.
Method QLoRA SFT, merge, then KTO LoRA on the merged SFT model, merge
LoRA r 16, alpha 16, dropout 0, language attention and MLP projections
Training hardware 1x NVIDIA A40 48 GB, June 24–25, 2026
Language English
License Apache-2.0 (inherited from the base model)

Training

Stage 1: SFT (adapters/sft, scripts/train_qlora_vl.py)

  • 896 desk decisions in chat format (system prompt, market snapshot, then reasoning and decision)
  • 2 epochs, learning rate 2e-4, effective batch 8 (1 x 8 accumulation), max length 2,048
  • 4-bit base, adamw_8bit, linear schedule, 5% warmup, weight decay 0.01

Stage 2: KTO (adapters/kto, scripts/train_kto.py, applied to the SFT-merged model)

  • 1,384 labelled completions: 896 desirable and 488 undesirable (458 real losing trades plus 30 counterfactual missed winners)
  • 1 epoch, learning rate 1e-5, beta 0.1, undesirable weight 1.53, effective batch 8 (2 x 4)
  • Reference model: the SFT model with the new adapter disabled

Both training sets are public in QandyAI/qandy-1.0-27B-data (configs sft and kto).

Prompt format

System prompt (used verbatim in training and serving):

You are qwopus-trades, the entry-reasoning model for a crypto perp desk. From the snapshot, decide LONG, SHORT, or NO TRADE β€” reason through the signals, then give one decision with leverage, a risk plan (stop, target), and key levels (support below price, resistance above price). Cite only signals in the snapshot.

User message, a snapshot (illustrative values):

Symbol: BTC/USDT
Reference price: 104250.00
RSI 5m/15m/1h/4h: 58.2 / 61.4 / 63.0 / 55.7
Ichimoku 1h/4h: trend bullish / trend bullish
VWAP 1h 103,980.10 (price above), 4h 103,420.55 (price above)
Funding: +0.0042% (|f| vs p70 +0.0050% -> <p70)
OI: 91,240 (24h +3.10%)
CVD spot 5m/15m/1h: +1.20M/+3.05M/+6.80M; perp 5m: +22.40M
Flow: taker buy/sell 54.1%/45.9%
Support: 103900.00 / 102750.00
Resistance: 105400.00 / 106800.00
Context: Bias bullish.

Model output, a reasoning trace and then one decision line:

<think>
Setup: continuation long β€” price holds above both VWAPs with 1h and 4h Ichimoku aligned bullish.
...
β†’ LONG 20x; invalidate on a 1h close below 103900.
</think>
Decision: LONG BTC/USDT LIMIT @ 104250.00 at 20x. Setup: continuation. Conviction: medium. Risk plan: stop 103780, target 105400. Key levels: Support 103900.00 | Resistance 105400.00.

When it stands aside, the decision line reads:

Decision: NO TRADE. Conviction: low. Key levels: Support ... | Resistance ...

Serving

This model was served with vLLM (0.22) at 4-bit:

vllm serve <merged-model-dir> \
  --quantization bitsandbytes \
  --reasoning-parser qwen3 \
  --chat-template chat_template.jinja
  • The qwen3 reasoning parser puts the <think> trace in reasoning_content and the clean Decision: line in content.
  • Use temperature 0 with repetition penalty 1.1. Temperatures above 0.6 break the decision format.
  • On a single 24 GB GPU (RTX 3090 Ti) it fits with --max-model-len 4096 --gpu-memory-utilization 0.95 --max-num-seqs 1, at roughly 11–13 s per decision.

Evaluation

The real holdout (config holdout_real in the dataset) is 182 live desk setups with known outcomes: 52 leader winners, 31 leader losers and 99 leader skips. Each model's decision is compared with the desk leader's trade:

  • Win retention: share of the leader's winners where the model took the same side (higher is less over-cautious)
  • Loss avoidance: share of the leader's losers the model skipped or flipped (higher is better filtering)
  • Gated sum R: the leader's P&L, in R multiples, if only the trades the model approved were taken. The leader's raw sum on this set is +1.2R.
Model Win retention Loss avoidance Gated sum R
Qandy 1.0 27B (Starburst 2.9-cf 27B) 0.269 0.419 βˆ’3.7
Starburst 2.8 27B (no cf labels) 0.294 0.710 +4.7
Starburst 2.7 9B (production model at the time) 0.423 0.419 +9.0

Qandy 1.0 27B decisions on the holdout: 70 LONG, 31 SHORT, 80 NO TRADE (181 scored, 1 failed).

What we learned: the counterfactual labels reduced over-skipping, but not selectively. The model skipped fewer setups without keeping more of the winners, so selection got worse. The extra capacity of the 27B base did not beat the 9B model on this task. The noise band on this holdout is roughly Β±2–3R, so small differences should not be over-read. A larger 1,000-row backfill evaluation was started but did not finish in the logged run, so it is not reported here.

Raw outputs are in eval/.

Limitations and risks

  • Not financial advice. This is a research model. Its outputs are suggestions, not instructions, and it performs no live risk management. Do not connect it directly to order execution.
  • High leverage. It was trained on a high-leverage scalping desk. Leverage and stops in its output reflect that style, not a general risk policy.
  • Narrow distribution. Trained on BTC, ETH, SOL and AVAX perpetual futures data (mostly BTC and ETH) from mid-2026 in one fixed snapshot schema. Other markets, other fields, long prompts or a different regime are out of distribution.
  • Small evaluation set. 83 resolved trades in the real holdout, so results are noisy.
  • Grounding is not guaranteed. When snapshot fields are sparse, a model of this kind can cite signals that are not present or misread a sign. Check the reasoning against the input.

Reproduce

The scripts in scripts/ reproduce both stages (requirements are in scripts/requirements/). The training data is in QandyAI/qandy-1.0-27B-data: use sft/train.jsonl for stage 1 and kto/train.jsonl for stage 2.

# 1) SFT on the public base
TRAIN_MODEL=Jackrong/Qwopus3.6-27B-v2 TRAIN_DATA=sft/train.jsonl TRAIN_OUT=qlora_sft TRAIN_EPOCHS=2 \
  python scripts/train_qlora_vl.py
MERGE_ADAPTER=qlora_sft MERGE_OUT=sft_merged python scripts/merge_for_vllm.py

# 2) KTO on the SFT-merged model
KTO_MODEL=sft_merged KTO_DATA=kto/train.jsonl KTO_OUT=qlora_kto KTO_UNDES_W=1.53 \
  python scripts/train_kto.py
MERGE_ADAPTER=qlora_kto MERGE_OUT=qandy-1.0-27b python scripts/merge_for_vllm.py

Set repetition_penalty: 1.1 and temperature: 0.0 in each merged model's generation_config.json. The KTO adapter applies to the SFT-merged model, not to the raw base; update base_model_name_or_path in adapters/kto/adapter_config.json to point at your SFT merge.

Repository contents

README.md                 this card
chat_template.jinja       serving chat template
adapters/sft/             SFT adapter config, tokenizer, template (weights not included)
adapters/kto/             KTO adapter config, tokenizer, template (weights not included)
eval/                     holdout log and baseline results
scripts/                  train, merge, serve and eval scripts, plus requirements

About QANDY

QANDY builds personal financial agents. Its first product, QANDY SAVE, is a free desktop app that finds where you overpay on your bills and handles the switch, but only after you approve it. Starburst, which produced this model, is QANDY's trading research line. Learn more at qandy.ai.

Downloads last month
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for QandyAI/qandy-1.0-27B

Adapter
(19)
this model

Dataset used to train QandyAI/qandy-1.0-27B