Q
QMOM · {{ p.universe }}
{{ configSummary }}
{{ themeIcon }}
● {{ brokerBadge.text }}
{{ brokerMenuHint }}
{{ bm.name }} {{ bm.statusText }}
+ Manage broker connections ›
{{ authUserIcon }}{{ authUserLabel }}
{{ authMenuUserInfo }}
⚙ User Management
↪ Sign Out
{{ n.ic }} {{ n.label }}
{{ railToggleIcon }} Collapse
⚠ {{ renderErrorBanner }}
{{ t.sym }} {{ t.px }} {{ t.chg }}
● {{ quoteBarText }}
{{ loadBtnText }}
{{ liveErrorText }}
{{ skelHint }}
PORTFOLIO · NAV
₹{{ nav }}
{{ navChange }}
{{ k.label }}
{{ k.val }}
BEAR-MARKET FILTER
{{ s.name }} {{ s.state }}
COMPOSITE {{ compositeText }}
NEXT REVIEW
{{ nextReview }}
{{ reviewCadence }}
{{ dashChartToggleIcon }} PORTFOLIO NAV
{{ dashChartExpandHint }}
{{ dashEqHint }}
{{ yt.yr }} {{ dashHover.date }} {{ dashHover.val }}
━ {{ strategyRetText }}
{{ ddTitle }}
HOLDINGS · {{ holdCount }} / {{ p.topN }}
OPEN PORTFOLIO ›
# SYMBOL MOM WT% DAY% LTP
No holdings — connect a broker and press REFRESH
{{ h.rank }} {{ h.sym }}{{ h.sec }} {{ h.mo }} {{ h.wt }} {{ h.day }} {{ h.px }}
MOMENTUM RANK LADDER
{{ r.rank }} {{ r.sym }}{{ r.tag }} {{ r.mo }}
SECTOR ALLOCATION
{{ sec.name }} {{ sec.wt }}%
HOLD STOCKS
LOOKBACK
{{ u.label }}
SKIPm
WEIGHTAGE
{{ c.label }}
Max / sector
SELECTION MODE
{{ c.label }}
REVIEW FREQUENCY
{{ c.label }}
DAY OF WEEK
{{ c.label }}
{{ reviewDayLabel }}
COMPOSITE MOMENTUM
Uses LOOKBACK from top bar
{{ ch.label }}
× %
×
+ ADD
Σ {{ compositeWeightSum }}%
EXIT POLICY
{{ c.label }}
Exit below rank
or %
% of universe
Replace bottom holdings
Replace bottom %
STOP LOSS
{{ stopLossOnOff }}
% per stock
BEAR-MARKET FILTER
{{ c.label }}
EMA LEN
SRC
{{ s.label }}
FAST
SLOW
SRC
{{ s.label }}
ATR
MULT
TF
{{ c.label }}
RSI PERIOD
BEAR BELOW
SRC
{{ s.label }}
{{ bi.checkMark }}
{{ bi.label }}
{{ bf.label }}
SRC
{{ s.label }}
TIMEFRAME
{{ c.label }}
DEFENSIVE ASSET
{{ c.label }}
DEFAULT CONFIG
{{ defaultConfigHint }}
{{ saveDefaultLabel }}
BACKTEST PERIOD
{{ c.label }}
YEAR ▾
CUSTOM
{{ y.label }}
FROM TO
HISTORICAL CONSTITUENTS
Point-in-time index members · no survivorship bias
{{ runBtLabel }}
✕ CANCEL
CAGR
TOTAL RETURN
MAX DD
SHARPE
RUNNING…
{{ sm.label }}
{{ sm.val }}
VIEW FULL BACKTEST →
ELIGIBLE (+MOM)
{{ eligibleCount }}
SELECTED
{{ selCount }}
EXCLUDED (−MOM)
{{ excludedCount }}
SECTORS
{{ sectorCount }}
# SYMBOL MOM WT%
{{ r.rank }} {{ r.sym }}{{ r.tag }} {{ r.mo }} {{ r.wt }}
RUN REVIEW WITH THESE SETTINGS
Backtest · {{ p.universe }}
{{ btRange }} · {{ configSummary }}
{{ runBtLabel }}
✕ CANCEL
PERIOD
{{ c.label }}
YEAR ▾
CUSTOM
{{ y.label }}
FROM TO
{{ btErrorText }}
Running real backtest from broker history — pulling daily candles for every constituent (rate-limited ~3/sec, ~20–30s)…
No backtest yet for this configuration. Connect a broker, then press + RUN BACKTEST — every metric, the equity curve, the monthly heatmap and the rebalance log are computed from real historical prices pulled from your broker.
HISTORICAL MODE · {{ btSnapCoverageText }}
{{ m.label }}
{{ m.val }}
SAVED BACKTEST RUNS · {{ runCount }} UNIQUE COMBINATIONS
click a run to load its settings
CLEAR ALL
CONFIGURATION CAGR TOTAL MAX DD SHARPE RUNS
{{ r.dot }}
{{ r.label }} {{ r.histBadge }} {{ r.periodNote }}
{{ r.cagr }} {{ r.totalRet }} {{ r.maxDD }} {{ r.sharpe }} ×{{ r.runs }}
{{ btChartToggleIcon }} EQUITY CURVE
UNIVERSE BENCHMARK {{ btChartExpandHint }}
{{ yt.yr }}
{{ btHover.date }}
{{ btHover.val }}
━ Strategy ┄ {{ univRetText }} ┄ Nifty 50 TR
DRAWDOWN
MONTHLY RETURNS · %
{{ ml }} {{ row.year }}
{{ c.val }}
REBALANCE SCHEDULE & STRATEGY HISTORY
▪ HELD ▪ ADDED ▪ REMOVED RET = period return
↓ EXPORT CSV
DATE TYPE HOLDINGS PERIOD RET
{{ rb.date }} {{ rb.periodRange }}
{{ rb.action }}
{{ c.sym }} {{ c.ret }}
{{ rb.pr }}
{{ btScheduleToggleLabel }}
Broker Connection
No demo data — all prices and orders route through your broker / NSE. Credentials are stored server-side, never in the browser.
SERVER {{ serverOrigin }} ● {{ backendPillText }}
{{ connectError }}
{{ b.name }}
ACTIVE
{{ b.statusLabel }}
{{ b.flow }}
{{ selectedBrokerName }} · API CREDENTIALS
✓ No credentials required
Pulls live quotes and historical prices from Yahoo Finance via yfinance. Auto-connects on server start — no login, no API key, no account needed.
⚠ Paper trading only · ~15 min quote delay · NSE symbols via .NS suffix
{{ f.label }}
Redirect URL: {{ redirectUrl }}
{{ connectBtnText }}
{{ activateBtnText }}
{{ activateBtnText }}
CONNECTION STATUS
{{ s.icon }}
{{ s.title }}
{{ s.sub }}
TEST
{{ testResult }}
{{ portfolioPageTitle }}
{{ portfolioPageSub }}
HOLDINGS
REVIEW
PAPER LIVE
{{ paperCapitalText }}
+ FUNDS
− FUNDS
↻ {{ portRefreshCountdown }}s
{{ portfolioRefreshLabel }}
{{ portfolioErrorText }}
{{ portfolioEmptyText }}
# SYMBOL QTY AVG LTP P&L WT%
{{ h.rank }} {{ h.sym }}{{ h.sec }} {{ h.qty }} {{ h.avg }} {{ h.ltp }} {{ h.pl }} {{ h.wt }}
SECTOR ALLOCATION
{{ sec.name }} {{ sec.wt }}%
Unrealized P&L{{ unrealizedText }}
Cash{{ cashText }}
Beta vs Nifty{{ betaText }}
{{ portfolioPageTitle }}
{{ portfolioPageSub }}
HOLDINGS
REVIEW
PAPER LIVE
{{ modeBadge.text }}
{{ m.label }}
{{ m.val }}
ACTION{{ rSortArrow_action }} SYMBOL{{ rSortArrow_sym }} QTY{{ rSortArrow_qty }} LTP{{ rSortArrow_ltp }} EST VALUE{{ rSortArrow_value }} REASON STATUS
{{ o.action }} {{ o.sym }}{{ o.sec }} {{ o.qty }} {{ o.ltp }} ₹{{ o.value }} {{ o.reason }} {{ o.status }}
No orders to place
{{ basketSummaryText }}
EDIT STRATEGY
{{ placeBtnText }}
Journal
Every paper & live order and backtest run — recorded for analysis
REFRESH
{{ s.label }}
{{ s.val }}
{{ c.label }}
{{ c.label }}
{{ journalError }}
No journal entries yet. Place paper or live orders from the Review screen and run backtests — every order and run is recorded here automatically.
SYMBOLMODEENTRYEXITQTYENTRY ₹EXIT ₹P&LHOLD
No round-trips yet — place orders from the Review screen to start tracking.
{{ t.symbol }} {{ t.mode }} {{ t.entry }} {{ t.exit }} {{ t.qty }} {{ t.entryPx }} {{ t.exitPx }} {{ t.pnl }} {{ t.pct }} {{ t.days }}
TIMEMODEACTSYMBOLQTYPRICEVALUESTATUS
No orders placed yet — use the Review screen to place paper or live orders.
{{ o.ts }} {{ o.mode }} {{ o.action }} {{ o.symbol }} {{ o.reason }} {{ o.qty }} {{ o.price }} {{ o.value }} {{ o.status }}
RUN ATUNIVERSEPERIODCAGRTOTALMAX DDSHARPE
No backtest runs saved yet — run a backtest from the Backtest tab to record results here.
{{ r.ts }} {{ r.universe }} {{ r.period }} {{ r.cagr }} {{ r.total }} {{ r.maxdd }} {{ r.sharpe }}
Local Market Data
Offline OHLCV store — Nifty 500 · 20 years · ~150 MB · backtests run in <2s
⚠ {{ dataIssuesTotal }} NEED REVIEW
{{ dataUpdateIcon }}{{ dataUpdateBtnLabel }}
{{ dataBgMode }}
{{ dataBgProgress }}
{{ dataBgPct }}%
UPDATE LOG
{{ line }}
PULL DATA
UNIVERSE or override with a single symbol →
{{ dataPullCountNote }}
HISTORY
{{ dataPullBtnLabel }}
Cached & denylisted symbols are skipped automatically
{{ line }}
SKIP LIST · {{ dataDenylistCount }} symbols with no data (delisted / merged)
{{ d.symbol }} …and {{ dataDenylistCount - 30 }} more
These are auto-retried after 30 days. Use force-pull to override.
Symbol Review
yfinance returned 0 rows — wrong ticker, delisted, or merged. Enter correct NSE symbol → SAVE → re-pull.
{{ dataIssuesSuspect }} SUSPECT {{ dataIssuesSkipped }} AUTO-SKIPPED (5+ fails) {{ dataIssuesTotal }} total
⬇ EXPORT CSV
SYMBOL / COMPANY TRIES LAST TRIED CORRECT NSE TICKER yfinance NSE DIRECT
{{ iss.symbol }}
{{ iss.company_name }}
{{ iss.attempt_count }}
{{ iss.last_attempt }}
SAVE
{{ iss.nseBtnLabel }}
{{ iss.nseStatusText }}
{{ nseBulkStatusLabel }} {{ nseBulkDetailLabel }}
{{ line }}
Pulls all {{ dataIssuesTotal }} symbols from NSE one by one.
Each symbol: ~{{ nseBulkChunks }} requests × 5-year chunks. Safe to close modal.
CLOSE
DB COVERAGE
{{ dataDbStats }}
No data yet — pull a universe above to populate the local DB.
SYMBOL {{ coverageSort==='symbol' ? (coverageSortDir==='asc' ? '▲' : '▼') : '⇅' }} FROM {{ coverageSort==='fromDate' ? (coverageSortDir==='asc' ? '▲' : '▼') : '⇅' }} TO {{ coverageSort==='toDate' ? (coverageSortDir==='asc' ? '▲' : '▼') : '⇅' }} ROWS {{ coverageSort==='days' ? (coverageSortDir==='asc' ? '▲' : '▼') : '⇅' }} SPAN {{ coverageSort==='years' ? (coverageSortDir==='asc' ? '▲' : '▼') : '⇅' }}
{{ r.symbol }} {{ r.fromDate }} {{ r.toDate }} {{ r.days }} {{ r.years }}
{{ coverageCountLabel }}
CONSTITUENT TRACKING
Daily snapshots — detects additions & removals for point-in-time backtests
UNIVERSE LAST CHECKED SNAPS CHANGES
{{ r.universe }} {{ r.lastDate }} {{ r.snapshots }} {{ r.changes }}
No changes detected yet — history builds automatically as you use the app each day.
CHANGE LOG
DATE UNIVERSE SYMBOL ACTION SECTOR
{{ r.date }} {{ r.universe }} {{ r.symbol }} {{ r.action }} {{ r.sector }}
CUSTOM UNIVERSE
Add factor / strategy indices not available for direct NSE download (e.g. Nifty Alpha 50, Nifty500 Quality 50). Paste NSE symbols, one per line or comma-separated.
{{ customUniMsgText }}
{{ customUniBtnLabel }}
HISTORICAL CONSTITUENT IMPORT
Backfill constituent snapshots from NSE IndexInclExcl.xls — eliminates survivorship bias for pre-2020 backtests
{{ histImportBtnLabel }}
① Copy IndexInclExcl.xls to backend/data/IndexInclExcl.xls  ② Click IMPORT
{{ histStage }} {{ histCur }} / {{ histTotal }}
✕ {{ histError }}
TOTAL EVENTS
{{ histTotalEvents }}
MAPPED
{{ histMappedEvents }}
UNMAPPED
{{ histUnmappedEvents }}
MAP RATE
{{ histMapRate }}%
UNIVERSE EVENTS MAPPED SNAPS FROM TO
{{ u.name }} {{ u.events }} {{ u.mapped }} {{ u.snaps }} {{ u.from_date }} {{ u.to_date }}
{{ n.ic }} {{ n.label }}
MOMENTUM
TERMINAL
Sign In
Register
{{ authMessage }}
{{ authError }}
USERNAME
PASSWORD
CONFIRM PASSWORD
{{ authSubmitLabel }}
First registered user becomes admin. All others require admin approval.
User Management
Approve, suspend, or remove user accounts
↻ REFRESH
✕ CLOSE
{{ adminUsersError }}
{{ u.username }}
{{ u.role }} · joined {{ u.created_at }}
{{ u.status }}
Approve
Suspend
Delete
Loading users…
Deploy as Live Strategy
This will save your current strategy configuration and run it automatically on site load and every hour. Signals (selected stocks) will appear in Portfolio → STRATEGIES.
STRATEGY NAME
CANCEL
DEPLOY ▶
! Confirm LIVE order placement
{{ confirmText }}
Orders{{ confirmOrders }}
Gross value₹{{ confirmValue }}
{{ checkMark }} I confirm placing these as live market orders.
CANCEL
PLACE LIVE ORDERS