Changelog
All notable changes to this project are documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
0.8.1 - 2026-11-07
Fixes the wrong numbers and import data loss listed under “Known issues” in 0.8.0, and replaces the BUY/SELL verdict with neutral pillar scores.
Added
-
scorefetches only the statements it needs, andverdict,insightsand the bare-symbol snapshot skip the news and filing sources, so they answer faster. Every NSE request now times out after 3 seconds instead of stalling the command (#222). -
scorefetches only the statements it needs, andverdict,insightsand the bare-symbol snapshot skip the news and filing sources, so they answer faster. Every NSE request now times out after 3 seconds instead of stalling the command (#222).
Changed
-
verdict,deep,analyzeandstockwise SYMBOLno longer print a STRONG BUY / SELL label, an entry zone, a stop-loss, a target price or risk/reward. They show six pillar scores (Strong / Moderate / Weak), a 0-100 composite and a “not a recommendation” note. In--json,action,entry_zone,stop_loss,target_price,upside_pct,risk_pct,risk_reward, the time-horizon texts and each pillar’sgradeare gone, and each pillar has aband. Thedecision,signalandbuysellaliases are removed (#188). -
verdict: a pillar with no data now shows “no data” and is left out of the composite instead of scoring 50 or 55, and crypto, FX and index symbols get only the technical pillar and no composite (#211). -
verdict --explainnow lists the real weights (valuation 20, growth 25, balance sheet 15, smart money 15, analyst 10, technicals 15), taken from the scores themselves, and the data sources that failed are listed under the score (#211). -
verdict: the fixed “Confidence: 85%” is replaced bydata_coverage(JSON) / “Data coverage” (text), the share of the score’s inputs that had data (#77). -
insights: analyst cards say “mean rating x/5” instead of “Strong Buy”, and the 52-week-low card no longer calls it a “value entry”. -
The
verdicttool in the MCP server and instockwise askis now called “6-pillar scorecard”, returns only pillar scores, data coverage and the facts behind them, and its description says it is not a recommendation; the buy/sell action, entry zone and stop-loss are no longer sent to the model (#112). -
ipo: the board andipo SYMBOLno longer print APPLY / AVOID / SUBSCRIBE labels or the family-PAN “Retail Split Strategy”. They show demand labels (strong, moderate, mixed or weak demand, book building), the allotment odds by application tier and, with--capital, the odds at that amount. In--json,listing_verdict,long_term_verdict,timing_guidance,capital_planandgolden_rulesare replaced bylisting_demand,long_term_profile,timeline,capital_oddsandallotment_rules(#189). -
picksis now “Highest Scores in the Large-Cap Universe” and lists the factors that raised each score instead of “reasons” such as “Analyst buy” (#189). -
intradayis a signal scanner: it no longer gives entries, stop-losses, targets or position sizes for your capital, and shows the strategies behind the strongest signals instead. TheCAPITALandTARGET%arguments are accepted and ignored (#189). -
The web dashboard’s Research tab shows the pillar scores and data coverage instead of the buy/sell label, entry zone and stop-loss.
-
The crates.io and PyPI description and keywords now mention portfolio, tax and the MCP server.
-
verdict,deep,analyzeandstockwise SYMBOLno longer print a STRONG BUY / SELL label, an entry zone, a stop-loss, a target price or risk/reward. They show six pillar scores (Strong / Moderate / Weak), a 0-100 composite and a “not a recommendation” note. In--json,action,entry_zone,stop_loss,target_price,upside_pct,risk_pct,risk_reward, the time-horizon texts and each pillar’sgradeare gone, and each pillar has aband. Thedecision,signalandbuysellaliases are removed (#188). -
verdict: a pillar with no data now shows “no data” and is left out of the composite instead of scoring 50 or 55, and crypto, FX and index symbols get only the technical pillar and no composite (#211). -
verdict --explainnow lists the real weights (valuation 20, growth 25, balance sheet 15, smart money 15, analyst 10, technicals 15), taken from the scores themselves, and the data sources that failed are listed under the score (#211). -
verdict: the fixed “Confidence: 85%” is replaced bydata_coverage(JSON) / “Data coverage” (text), the share of the score’s inputs that had data (#77). -
insights: analyst cards say “mean rating x/5” instead of “Strong Buy”, and the 52-week-low card no longer calls it a “value entry”. -
The
verdicttool in the MCP server and instockwise askis now called “6-pillar scorecard”, returns only pillar scores, data coverage and the facts behind them, and its description says it is not a recommendation; the buy/sell action, entry zone and stop-loss are no longer sent to the model (#112). -
ipo: the board andipo SYMBOLno longer print APPLY / AVOID / SUBSCRIBE labels or the family-PAN “Retail Split Strategy”. They show demand labels (strong, moderate, mixed or weak demand, book building), the allotment odds by application tier and, with--capital, the odds at that amount. In--json,listing_verdict,long_term_verdict,timing_guidance,capital_planandgolden_rulesare replaced bylisting_demand,long_term_profile,timeline,capital_oddsandallotment_rules(#189). -
picksis now “Highest Scores in the Large-Cap Universe” and lists the factors that raised each score instead of “reasons” such as “Analyst buy” (#189). -
intradayis a signal scanner: it no longer gives entries, stop-losses, targets or position sizes for your capital, and shows the strategies behind the strongest signals instead. TheCAPITALandTARGET%arguments are accepted and ignored (#189). -
The web dashboard’s Research tab shows the pillar scores and data coverage instead of the buy/sell label, entry zone and stop-loss.
-
The crates.io and PyPI description and keywords now mention portfolio, tax and the MCP server.
-
longtermanddaemon longtermdescribe scores as data, not calls: analyst lines give the mean rating and mean price estimate, risk tiers areLower/Moderate/Higher, a pillar with no data shows a dash, and growth, SIP and simulation are labelled as an illustration (#189). -
analyze,insider,deepandcompare: the analysts’ rating is shown as “mean rating 1.8/5 (1 = most positive)” instead of Strong Buy / Buy / Hold / Sell, and the price target line is now “Analyst Mean Price Estimate”.compare --jsonand--csvgiveanalyst_mean_rating(a number) instead ofanalyst_rating(a word).verdictwords the same figure as an analyst mean price estimate above or below the current price. -
analyzeand the research insight cards: the analyst lines say “mean price estimate” and give the mean rating as a number, instead of “target upside” and the Buy / Hold word. -
ipo: the press section counts positive and negative third-party headlines instead of “Subscribe / Avoid” mentions, and headlines that tell readers what to do are no longer repeated. In--json,street_buzz.subscribe_mentionsandavoid_mentionsare nowpositive_headlinesandnegative_headlines. -
daemon intradayandsim: paper positions are shown and sent in notifications as “long” / “short” with “level 1”, “level 2” and “exit level” instead of BUY / SELL, ENTRY, T1, T2 and SL. Existingdaemon_state.jsonand simulator history files still load. -
technical(and thetechnicalMCP andasktool): the RSI signal now reads “RSI above 70 (overbought zone)” or “RSI below 30 (oversold zone)” instead of “Consider selling” / “Consider buying” / “Strong buy signal”. It describes the reading and no longer gives a call. -
The docs site is organised around goals: a five-minute quickstart, a “What do you want to do?” page and eight task-based guides (import trades, Indian capital-gains tax, quick lookups, rebalancing, Claude and Cursor over MCP, alerts and the daemon, backtests and practice, scripting). Each command reference section links to its guide.
Fixed
-
importof an.xlsxworkbook with several sheets: only one sheet is read (the first whose header fits the importer, in tab order), so a mutual-fund or summary tab is no longer imported as bogus holdings. The sheets used and skipped are listed, and--sheet NAMEpicks another (#101). -
import: a tradebook with Mindtree trades (now recorded as LTIM) no longer stops with a 404 at the split check. If Yahoo has no price history for a symbol, the check is skipped for it, a note says so, and the rest of the file is imported (#316). -
portfolio xray: Indian stocks are now called large cap from ₹1,00,000 crore and mid cap from ₹33,000 crore (AMFI’s list of December 2024), not ₹20,000 and ₹5,000 crore, so a ₹25,000 crore company shows as small cap and the market-cap split is no longer tilted to large caps (#100). -
import growwandimport upstox: a holdings file whose ISIN column holds text such as₹12,34,567no longer crashes the import; the cell is treated as not an ISIN (#102). -
import cas: schemes you have fully redeemed are no longer skipped. When the statement covers every purchase, their redemptions are recorded as realized sales fortax in,tax export inandtax advance, and no holding is left. A redeemed scheme with units bought before the statement is listed as skipped, with the reason (#90). -
import: a second tradebook for the same broker is merged with the first instead of replacing its lots and sales, so yearly Zerodha Console files can be imported in any order and re-importing a file changes nothing (#83). -
importandtrade sync: a buy and sell of the same share on one day are netted as an intraday sale before any older lot is touched, andtax in,tax export inandtax advancereport intraday results separately instead of as 111A/112A gains from the oldest lot (#84). -
importandtrade holdings: a holdings file from a second broker adds to the shares of the first instead of overwriting them. Lots and sales now carry the demat account (zerodha,groww, …), FIFO, imports and syncs work per account,portfolio lotsshows it, and old portfolio files load unchanged (#85). -
importandportfolio add: dated HDFC and Mindtree trades from before their mergers are now recorded as HDFCBANK (42 for 25) and LTIM (73 for 100) shares at the same total cost and date, instead of the old quantity at the old price (#86). -
tax in,tax export in,tax advanceandharvest: gold, silver, liquid, debt and international ETFs (such asGOLDBEES,LIQUIDBEES,MON100) are no longer taxed as listed shares under Sec. 111A/112A;tax inlists them under “taxed under other rules” andharvestno longer offers them for the ₹1.25 lakh exemption (#87). -
portfolio,import,trade sync,trade holdingsandwealth: commands that change your portfolio or wealth history at the same time no longer overwrite each other’s changes. Each takes a lock, reloads the file and applies only its own change; a second command waits up to 30 seconds, then says so (#93). -
deep: no longer panics (index out of bounds) on NSE stocks when the latest bar has a missing close (#306). -
Yahoo fetch errors no longer include the request URL, so the session crumb cannot appear in error text.
-
portfolio xraytreats Indian ETFs (such asNIFTYBEES,GOLDBEES,LIQUIDBEES) as funds, also when Yahoo returns no holdings for them, instead of flagging them as one stock with too much weight. Gold, silver and liquid ETFs count as commodity and cash (#220). -
longterm: the SIP calculator now grows each monthly instalment only for the time it stays invested (₹15,000 a month at 12% gives ₹12.37 L after 5 years, not ₹15.86 L), the “SIP for” target reads$1Mfor US stocks, and the “Suggested SIP Allocation” block is gone (#67, #189). -
Yahoo Finance: commands no longer open the Yahoo session at start-up, so
history,backtestand a provider-backedquotestill work when Yahoo refuses the session token, and commands that never touch Yahoo send no request at all (#154). -
quote,verdict,deep,scoreandinsights: a symbol Yahoo does not know, such as the BSE code500325, now gives a “not found” error with exit code 1 instead of an empty card or a verdict on a company with no price (#206). -
score,analyze,verdictanddeep: companies that file statements in US dollars but trade in rupees, such as Infosys, now have their statement amounts converted at the live USD/INR rate before ratios and revenue are shown, so INFY’s Altman Z drops from 426 to about 8 and its revenue reads ₹47.33K Cr, not ₹504 Cr (#207). -
quote,compare,deep,dividendsanddivcal: dividend yield no longer reads 0 for stocks such as RELIANCE, or 0.05% for INFY, when Yahoo’s trailing figure is missing or computed from a dollar dividend;dividends INFYnow shows 4.4% (#208). -
peers,compare,deepandanalyze: sector, profit margin, debt/equity, revenue growth, beta and analyst ratings are now read from Yahoo’s company summary, sopeers TCSlists IT peers andcompareno longer shows rows of N/A. Rows and sections with no data at all are left out (#209). -
deepandanalyze: banks and lenders no longer show an Altman Z “Distress Zone” next to a strong score; they show “n/a for banks and lenders”, andscoresays the same. The doubled brackets in the zone label are gone (#212). -
forecast: the default history is now 6 months instead of one, soforecast TCSprints a projection instead of “Not enough price data”. The error now says how many days it found, and theSYMBOLargument has a help line (#215). -
watch add,portfolio addandalert addnow refuse a ticker Yahoo does not know (for exampleRELIANC) and name the likely one, instead of saving it silently;--forcesaves it anyway, and funds, SGBs and offline use are not blocked.technical,history,riskand the other chart commands say “No price history for ZZQQXX.NS” instead of “HTTP 404” (#216). -
portfolioandportfolio --jsonnow work offline: they list every holding with shares, average cost and cost basis, show prices as N/A (price: nullandunpricedin JSON) and say “Offline: prices unavailable” instead of failing.tax,harvest,rebalanceandxraystill need a connection (#221). -
importof an.xlsxworkbook with several sheets: only one sheet is read (the first whose header fits the importer, in tab order), so a mutual-fund or summary tab is no longer imported as bogus holdings. The sheets used and skipped are listed, and--sheet NAMEpicks another (#101). -
import: a tradebook with Mindtree trades (now recorded as LTIM) no longer stops with a 404 at the split check. If Yahoo has no price history for a symbol, the check is skipped for it, a note says so, and the rest of the file is imported (#316). -
portfolio xray: Indian stocks are now called large cap from ₹1,00,000 crore and mid cap from ₹33,000 crore (AMFI’s list of December 2024), not ₹20,000 and ₹5,000 crore, so a ₹25,000 crore company shows as small cap and the market-cap split is no longer tilted to large caps (#100). -
import growwandimport upstox: a holdings file whose ISIN column holds text such as₹12,34,567no longer crashes the import; the cell is treated as not an ISIN (#102). -
import cas: schemes you have fully redeemed are no longer skipped. When the statement covers every purchase, their redemptions are recorded as realized sales fortax in,tax export inandtax advance, and no holding is left. A redeemed scheme with units bought before the statement is listed as skipped, with the reason (#90). -
import: a second tradebook for the same broker is merged with the first instead of replacing its lots and sales, so yearly Zerodha Console files can be imported in any order and re-importing a file changes nothing (#83). -
importandtrade sync: a buy and sell of the same share on one day are netted as an intraday sale before any older lot is touched, andtax in,tax export inandtax advancereport intraday results separately instead of as 111A/112A gains from the oldest lot (#84). -
importandtrade holdings: a holdings file from a second broker adds to the shares of the first instead of overwriting them. Lots and sales now carry the demat account (zerodha,groww, …), FIFO, imports and syncs work per account,portfolio lotsshows it, and old portfolio files load unchanged (#85). -
importandportfolio add: dated HDFC and Mindtree trades from before their mergers are now recorded as HDFCBANK (42 for 25) and LTIM (73 for 100) shares at the same total cost and date, instead of the old quantity at the old price (#86). -
tax in,tax export in,tax advanceandharvest: gold, silver, liquid, debt and international ETFs (such asGOLDBEES,LIQUIDBEES,MON100) are no longer taxed as listed shares under Sec. 111A/112A;tax inlists them under “taxed under other rules” andharvestno longer offers them for the ₹1.25 lakh exemption (#87). -
portfolio,import,trade sync,trade holdingsandwealth: commands that change your portfolio or wealth history at the same time no longer overwrite each other’s changes. Each takes a lock, reloads the file and applies only its own change; a second command waits up to 30 seconds, then says so (#93). -
deep: no longer panics (index out of bounds) on NSE stocks when the latest bar has a missing close (#306). -
Yahoo fetch errors no longer include the request URL, so the session crumb cannot appear in error text.
-
portfolio xraytreats Indian ETFs (such asNIFTYBEES,GOLDBEES,LIQUIDBEES) as funds, also when Yahoo returns no holdings for them, instead of flagging them as one stock with too much weight. Gold, silver and liquid ETFs count as commodity and cash (#220). -
longterm: the SIP calculator now grows each monthly instalment only for the time it stays invested (₹15,000 a month at 12% gives ₹12.37 L after 5 years, not ₹15.86 L), the “SIP for” target reads$1Mfor US stocks, and the “Suggested SIP Allocation” block is gone (#67, #189). -
Yahoo Finance: commands no longer open the Yahoo session at start-up, so
history,backtestand a provider-backedquotestill work when Yahoo refuses the session token, and commands that never touch Yahoo send no request at all (#154). -
quote,verdict,deep,scoreandinsights: a symbol Yahoo does not know, such as the BSE code500325, now gives a “not found” error with exit code 1 instead of an empty card or a verdict on a company with no price (#206). -
score,analyze,verdictanddeep: companies that file statements in US dollars but trade in rupees, such as Infosys, now have their statement amounts converted at the live USD/INR rate before ratios and revenue are shown, so INFY’s Altman Z drops from 426 to about 8 and its revenue reads ₹47.33K Cr, not ₹504 Cr (#207). -
quote,compare,deep,dividendsanddivcal: dividend yield no longer reads 0 for stocks such as RELIANCE, or 0.05% for INFY, when Yahoo’s trailing figure is missing or computed from a dollar dividend;dividends INFYnow shows 4.4% (#208). -
peers,compare,deepandanalyze: sector, profit margin, debt/equity, revenue growth, beta and analyst ratings are now read from Yahoo’s company summary, sopeers TCSlists IT peers andcompareno longer shows rows of N/A. Rows and sections with no data at all are left out (#209). -
deepandanalyze: banks and lenders no longer show an Altman Z “Distress Zone” next to a strong score; they show “n/a for banks and lenders”, andscoresays the same. The doubled brackets in the zone label are gone (#212). -
forecast: the default history is now 6 months instead of one, soforecast TCSprints a projection instead of “Not enough price data”. The error now says how many days it found, and theSYMBOLargument has a help line (#215). -
watch add,portfolio addandalert addnow refuse a ticker Yahoo does not know (for exampleRELIANC) and name the likely one, instead of saving it silently;--forcesaves it anyway, and funds, SGBs and offline use are not blocked.technical,history,riskand the other chart commands say “No price history for ZZQQXX.NS” instead of “HTTP 404” (#216). -
portfolioandportfolio --jsonnow work offline: they list every holding with shares, average cost and cost basis, show prices as N/A (price: nullandunpricedin JSON) and say “Offline: prices unavailable” instead of failing.tax,harvest,rebalanceandxraystill need a connection (#221). -
alert watchandalert check:change-above,change-belowandvolume-spikealerts no longer repeat the last session’s move on weekends, holidays and before the open (for example Friday’s fall announced again on Saturday, Sunday and Monday morning byalert watch --oncein cron). They give no reading until today’s session has traded and re-arm on the quote’s own session date, so a crypto alert does not fire twice across midnight in your market’s time zone (#103). -
sim replay endnow scores and clears a replay whose price file (sim_replay_tape.json) was deleted, instead of asking you to runsim replay endand leaving the replay stuck (#106). -
sim historyandsim statusno longer mix markets: history totals, best and worst day, win rate, streaks and the chart cover only the-mmarket (rupees and dollars were added together), andsim statusshows each session in its own currency.sim startis no longer blocked by an open session of another market the same day (#107). -
simpractice score: the drawdown part is now judged against what the benchmark would have lost at your average exposure, so holding mostly cash through a crash no longer earns drawdown points that the same picks fully invested would not. Scores of runs with under full exposure can drop by up to about 14 points (#119). -
trade buy,trade sell,trade limitandtrade gttwith--yesare now refused, before any broker login, unlessmax_order_valueis set in the broker’s config file, since--yesremoves the only other guard against a wrong quantity. Scripts that use--yesneed"max_order_value": 50000(or your own cap) added;--dry-runand typingyesat the prompt work as before. The preview now notes when no cap is set (#125). -
MCP
order_preview: thestockwise tradecommand it returns now quotes symbols with&, such as'M&M', so pasting it into bash, zsh or PowerShell no longer splits at the&(#126). -
ask: a failing tool no longer sends the full error to the model. Local file paths (a corruptportfolio.jsonincludes your home directory) and the Yahoo sessioncrumbare removed, asstockwise mcpalready did;--verbosestill prints the full error on your terminal. The notice before the first cloud request now says that your portfolio may be sent if a tool reads it, not only market data (#127). -
correlateandpcorrpair returns by date instead of by position, so symbols with different holiday calendars (NSE and NYSE) or a seven-day crypto week no longer give a correlation near zero. Two symbols with fewer than 20 shared returns showN/A, andpcorrno longer prints0.000for them (#72). -
riskand the volatility intimeframesannualize with the right number of bars for the asset: 365 a year for crypto, 260 for FX, 252 for stocks, and 288 five-minute bars a day for crypto.returnsannualizes by calendar time and shows—(null in JSON) for spans under a year, so a +100% year reads +100% for crypto and for stocks. Calmar annualizes over the number of returns (#73). -
Pivot points in
support,intraday/botand the stock report come from the last completed daily session, not today’s live bar, a weekly bar or the last five minutes, so the levels no longer move with every tick or change with-p.supportnames the session they come from (#74). -
options oireads put build-up for the underlying: put buying (premium and open interest up) is now bearish and put writing is bullish, and the per-strike tags are coloured that way.--jsongainscalls_sentimentandputs_sentiment(#75). -
longterm,verdictandinsightscompare market cap, cash and insider trades with cut-offs written in US dollars after converting from the quote currency (at rough fixed rates), so the same size scores the same for a rupee and a dollar stock: a ₹1.5 lakh insider buy no longer earns the insider-buying bonus, and ₹5,000 crore is a small cap (#76). -
tax in,tax export in,tax advanceandharvestnow decide in one place which sales count as listed shares or equity funds (Sec. 111A/112A). Debt funds, SGBs, crypto and gold, silver, liquid and international ETFs are left out of all four, so a tax-free SGB redemption no longer raises advance tax and a crypto loss no longer reduces STCG tax (#88). -
tax advanceno longer shows past instalments asPaidwhen no payment is recorded: they areOverdue.--paidtakes dated payments (--paid 2025-06-14:3000, repeated) so Sec. 234C interest follows what was paid by each due date, on shortfalls rounded down to ₹100 (#89). -
harvestoffers losses as the FIFO sale you would actually make: a losing lot behind older lots is sold with them, and a holding whose sale books a net gain is listed as FIFO-blocked instead of a loss. Tax saved comes from the tax estimate with this year’s gains, the shared ₹1.25 lakh exemption is split between candidates, andTotal P&Lshows its real sign (#91). -
harvestno longer counts US holdings as rupees in the Indian harvest: they are listed underother_currency, astax indoes (#92). -
tax in,tax export in,harvestandtax advancenow include the 4% health and education cess in India estimates, so totals and advance-tax instalments are no longer about 4% too low. Surcharge is still left out (#98). -
tax export inapplies the rates and exemption that were in force on each sale date: sales before 23 Jul 2024 are taxed at 15% (STCG) and 10% (LTCG), and the LTCG exemption is ₹1 lakh up to FY 2023-24. A mixed FY 2024-25 shows how much of the taxable gain came from before 23 Jul (#99). -
daemon intradaykeeps running after it settles a session and waits for the next trading day (weekends and exchange holidays skipped), so one process covers every day andstockwise_daemon_upstays 1. Use the new--onceflag for one session and exit (#117). -
/metricsno longer reports a finished day’s daemon positions as open: a settled state showsstockwise_daemon_open_positions 0. The money gauges carry acurrencylabel (INR,USD) andstockwise_daemon_last_update_timestamp_secondsis new (#120). -
fibsalways reads a year of daily bars and reports the last 21, 63 and 126 trading days, so its 1, 3 and 6 month sections no longer show the same levels;-pis now ignored (#137). -
stockwise C -m usand the other single-capital-letter US tickers (T,D,A,W) are read as symbols instead of failing with “unrecognized subcommand”; the lowercase aliases such ascforcomparestill work, andstockwise quote Cis the explicit form (#147). -
serve,tuiandmcpget a new Yahoo session when Yahoo answers HTTP 401 to a quote request, instead of failing until restarted: one fresh handshake (at most once a minute, shared by concurrent requests), then the request is retried once. Yahoo’s cookies are now kept and refreshed by the HTTP client rather than copied by hand (#155). -
serve,tui,mcpand the daemons keep using Alpha Vantage, Massive or Twelve Data after their free-tier request allowance runs out or a request fails: the allowance refills each window (a minute, or 4 h 48 min for Alpha Vantage) and a pause after an error ends after a few minutes, with one notice per pause (#157). -
With Alpha Vantage, Twelve Data or Massive, a quote keeps the provider’s trade date instead of Yahoo’s time of today, so alert checks no longer treat yesterday’s close as a bar for today (#158).
-
-m cacloses the market on New Year’s Day, Good Friday and the other TSX holidays in 2027 (provisional until TMX publishes its list), and the NSE 2027 list includes Good Friday, 26 March (#164). -
mfcommands andMF:holdings use the saved AMFI file, and say which day it was saved, when AMFI answers with a maintenance page or an empty body instead of the NAV data (#166). -
risk,backtestandpracticecompute the Sortino ratio with downside deviation taken over all periods instead of only the losing ones, and measure shortfall against the risk-free rate, so strategies with few down days are no longer scored too low (#28). -
Terminal charts print “Chart dimensions too small” instead of panicking when the terminal width or height is zero or too small to draw them (#30).
-
Importing a spreadsheet with a corrupt cell reference (a column past
XFD) skips that cell instead of allocating gigabytes or crashing (#33). -
importof a demat CAS puts BSE scrip codes such as500325on.BOinstead of.NS, and no longer doubles a.NSor.BOsuffix that casparser already wrote (#34). -
Cached pages and reference files are written through a temp file with its own name per write, so two requests saving the same page at once can no longer corrupt it or fail the rename; a failed write leaves no temp file behind (#36).
-
Several NSE or BSE requests that meet an expired session at once now share one session refresh, so the exchange is no longer treated as having refused us and skipped for 15 minutes (#40).
-
riskshows no Calmar ratio, rather thanNaNorinf, when a price series starts at zero or ends at or below zero, and the maximum drawdown ignores prices until the series first turns positive (#43). -
sim historydraws a one-cell bar for a breakeven day instead of a full-width bar when the best and worst day are both zero (#44). -
daemon intradayreports a position’s return from its total profit, booked half included, over what it cost, so a position that booked Target 1 no longer shows a wrong or negative percentage andsim historystores the right figure (#56). -
score: when a company reports no net income, the Piotroski net income is estimated from trailing EPS times shares, or from profit margin times revenue, and marked “(est.)”. It was profit margin times market cap, which overstated it by the price-to-sales ratio and could cost the cash-flow-above-earnings point (#68). -
score: the Altman Z-score needs all five ratios. With any missing,scoreshows “n/a”, names the missing factors and gives no zone, instead of summing the ratios it had. Guessed inputs (a fixed share of assets as current assets, 70% of equity as retained earnings, ROA in place of EBIT) are removed, and Z’’ is still given when only the sales ratio is missing (#69). -
score: the non-manufacturing Altman Z’’ now uses book equity over total liabilities for its fourth ratio, as the model defines it, and shows its own factor table. It used market cap, which put high price-to-book stocks in the Safe zone whatever their other ratios said (#70). -
score: the Piotroski F-Score counts only the signals that have data. A missing share count, prior year or margin shows “n/a”, earns no point and is left out of the count (for example 5/7 evaluated), and a rating is given only when all nine signals ran. Gross margin is compared with gross margin, or operating margin with operating margin, for both years.--jsonaddsevaluated;ratingis null when not rated (#71). -
tax advance --paidignores a payment dated before the financial year began, since it was made for an earlier year, and says so in the output. -
tax advance --fyfor a year before 2024-25 uses the rates and exemption that applied to each sale date, astax export indoes: STCG of Rs 1,00,000 in FY 2023-24 is now Rs 15,600 with cess, not Rs 20,800. -
tax advanceno longer charges Sec. 234C interest on the last instalment for gains made after 15 March when their tax is paid by 31 March; the 15 March requirement now covers only gains up to that day. -
Alpha Vantage: StockWise now sends at most 4 requests per 4 h 48 min window instead of 5, because two windows can sit back to back and 5 could put 29 requests into one day against the free plan’s 25.
-
levelsandalert: a crypto bar stamped after 21:00 UTC is no longer dated the next day, so the daily bar and the prior-session pivots for crypto no longer shift by a day in the evening. -
daemon intraday: Ctrl+C or SIGTERM on a day that is already settled no longer closes its leftover open rows at stale prices or adds made-up P&L;--onceon a settled day exits at once instead of waiting for the next session; and a saved state with open positions but no entry flag no longer loops printing “Session complete”. -
tax inno longer treats a sale as intraday just because a lot with an estimated purchase date (from a holdings snapshot or sync) is dated the same day; those sales stay in the 111A/112A figures. -
harvestvalues funds you sold in full liketax indoes, so their gains use up the Rs 1.25 lakh exemption it reports instead of being dropped. -
importof a file with dated buys and no sells no longer silently deletes the sales and kept trades an earlier tradebook of the same broker recorded for that symbol; it skips the symbol and asks for--replace. -
trade: a quote of 0 (a halted stock) or an invalid price no longer counts as a price, so a market order cannot passmax_order_valueas worth nothing. With a cap set and no usable price the order is refused with “Cannot estimate the order value”. -
MCP
order_preview: a symbol that StockWise’s quote lookup rewrites (such asHDFCorL&T) is refused with the NSE ticker to use (HDFCBANK,LT), so the preview always prices the instrument thetradecommand will send. For quoted symbols it also tells Windowscmd.exeusers to use double quotes. -
importandportfolio addno longer apply HDFC Bank’s 2019 split a second time to HDFC (or Mindtree) lots restated after the merger: 25 HDFC bought in 2018 stay 42 HDFCBANK shares at the same total cost, and only splits and bonuses after the merger date are applied. -
mf navandmf history: when a download fails, a saved copy is used only if it is at most 7 days old (older is an error that says so), and the output says it is a saved copy and from which day, with astaleentry in--json. Before, any age was accepted and only a line on stderr said so. -
researchandverdict: the NSE shareholding read asks for at most 8 filings, even when many of the listed ones do not load, instead of working through the whole list of dozens. -
researchandverdict: the NSE shareholding read now times out per request (3 seconds each, 8 seconds in all) and keeps the quarters it has read, saying how many in a warning, instead of dropping all of them when a cold start is slow. The verdict no longer loses its shareholding pillar for that. -
levels,deep,technicalandintraday: a symbol’s own market now decides whether today’s session is still running and how many bars make a year, instead of the market you ran the command with (India by default).levels BTC-USDorlevels ^GSPCon a weekday evening no longer builds pivots from today’s half-finished bar and calls them the prior session. -
research,analyzeandscore: the newest quarter and the balance sheet that come from Yahoo’s fundamentals summary are now converted to the share’s currency like the other statements, so Infosys (reported in US dollars, quoted in rupees) no longer shows about -99% quarterly revenue growth or wrong margins. With no exchange rate, those amounts are left out. -
research,scoreandverdict: total debt from the balance sheet now adds the current portion to long-term debt, so a company with nothing due this year but long-term loans no longer looks debt-free. Zero counts as real only when both are reported as zero. -
Reading an expense-ratio spreadsheet no longer reserves memory from the file’s own size claim, and refuses a sheet that inflates past 64 MiB, so a crafted
.xlsxcannot crash the program. -
Yahoo Finance: when the cookie and crumb handshake fails (for example while Yahoo is rate limiting you), StockWise now remembers the failure for 45 seconds instead of repeating up to six requests and their waits for every later call, so a command that makes many fundamentals calls fails fast.
-
Prices in Swiss francs, South Korean won, New Taiwan dollars, Chinese yuan and Brazilian reais are shown with
CHF,₩,NT$,CN¥andR$instead of$(#17, thanks @O1sumitkumar). -
moverslists only rising stocks under gainers and only falling stocks under losers, and says so when a side is empty (#210, thanks @ShahadatTest).
Performance
ask: when the model asks for several tools in one turn, up to 4 of them now run at the same time instead of one after another, and the results still go back in the model’s order. The per-turn tool-call limit counts each call as before (#113).- Release builds strip symbols and use one codegen unit, so the downloaded binary is about 28% smaller (20.5 MB to 14.7 MB on macOS arm64) (#177).
Security
ask,reportand--ai: plainhttp://to an Ollama server on another machine is refused unlessSTOCKWISE_ALLOW_REMOTE_OLLAMA=1is set, because the prompts carry holdings and tax figures.askalso prints a notice whenever the Ollama server is not on this computer, as it already did for cloud providers.
0.8.0 - 2026-11-03
Added
-
portfolio xrayshows your real exposure to each company across direct holdings, mutual funds and ETFs, flags any company above 10% of the portfolio, and splits the portfolio by asset class, market cap and sector (#51). -
scoreshows the Piotroski F-score and the Altman Z-score with every input and formula, and notes when a model does not suit a bank (#50). -
options oiclassifies open-interest changes as long build-up, short covering, short build-up or long unwinding, with PCR and max pain;options chainshows the same tag per strike (#49). -
tax advancelists the four advance-tax instalments with what is due, and estimates Sec. 234C interest on shortfalls (#46). -
portfolio targetsets target weights by stock or sector.rebalance --inflowputs new money only into underweight holdings, and--driftignores small deviations (#47). -
iposhows open, upcoming and recently listed IPOs from NSE, and for one issue: subscription by category, allotment odds, anchor and lead managers, and a scored summary. Grey-market premiums are shown only when news headlines report them, labelled unofficial. -
Faster everyday use (#54, #55):
stockwise SYMBOLwith no command prints a one-screen overview, and barestockwiseprints a quick start.- Short names:
q(quote),d(dashboard),a(analyze),t(technical),c(compare),p(portfolio),w(watch). - Common names resolve to NSE symbols (
SBI→SBIN,L&T→LT, and index names), andquotesuggests close matches for a mistyped symbol.
-
--explainonverdict,technical,scoreandoptions oiadds plain-English notes for beginners (#52). -
harvest --json/--csvand lot-level loss and gain candidates (#21). -
Broker
.xlsxexports import directly, reading every sheet and Excel date cells (#45). -
Eight more read-only MCP and
asktools:verdict,scorecard,insights,events,options_oi,tax_advance,harvestandrebalance. -
Web dashboard: a research workbench, a portfolio switcher and keyboard shortcuts. TUI: a stock inspector and a sort key.
-
--baseaccepts any three-letter currency code.
Changed
- MACD is computed in one pass instead of recomputing the EMAs for every bar, so long histories no longer slow it down (#29). Thanks @immconcon.
Fixed
- Guard against zero or unavailable price in
verdictupside percentage calculation, preventing+inf%output and invalid JSON serialization on unpriced stocks (#35). - Portfolio totals in a base currency other than USD or INR used the wrong side of the FX pair. Conversions now follow Yahoo’s quotation direction (#32). Thanks @AndreIsraelAO.
- The EMA no longer divides by zero when asked for a period of 0.
- Percent returns in
markets, technicals and risk metrics no longer show+inf%when the first price is zero or negative (#59). Thanks @ShahadatTest.
Known issues
Fixed in 0.8.1. Check the linked issues before relying on the numbers involved.
- Importing a second tradebook or holdings file from a broker can replace earlier lots (#83, #85), and same-day trades are booked as capital gains (#84). Back up
portfolio.jsonbefore importing. taxtreats gold, silver, liquid and international ETFs as listed shares (#87).- The SIP projection in
longtermoverstates the corpus (#67). - Statements reported in USD (for example INFY) are shown in ₹ in
researchscorecards (#207).
0.7.0 - 2026-11-01
Added
events <SYMBOL>(ev): a timeline of company announcements from NSE and news feeds, with figures pulled from the text, the market’s reaction against NIFTY 50 or the S&P 500, and upcoming events.insights <SYMBOL>: positive, negative and neutral findings across nine areas (ownership, growth, margins, valuation, balance sheet, analysts, momentum, dividends, news), with NSE shareholding data for India and SEC insider and institutional data for the US.verdict <SYMBOL>: a 0–100 score from six weighted pillars with a BUY-to-SELL label, entry zone, stop-loss and target. These labels are being replaced with neutral scores (#188).
Fixed
- Windows main-thread stack overflow (
thread 'main' has overflowed its stack) by running the CLI entrypoint and Tokio worker threads on an explicit 8 MiB stack and heap-pinning the command dispatch state machine.
0.6.0 - 2026-10-26
Not released separately: these changes first shipped in 0.7.0.
Added
- A documentation site at https://iamsaquib8.github.io/stockwise/ with search, a one-page cheatsheet (a test checks that every command in it parses) and an honest comparison with other tools.
stockwise mcp— a Model Context Protocol server for Claude Desktop, Claude Code, Cursor and other AI assistants, on the official Rust SDK (rmcp). 24 read-only tools:quote,history,technical,risk,search,markets,mf_search,mf_nav,mf_sip,options_chain,options_pcr,options_maxpain,options_payoff,screen,backtest,portfolio_summary,holdings_lots,tax_estimate,calendar,goal_sip,goal_retire,goal_education,alerts_listandwatchlist, each returning the same data as the command’s--json, with a “not financial advice” note and results kept small. Resources: the portfolio, watchlist and alerts. Prompts:review_portfolio,tax_harvest_checkandexplain_option_chain. Stdio by default;--http 127.0.0.1:8788serves Streamable HTTP at/mcp(loopback only, or--allow-remotewith aSTOCKWISE_API_TOKENbearer token, likeserve).--list-toolsprints the tools and their JSON schemas. Behind the default-onmcpcargo feature.- No orders from AI assistants: the MCP server never places, changes or
cancels orders and never reads broker credentials.
--allow-ordersonly addsorder_preview, a dry run that checks an order against the last price and returns thestockwise tradecommand for you to run (with its own preview, value cap and typedyes). stockwise ask "question"— the configured model (local Ollama by default; OpenAI, Anthropic or Gemini whenSTOCKWISE_AI_PROVIDERselects one) calls the same tools through each provider’s tool calling and answers in plain English. Model requests, tool calls (12) and tokens are capped (--max-steps,--max-tokens); the last request runs without tools.--verboseshows each tool call,--jsonprints the transcript. A model without tool calling gets an error naming one that has it.- Findable by AI assistants: the docs site publishes
llms.txt(the pages and the cheatsheet’s commands),llms-full.txtand a Markdown copy of each page;skills/stockwise/SKILL.mdis an Agent Skill for Claude Code and other agents;server.jsondescribes the server for the official MCP registry (io.github.iamsaquib8/stockwise: crates.io, PyPI, GHCR), andpackaging/mcpb/builds a Claude Desktop extension (.mcpb). pipx install stockwise/uvx stockwise— PyPI wheels that carry the prebuilt binary (maturinbindings = "bin", no Python code or dependencies) for manylinux and musllinux x86_64/aarch64, macOS x86_64 and arm64 and Windows x86_64, plus an sdist that builds from source. Built on every tag; uploaded with PyPI trusted publishing once the maintainer enables it..deband.rpmrelease assets for x86_64 and arm64 (stockwise_amd64.deb,stockwise-x86_64.rpm, …), with man pages, bash/ zsh/fish completions and docs, and.sha256files. Version-less names, soreleases/latest/download/...links stay stable;sudo dnf install <URL>works directly.- Termux on Android: an
aarch64-linux-androidrelease archive (NDK, API 24), picked byinstall.shon Termux (installs to$PREFIX/bin) and bycargo binstall; and a ready-to-submit termux-packages recipe inpackaging/termux/. - nixpkgs: a ready-to-submit
packaging/nixpkgs/package.nix(buildRustPackagewithcargoHash, man pages, completions, version check, update script), built in CI with the flake’s nixpkgs. - Docker Hub mirror: release tags copy the multi-arch GHCR image to
docker.io/iamsaquib8/stockwisewith its description, when Docker Hub credentials are configured. Both registries now carry an OCI description on the multi-arch index. - Download stats without telemetry: a nightly workflow archives crates.io,
GitHub release (per asset), GHCR, Docker Hub, PyPI, Homebrew, AUR and GitHub
traffic/referrer numbers to the
statsbranch;scripts/download-stats.py summaryprints them. Nothing is collected from users. - An Install page listing every install path, what it includes and how it updates.
Changed
- Mutual funds and Sovereign Gold Bonds are valued in
portfolio(table,--json,--csv),dashboard,tui,serve/ the web dashboard,wealth,rebalance,harvest,tax,report portfolioand the long-term daemon.MF:<AMFI code>andMF:<ISIN>(growth/payout or IDCW-reinvestment ISIN) use AMFI’s latest end-of-day NAV, shown as “NAV as of <date>”; SGBs (NSE symbol or tranche ISIN) use NSE’s last price, or one gram of gold at spot labelled “estimated” when NSE refuses (the 2.5% interest is left out, and said so). An unknown code stays N/A with a note, never 0.portfolio --jsonrows gainname,price_sourceandnav_date, and the report anoteslist.watchandalertsee fund NAVs too,portfolio selldefaults to the NAV, andMF:symbols are no longer sent to Yahoo. tax incounts equity-oriented mutual funds (by AMFI category) at the listed-share rates and names them; debt and other funds and SGBs are left out of the estimate with the rules that apply to them (equity_fundsandother_rulesin--json), instead of silently getting equity rates.- AI sections (
report,--ai) give neutral, educational analysis — signals, risks, what to watch — instead of BUY/HOLD/SELL verdicts, picks or allocation advice, in line with SEBI’s adviser, research-analyst and finfluencer rules. Section titles say “notes” and “comparison” rather than “verdict”, “memo” or “brief”, and every AI section ends with a one-line disclaimer. Cache keys include a prompt version, so answers cached under the old wording are not shown again.
Fixed
portfolio add MF:120503,watch addandalert addstoredMF:120503.NS(-USD,.L, … in other markets), which nothing could price.PREFIX:IDsymbols are now kept as typed in every market, and symbols stored that way by older versions are repaired when the portfolio, watchlist and alerts load (a holding that then appears twice is merged).MF:alerts follow Indian market hours instead of US ones.portfolio actionsskips funds and SGBs instead of asking Yahoo for them;portfolio benchmarkandtax exporthandle funds stored asMF:<ISIN>;portfolio sellwithout a price refuses an SGB valued only by its gold estimate.report portfoliono longer gives the AI a price of 0 for holdings without a live price, andexport portfolio/export watchlistleave a missing price empty instead of writing 0.- The rule-based insights in
analyzewere titled “AI Insights”; they are not AI and are now titled “Insights”. - The Docker image carries the
io.modelcontextprotocol.server.namelabel the MCP registry checks. - Prebuilt Linux binaries (archives,
install.sh,cargo binstall, Homebrew on Linux, AUR) required glibc 2.39 and failed on Ubuntu 22.04, Debian 12 and RHEL 9 with “version `GLIBC_2.39’ not found”. They are now built on Ubuntu 22.04 and need glibc 2.34 or newer.
0.5.0 - 2026-10-25
Planning, reporting and more markets: tax exports, benchmarks and goal planning, technical alerts and a results calendar, NSE/BSE data, more exchanges and commodities, a web dashboard, a simulator you can play, broker sync with a read-only self-test, and WASM strategy plugins. The minimum Rust version is now 1.97. Command-line forms from 0.4 keep working.
Added
stockwise tax export [in|us] [--fy 2025-26] [--out FILE] [--json]— the capital-gains schedule of a tax year’s realized sales. India: one row per lot sold, laid out for ITR Schedule CG / Schedule 112A (section 111A/112A, ISIN from NSE’s equity list or AMFI, scrip, quantity, sale value, cost, days held, gain), then the summary — STCG, LTCG, set-off, the ₹1.25 lakh exemption, estimated tax, carry-forward. US: a Form 8949 worksheet (Part I / Part II) with Schedule D totals and the $3,000 loss deduction. Labelled an estimate to verify against your broker’s tax P&L; flags grandfathered (pre-Feb-2018) shares, pre-23-Jul-2024 sales and estimated purchase dates.stockwise portfolio benchmark [NIFTY|SENSEX|SP500|symbol] [-p 1y]— the portfolio’s time-weighted return against an index, rebuilt from the lots held at each close; alpha, beta, tracking error, information ratio and correlation from daily returns; attribution by holding and by sector (Carino-linked, so contributions add up to the totals); a growth-of-100 chart; other currencies converted at daily exchange rates; holdings with partial history flagged.--json/--csv.stockwise goal sip|retire|education— goal planner: the monthly SIP for a target corpus (with a yearly step-up and existing savings), the retirement corpus for today’s monthly expenses and the SIP that builds it, and an education cost grown by inflation. Amounts in Indian units (50k,25L,1cr), results in lakhs and crores;--json. New Planning help group.stockwise trade selftest [--broker NAME] [--redact-amounts] [--json]— a strictly read-only check of a broker integration against your own account: login / session, profile, holdings, positions, order book, trade book, GTT list, exact instrument lookup for RELIANCE, TCS and NIFTYBEES, a 1-share LIMIT buy run through every order check without being sent, and response-shape checks (missing and new field names, never values). Prints a redacted Markdown report for a GitHub issue: no credentials or tokens, the account id cut to its last 2 characters, e-mails and long numbers masked in error messages, amounts hidden with--redact-amounts. The session is wrapped so that every order, GTT or cancel call fails before reaching the broker. See Help verify a broker.- Community testing kit: a “Broker test report” issue template, a verification-status table per broker in docs/brokers.md, and the criteria for dropping the experimental label (3 independent self-test reports plus one small live order a tester chose to place themselves).
stockwise trade sync [--since DATE] [--apply] [--notify] [--json]— pulls the broker’s executed trades into the lot-based portfolio: delivery buys become dated lots (fill date, average fill price, broker order id), sells come out FIFO as realized sales. Previews by default;--applywrites. Idempotent: applied fills are remembered by broker, order and trade id, so re-running, or syncing the rest of a partly filled order, never double-counts. Intraday, margin and F&O fills are skipped; sells wait while a split or bonus is not yet applied to the lots; open and partly filled orders are listed; quantities are compared with the broker’s holdings. Dhan reads older fills with--since; the other brokers return today’s trades only.trade gtt listshows what changed since the last look (triggered, cancelled, expired, no longer listed), with--notifyto send the changes to your notification channels and--json.trade sync --applytracks the same changes.Brokertrait:profile,trades(trade book), raw read-onlyrowsand per-endpoint response shapes for all five brokers; order-book rows now carry filled quantity, average price and product. Experimental on Zerodha, Upstox, Dhan and Fyers like the rest of those integrations — the new endpoints were built from the brokers’ public docs and tested against fixtures only.- Portfolio lots and realized sales record the broker order id they came
from (
order_id); the portfolio file keeps the list of synced fills (broker_fills). Older files load unchanged. - Practice mode for the paper-trading simulator (docs/simulator.md):
sim replay: trade a past market day by day with the future hidden. Six built-in scenarios (covid-crash-2020,gfc-2008,adani-2023,dotcom-2000,bull-run-2021,rate-hikes-2022), your own window (--from --to --symbols) or a scenario file. Daily history is fetched once and every view,--jsonincluded, stops at the replay date. Orders fill at the next open with the backtest cost models; stops and targets are checked on each day’s range.sim challenge: goal-based challenges with hard and soft rules — beat the index, keep drawdown under 10%, no position above 20%, always set a stop-loss, SIP discipline vs timing, survive the crash — over a replay or over live paper sessions. Rules are data (TOML).- A 0–100 score and grade from risk-adjusted return against the benchmark
(Sharpe, Sortino), drawdown control, discipline and diversification —
never raw return alone — plus badges and streaks (
sim profile). sim card [--svg FILE]: a shareable text or SVG result card. Paper money only; every scorecard and card carries the disclaimer.
- Web dashboard at
/ofstockwise serve: indices, watchlist, portfolio (P&L, XIRR, allocation, INR/USD totals, sortable columns), alerts, symbol search and a price chart with period buttons and a keyboard-readable crosshair. Refreshes every 30 seconds while visible; works at phone width; follows the system light/dark theme; amounts in lakhs and crores for INR. Plain HTML/CSS/JavaScript compiled into the binary — no build step or CDN. Read-only. See docs/server.md. stockwise serve --openopens the dashboard in your browser; the startup log prints its address.- Expense ratios for Indian mutual funds from AMFI’s monthly TER disclosure:
mf navandmf historyshow the plan’s total expense ratio (and the other plan’s),mf screenadds a TER column,--sort ter(lowest first) and--max-ter PERCENT. The disclosure is downloaded once a day (~3 MB spreadsheet export) and cached incache/amfi_ter.json;--jsonadds aterobject with the April 2026 breakdown (base expense ratio, brokerage, transaction costs, statutory levies). When AMFI can’t be reached, NAVs and returns still print with a note. - BSE options:
options chain|pcr|maxpain SENSEX(alsoBANKEX,SENSEX50,^BSESN) and BSE stock options asSYMBOL.BO, from BSE’s public derivatives API with one session, spaced calls, a one-minute cache and a clear error when BSE refuses scripted requests. NSE indices and stocks stay on NSE,-m uson Yahoo. - Lot sizes in option chains: inferred from NSE/BSE order-book quantities
(always whole lots), 100 for US contracts;
options chainshows them and addslot_sizeto--json. options payoff SYMBOL— a strategy builder on the live chain. Legs as--leg "buy call 24500" --leg "sell call 24800"(atm±Nstrikes and@PRICEoverrides too) or presets--strategy bull-call|bear-put|straddle| strangle|iron-condor|butterfly|covered-call --width W. Shows each leg’s price (bid/ask mid, else last trade, flagged), net debit or credit, max profit and loss (or unlimited), breakevens, probability of profit from IV (lognormal), position greeks, and a braille P/L chart at expiry with an optional--todaycurve (Black-Scholes). Sized by--lotsand the lot size;--jsonfor scripts. Read-only — it never places orders.- Technical alerts:
alert add SYMBOL rsi-below|rsi-above LEVEL [--period N],cross-above-sma|cross-below-sma|cross-above-ema|cross-below-ema DAYS,breakout-high|breakdown-low DAYS,change-above|change-below PCT,volume-spike MULTIPLE [--period N]andresults-in DAYS. They are evaluated on daily bars (one chart request per symbol per check, updated with the live quote) byalert check,alert watch,dashboard, thetui,serve(/api/alerts) anddaemon longterm; crosses fire only on the crossing session, andalert watchnotifies once per trading day.alert listshows each condition in words. See docs/commands.md. stockwise calendar [SYMBOLS] [--days 30] [--holdings|--watchlist]— upcoming results, ex-dividend and payment dates, splits and bonus issues for holdings and the watchlist, sorted by date with today and the next 7 days marked;--json/--csv. Yahoo Finance supplies earnings and dividend dates for US and Indian stocks; for.NS/.BOstocks NSE board meetings and corporate actions add filed results dates, splits and bonus issues (one polite session per run, cached for a day, Yahoo-only when NSE refuses).- Data providers that read the exchanges’ own websites, no API key needed:
STOCKWISE_DATA_PROVIDER=nse(ordata_provider = "nse"),bse, andexchange(NSE for.NSand NSE indices, BSE for.BO, Yahoo for the rest). NSE serves quotes with circuit limits and delivery %, NSE index quotes, today’s intraday bars, up to five years of daily bars and search; BSE serves quotes, intraday and daily bars and search by scrip id, code or name. These are unofficial website endpoints: StockWise keeps one session per site, at most three requests a second with jitter, retries timeouts and 5xx with backoff, caches answers, and stops asking (with one notice) as soon as a site refuses — Yahoo answers instead. See docs/data-providers.md and docs/exchange-responses.md. quoteshows Circuit Limits and Delivery when NSE answered;--jsonaddsdeliveryPercent,lowerCircuit,upperCircuit,--csvaddsdelivery_percent,lower_circuit,upper_circuit(empty otherwise).movers,heatmapandscreentake--universe nifty50|niftynext50|nifty100|banknifty|niftyitto scan an NSE index’s current members (from NSE, whichever provider is set) instead of the built-in 30 large caps, which stay as the offline fallback.doctorchecks NSE and BSE separately inexchangemode.- Global exchanges from one market table:
-m uk,de,jp,hk,sg,ca,auresolve bare tickers with the exchange’s Yahoo suffix (-m uk VOD→VOD.L,-m jp 7203→7203.T,-m hk 5→0005.HK). Each exchange brings its currency (London prices in pence print as118.20p;£,€,¥,HK$,S$,C$,A$), benchmark indices, sector indices or ETFs where Yahoo has them (Japan, Hong Kong, Canada, Australia), a large-cap universe formovers/screen, trading hours with lunch breaks and half days, and 2026–27 holiday tables from the exchanges’ own calendars (weekday fallback with a warning for years not bundled).taxnames listings it has no rules for (rules exist for India, the US and the UK). See docs/markets.md. markets --global: one row per exchange’s main index — NIFTY 50, S&P 500, FTSE 100, DAX, Nikkei 225, Hang Seng, Straits Times, S&P/TSX, S&P/ASX 200 — with whether it is open now and its local time.marketsshows the India 10-year G-sec yield (CCIL, RBI fallback;IN10Yin--json/--csv).stockwise commodity [spot|futures|etfs|sgb]and-m commodity: gold and silver in ₹ per g / 10 g / kg and USD per ounce (COMEX front month at USD/INR, before import duty and GST — clearly noted), COMEX futures with the front contract month (MCX has no free feed), NSE gold and silver ETFs, and Sovereign Gold Bonds with price, premium to gold spot, 2.5% interest yield and maturity from NSE’s SGB list — or, when NSE refuses, the outstanding tranches without prices. With-m commodity,GOLD/SILVERresolve toGC=F/SI=Fforhistory,chart,technicaland alerts.--json/--csv.stockwise bonds [yields|list|calc]: T-bill, G-sec and SDL benchmark yields from CCIL’s tenor-wise indicative yields (RBI’s benchmarks as fallback; cached 6 hours), RBI’s list of outstanding Government of India securities, and a calculator for price ↔ yield to maturity, accrued interest, dirty price, duration and T-bill discount yields, looking securities up by NSE symbol (718GS2033), name or ISIN. Individual bond prices are not shown: no public source publishes them. See docs/commands.md.- WASM strategy plugins (experimental, cargo feature
wasm-plugins, off by default):backtest SYMBOL -s wasm:path/to/strategy.wasmruns a WebAssembly strategy in single, portfolio and walk-forward backtests, with-P name=valueand grid tuning, andintraday -s wasm:...uses it as an extra vote. A plugin exports a small versioned ABI (stockwise_abi_version,stockwise_on_bar, optionalstockwise_meta/stockwise_init) and runs in the wasmi interpreter with no imports (no WASI, files or network), a 64 MB memory cap and a fuel budget per call: a trap, an endless loop or bad output is an error naming the bar, never a hang or a crash.backtest strategieslists.wasmplugins in the strategies folder with their name and ABI version. Example plugin (RSI mean reversion, identical to the built-inrsi) inexamples/wasm-strategy-rsi/; ABI and limits in docs/backtesting.md (“WASM plugins”).
Changed
- Minimum supported Rust version is now 1.97 (was 1.88). StockWise supports the latest stable Rust and the two releases before it. Prebuilt binaries, Docker and Nix are unaffected.
alert list --json/--csvaddsperiodanddescription;alert check --json/--csvaddsperiod,description,value,referenceand the statusno_data(new CSV columns come after the old ones). Existingalerts.jsonfiles load unchanged. Quotes carry Yahoo’sregularMarketTime.- In the Indian market a bare BSE scrip code resolves to BSE:
quote 500325is500325.BO(it used to become the invalid500325.NS).
Security
servesends a strict Content-Security-Policy (no inline code, same-origin only, Trusted Types),X-Frame-Options: DENY,Referrer-Policy: no-referrerand same-origin COOP/CORP headers on every response, and answers 403 to/api/*and/metricsrequests a browser marks as cross-origin (Sec-Fetch-Site). There is still no CORS. WithSTOCKWISE_API_TOKENset, the dashboard asks for the token and keeps it in session storage, sending it only as anAuthorizationheader.
0.4.0 - 2026-10-21
Not released separately: these changes first shipped in 0.5.0.
Everything on the 0.3 roadmap: new markets and asset classes, a lot-based portfolio with Indian tax rules, more brokers, a backtesting engine, a terminal dashboard and a local API, packaging for every platform, and Hindi. Command-line forms from 0.3 keep working.
Added
stockwise tui— a full-screen, read-only live dashboard: indices, watchlist, portfolio P&L, triggered alerts and a chart of the selected symbol (periods 1d–5y), with symbol search to add to the watchlist. Refresh interval with-i(default 30s); works at 80×24 and degrades on smaller terminals; honoursNO_COLOR. See docs/tui.md.stockwise serve— a read-only JSON API (/api/quote,/api/history/{symbol},/api/markets,/api/search,/api/portfolio,/api/watchlist,/api/alerts),/healthz, and Prometheus/metrics(request counts and latency, Yahoo errors, cache hits, and the intraday daemon’s open paper positions, day P&L and kill switch). Loopback only unless--allow-remotewith aSTOCKWISE_API_TOKENbearer token. See docs/server.md.- Cargo features
tuiandserver(both default);--no-default-featuresbuilds without ratatui and axum. --jsonon 17 more commands:portfolio,watch,alert list/check,technical,risk,backtest,screen,movers,sectors,compare,correlate,sip,whatif,returns,dividends,taxandsim history, alongsidequote,history,marketsandsearch. Keys are snake_case; shapes are documented in docs/commands.md.--csv(RFC 4180, header row first) for tables:portfolio,watch,alert list/check,movers,screen,sectors,historybars,backtesttrades,compare,correlate,returns,tax,quote,marketsandsearch.--jsonand--csvare mutually exclusive.- Config file (
config.tomlin the platform config directory, orSTOCKWISE_CONFIG) formarket,ai,model,ollama_host,redis_url,home, and a default-pper command under[periods]. Precedence: flag > environment variable > config file > default, and--helpshows defaults from the file. stockwise config [show],config pathandconfig init [--force].--no-aiturns the AI section off whenSTOCKWISE_AIor the config file turn it on.doctorreports the config file and whether it parsed.- More brokers (experimental — untested against a live account): Zerodha
Kite Connect, Upstox, Dhan and Fyers via
trade --broker <name>(orSTOCKWISE_BROKER): holdings (synced intoportfolio), positions, order book, and orders. Built from each broker’s public API docs and tested against a local mock server. They stay read-only until you add"enable_orders": trueto the broker’s config file.trade loginhandles the daily browser login (Kite, Upstox, Fyers) or a pasted Dhan token. - Stop-loss and GTT orders:
trade buy|sell ... --trigger T [--limit P]places SL-M / SL orders;trade gtt buy|sell|list|cancelmanages single-leg GTTs (Angel One, Kite, Dhan Forever Orders, Fyers). Triggers are checked against the side, the limit and the last price before anything is sent. These are experimental on Angel One too and need"enable_orders": true. - OS keyring for broker secrets (macOS Keychain, Windows Credential
Manager, Secret Service). Secrets in an existing
angel_config.jsonmove into the keyring automatically;trade config --keyringdoes it now. Without a keyring (headless Linux) the owner-only file is used;STOCKWISE_KEYRING=offforces that.doctorshows where each broker’s secrets live. import groww,import upstox, andimport cas(CAMS / KFintech / NSDL / CDSL statements as casparser JSON or CSV). Mutual funds are stored asMF:<AMFI code>. Groww’s ISIN-only exports are mapped to NSE tickers.- Trading costs in backtests, on by default:
--costs in-delivery(brokerage, STT, exchange and SEBI fees, GST, stamp duty, DP charge),in-intraday,us,crypto,fx, ornone, plus--slippage-bpsand--brokerage. Reports show net and gross returns and the money paid in costs. backtest portfolio SYMBOLS...— one strategy across several stocks with--weights equal|inverse-vol|0.5,0.3,...and--rebalance monthly|quarterly; combined equity curve, CAGR, drawdown, Sharpe/Sortino, exposure and per-symbol contribution.backtest walkforward SYMBOL --train 1y --test 3mo— tunes parameters on rolling train windows, reports only out-of-sample results, and flags likely overfitting.- Strategy files: entry/exit rules in TOML over the built-in indicators
(
and/or/not, crossovers, arithmetic, stop-loss and take-profit, parameters and a walk-forward grid). Load with-s NAMEfrom astrategies/folder next to the config file, or-s file:PATH; override parameters with-P name=value. The six built-ins ship as files inexamples/strategies/, with two more examples. backtest strategieslists and checks strategy files.intraday -s STRATEGYadds a strategy file as an extra signal.--jsonon every form ofbacktest(and--csvfor their trades); thebacktest --jsonshape changed with the new engine (see docs/backtesting.md).- Docs: docs/backtesting.md.
stockwise manprints thestockwise.1man page;stockwise man --dir DIRwrites it plus onestockwise-<command>.1page per command. The pages are generated from the CLI definition and ship in every release archive underman/.- Docker image
ghcr.io/iamsaquib8/stockwisefor linux/amd64 and linux/arm64, published on every release. It runs as a non-root user and keeps data in the/datavolume. - Nix flake:
nix run github:iamsaquib8/stockwise,nix profile install, andnix developfor a dev shell. Installs man pages and shell completions. - Package manifests in
packaging/for Homebrew, Scoop, winget and the AUR (stockwise-bin), filled in from each release’s checksums bypackaging/render.sh. Releases push the formula to theiamsaquib8/homebrew-taptap when aHOMEBREW_TAP_TOKENsecret is set, and attachstockwise.jsonsoscoop install <release URL>works. mf— Indian mutual funds from AMFI’s public NAV file:mf search,mf nav,mf history(NAV chart, 1M–10Y trailing returns, since-inception CAGR, max drawdown) andmf sip(monthly SIP with XIRR on the actual purchase dates). NAV history comes from api.mfapi.in; both are cached in the data directory for 12 hours.--jsonon every subcommand.mf screenranks a category’s growth-option schemes by 1Y/3Y/5Y return (baremf screenlists categories). Expense ratios are not in AMFI’s feed, so they are not shown for Indian schemes.mf overlap A B— shared top holdings, holdings and sector overlap, and expense ratios for funds Yahoo Finance has holdings for (mainly US ETFs and mutual funds). Indian schemes and NSE ETFs report “no holdings data”.options chain(OI, change in OI, volume, IV, delta, gamma, theta, vega, rho),options pcr(put/call ratio and open-interest walls) andoptions maxpain. Indian symbols use NSE’s option chain (index options and F&O stocks), US symbols (-m us) use Yahoo Finance. Black-Scholes greeks with an implied-volatility solver, valued at the data timestamp.stockwise alert watch [--interval 60] [--once]— checks alerts while each alert’s market is open and announces every trigger once (re-arms when the price moves back, at most once a day; remembered across restarts).- Notifications for
alert watchand the intraday daemon: Telegram, Slack and Discord webhooks, email over SMTP (rustls), and desktop pop-ups with thedesktop-notifybuild feature. Configured withSTOCKWISE_*environment variables;stockwise notifyshows them andstockwise notify testsends a test message. Secrets are never printed or sent anywhere but their own endpoint. - Exchange clock: IST for NSE and US Eastern (with daylight saving) for NYSE, with the NSE 2026 and NYSE 2026–2028 holiday calendars and NYSE early closes.
sim settle --nowsettles today’s session before the close.- Crypto and forex markets.
-m cryptoresolves bare coins (BTC→BTC-USD;--quote-currency inr/STOCKWISE_QUOTE_CURRENCYforBTC-INR) and-m fxresolves pairs (USDINR,usd/inr→USDINR=X). Prices show 4 decimals for FX and up to 8 for low-priced coins;quotenotes 24/7 (crypto) and weekday-only (FX) trading.markets --crypto --fxadds top coins and major pairs. Session-, sector- and fundamentals-based commands (sectors,screen,intraday,daemon, …) explain that they need a stock market instead of running on coins. - Data providers.
STOCKWISE_DATA_PROVIDER=alphavantage|massive|twelvedatawith the provider’s API key routes quotes, daily history and search through Alpha Vantage, Massive (formerly Polygon.io) or Twelve Data. Yahoo fills the fields and symbols a provider lacks and takes over on errors or exhausted free tiers.doctorshows which provider answered;quotenames it, andquote --jsonaddsdataSource. See docs/data-providers.md. - Cloud AI, opt-in.
STOCKWISE_AI_PROVIDER=openai|anthropic|geminiwithOPENAI_API_KEY/ANTHROPIC_API_KEY/GEMINI_API_KEYuses a hosted model forreportand--ai(same prompts as Ollama, which stays the default). The first request of a run prints a notice that data is being sent;doctorshows provider and model, never the key.STOCKWISE_MODELoverrides the default model (gpt-6.1-sol,claude-opus-5-5,gemini-3.8-flash). See docs/ai.md. - Hindi (partial).
--lang hi,STOCKWISE_LANG=hi, or ahi_*locale translates help group titles, the main command descriptions,quote,markets,dashboard,portfolio,search,doctorand common errors. Lakh/crore amounts read₹16.27 लाख करोड़.--jsonoutput is unchanged. doctorshows the active language and where it came from.- Lot-level holdings. Every purchase is a lot with its own quantity, price,
date and source.
portfolio add ... --date YYYY-MM-DDrecords the real purchase date;portfolio lots SYMBOLshows a holding’s lots, sales and dividends, and--lot N --datecorrects a purchase date. portfolio sell SYMBOL SHARES [PRICE] [--date]sells oldest lots first (FIFO) and keeps the realized P&L fortax.- Portfolio XIRR:
portfolioshows a money-weighted annual return per holding and for the whole portfolio (including closed positions and dividends). portfolio actions [SYMBOL] [--apply]lists splits, bonus issues and dividends since you bought (from Yahoo) and, with--apply, adjusts lots and records dividends. Idempotent; nothing changes without--apply.divcalshows the dividends received.- Named portfolios: global
--portfolio NAME/STOCKWISE_PORTFOLIO, stored asportfolios/NAME.jsonwith their own wealth history;portfolio list. - Mixed-currency portfolios: INR and USD holdings are totalled in one currency
at the live
USDINR=Xrate (portfolio --base inr|usd; default: the market’s currency). Also indashboard,wealth,rebalanceand the long-term daemon. importreads a purchase/trade date column and a buy/sell column, so a lot list or a tradebook (e.g. Zerodha Console) imports with real dates, realized sales and splits applied as they happened. A holding that already has lots from elsewhere is only rebuilt withimport --replace.
Changed
backtestwith too little history is an error (exit 1) instead of a message with exit 0.moversleaves out stocks without a change today instead of ranking them at 0%;correlateshows N/A instead of 0 when two series can’t be compared.watchlists symbols that have no live quote (as N/A) instead of hiding them;dividendserrors when there is no live price instead of dividing by zero.- An invalid config file stops every command except
config,doctorandcompletions, with an error naming the file and the key. quote,historyandmarketsgather their data through a shared layer (src/views.rs) that the TUI and the server also use, so--jsonand the HTTP API return the same shapes.portfolio --json/--csvandtax --json/--csvfollow the lot-based portfolio: holdings carryxirr_percent, totals are in the base currency (--base), and holdings without an exchange rate are listed inunconverted.tax --jsonreports this tax year’s sales, each open holding’s short- and long-term gain, and the estimate with and without selling everything today.- The config file also covers
lang,quote_currency,portfolio,ai_provider,data_providerand a[notify]table for notification channels (API keys stay in environment variables).config showanddoctorwarn when the file holds secrets and other users can read it. optionsis now a command group.stockwise options SYMBOLstill shows expected moves, also available asoptions moves SYMBOL.mfandoptionsare listed under a new “Funds & F&O” help group.quote,marketsanddashboardshowN/Afor a missing price or range instead of0.00.- AI section titles name the provider (
AI Analysis (Ollama)) instead of always saying Ollama. - EUR, GBP and JPY amounts show
€,£and¥instead of$. sim settlereplays each session’s own 5-minute bars (falling back to hourly, then daily bars for old sessions): the stop or target that was hit first decides each trade, otherwise it exits at the 15:15 bar. It used to settle every session, from any date, at today’s price. Today’s session is refused until the market closes.sim startrefuses to open a session when the market is closed for the day (weekend, holiday, or after the close).daemon intradayfollows the exchange clock instead of the machine’s time zone, skips exchange holidays, and with-m ustrades NYSE hours.- Intraday plans (
intraday,sim start, the daemon) never need more than the capital in total, and the daemon’s 30% per-position limit is applied. tax in|us|ukclassifies each lot by its own purchase date, shows realized gains (sales this tax year) separately from unrealized ones, and applies the set-off rules: in India a short-term loss offsets STCG then LTCG, a long-term loss only LTCG, before the ₹1.25 lakh exemption; losses left over are shown as carry forward. Holdings in another currency are listed but not included. UK CGT uses the 24% higher rate (was 20%).portfolio.jsonhas a new format (version 2). Older files are upgraded on first load — each holding becomes one lot dated when it was added, flagged as an estimated date — and the original is kept once asportfolio.json.bak. StockWise 0.3.0 can still read the new file.importwithout dates andtrade holdingskeep existing lots and only adjust the quantity, instead of overwriting the average cost.portfolio listnow lists your portfolios; useportfolioorportfolio showfor holdings.importexits with an error when a file has no usable rows, an unrecognized date, or nothing it could apply.portfolio sell,importandtrade holdingsrefuse to match shares while a split or bonus isn’t applied to your lots yet, and point toportfolio actions --apply.wealthsnapshots are always in the market’s currency.- Every order type and broker goes through one safety flow
(
place_live_order): exact instrument, price checks, preview,max_order_value,--dry-run, typedyes/--yes. Angel One MARKET and LIMIT orders behave as in 0.3. tradetables show N/A instead of ₹0.00 when the broker sends no price.docs/angel-one.mdis nowdocs/brokers.md.
Fixed
options(expected moves) treated a missing price as 0; it now reports an error.daemon intradayexited on the first network error, losing the day’s paper positions. Errors are now logged and retried with backoff; the state is saved todaemon_state.json(daemon_state_us.jsonfor-m us) every tick and resumed after a restart.- Ctrl+C in
daemon intradaynow squares off at the last prices, records the day in the simulator history and exits 0, as the banner promised. - Positions closed at the second target were not counted by the 3% daily loss kill switch; the kill switch also no longer re-fires every tick.
- The daemon kept waiting forever after a day with no qualified trades.
- Daemon P&L right after a first-target partial booking counted the booked half at the current price instead of the target price.
- Intraday plans could put a long’s stop above the entry (support above the price) or a short’s below it; such levels are now ignored.
- The daemon monitors positions from the moment it enters them, not only from 15 minutes after the open, and ignores zero quotes.
- Tax holding periods used the day a holding was added to StockWise, and adding shares kept the first purchase’s date for all of them.
- Portfolio totals added INR and USD amounts together.
portfolio sell,lots,removeandactionsfind a holding saved as typed (e.g.AAPLwhile the market is India).- Angel One P&L and position quantities read the documented fields
(
profitandloss,netqty); they showed 0 before. - Backtests fill at the next bar’s open instead of the signal bar’s close,
which used a price not yet known when the signal fired.
--fill closerestores the old behaviour. - Backtests trade whole shares from a starting capital (
--capital, default 100,000), and Sharpe/Sortino are annualised from daily returns instead of a per-trade ratio. Max drawdown uses the daily equity curve. - Backtest bars with any missing price are dropped together; before, a gap in one series could misalign opens, highs, lows and closes.
0.3.0 - 2026-10-21
Usability and safety release. Command-line forms from 0.2 keep working.
Added
stockwise doctor— checks the data directory, Yahoo reachability, Redis, the Ollama model, and broker config in one screen.stockwise completions <shell>for bash, zsh, fish, PowerShell and elvish.--jsonoutput forquote,history,marketsandsearch.- Grouped top-level
--helpwith examples. trade buy/sell/limit --dry-runand--yes; optionalmax_order_valuecap.- Environment variables:
STOCKWISE_MARKET,STOCKWISE_HOME,STOCKWISE_AI,STOCKWISE_REDIS_URL, and the standardOLLAMA_HOST. install.shone-line installer,cargo binstallsupport, SHA-256 checksums and a Linux ARM64 binary on every release.- Dashboard first-run hints when you have no portfolio, watchlist or alerts.
Changed
- Live orders need confirmation. Every order resolves the exact NSE
-EQinstrument, prints a preview, and requires typingyes(or--yes). - Local AI is opt-in (
--ai/STOCKWISE_AI=1). It made analysis commands take 40–60 seconds.reportstill always uses AI. - Actions are real subcommands and value lists (
portfolio,watch,alert,sim,trade,screen,backtest -s,tax,import,export,daemon): typos are rejected with suggestions, and help documents every argument.portfolio,watchandalertshow their list when run bare. - Errors go to stderr with exit code 1 (unknown symbol, no data, bad file); invalid arguments exit 2. Previously many printed a message and exited 0.
- Not-found errors name the symbol and suggest
-m usfor US tickers. forecastandstoplossaccept-plike the other commands.sim resetasks for confirmation and keeps a timestamped backup.- Local data files are written atomically, and parse errors name the file.
- Redis has 300/500 ms timeouts and no longer prints a banner on every run.
Fixed
M&Mand other symbols/searches containing&were cut off (M&Mshowed Macy’s); all request URLs are now percent-encoded.risk,forecast,optionsanddeepannualized weekly or monthly bars as if they were daily (volatility and Sharpe about 2.2x too high with-p 1y).- SIP “annualized” return was total return divided by years; it is now XIRR.
- A missing quote was valued at 0: portfolio showed -100%,
taxbooked a full loss,harvestsuggested selling,wealthsaved a fake crash, and alerts fired. These holdings now show N/A and are left out. - Re-running
importortrade holdingsdoubled positions and reset dates; broker symbols likeRELIANCE-EQbecameRELIANCE-EQ.NS. - Angel One credentials were saved world-readable; they are now owner-only
(0600) and existing files are tightened.
trade setupno longer suggests passing secrets as command-line arguments. - Broker holdings/positions/order-book failures showed “No holdings found” instead of an error; broker calls now have timeouts.
- Index, FX and crypto symbols (
^NSEI,USDINR=X,BTC-USD) got.NSappended in the Indian market. - The Yahoo session token is validated; a rate-limit page used to be stored
as the token and break every later request. Retries honour
Retry-After. - Volume bars drew the same glyph on every row instead of stacking.
--helpsaid the default market was US (it is India).screen bluechipused a $100B threshold for INR market caps.dashboardlabelled indices by position, not symbol.taxprinted a fixed “FY 2025-26”; it now shows the current tax year.TATAMOTORS.NS(no longer quoted) replaced withTMPV.NSin the universe.- Piping output into
headno longer panics.
0.2.0 - 2026-06-24
First public release — published to crates.io with prebuilt binaries.
Added
- Packaging & distribution: published to crates.io (
cargo install stockwise), prebuilt binaries for macOS (x86_64/arm64), Linux, and Windows on each release. - CI: GitHub Actions running
rustfmt,clippy -D warnings, and the full test suite (213 tests) on Linux/macOS/Windows plus an MSRV (1.88) job. - Project docs:
LICENSE(MIT),DISCLAIMER.md,ROADMAP.md,CHANGELOG.md,CONTRIBUTING.md,SECURITY.md,CODE_OF_CONDUCT.md, and issue/PR templates. - Multi-source news collation for
news,insider,ipo, andsentiment.
Changed
- Migrated to Rust edition 2024; MSRV is now 1.88 (the codebase uses let-chains).
- Codebase is
rustfmt- andclippy-clean (enforced in CI). risknow defaults to a1yperiod so it has enough data to run.- Backtest Sharpe is now a per-trade ratio (no longer annualized from a trade-level equity curve, which produced meaningless values).
Fixed
- Corrected README counts (57 commands, 213 tests; was “89 tests / 50+”).
- Short trades:
simstatus/settle and the daemon now compute P&L and WIN/STOP/TARGET verdicts correctly for SELL positions (previously inverted). - Tax: LTCG/STCG classification now compares real dates instead of year+month, so the day-of-month no longer flips ~11-month holds to long-term.
- Daemon risk: realized P&L from the booked half at T1 is now tracked, so the daily-loss kill switch and EOD totals are no longer understated; wind-down stop tightening and breakeven moves now handle short positions.
- Panics:
vwap/atrno longer index out of bounds on ragged OHLCV data; everypartial_cmp().unwrap()sort is now NaN-safe. - Division by zero / NaN: guarded in
daily_returns,value_at_risk, backtest returns,sip,stoploss,rotation, dividend/harvest P&L, and swing-point detection. marketsnow matches index labels to quotes by symbol (Yahoo can reorder results);whatifpairs timestamps with closes so the buy price stays aligned.- Live order placement warns instead of going silent when no order id is
returned, preventing accidental resubmits;
triggerpriceis only sent on stop-loss order types. strip_think_tags(AI output) no longer corrupts text when a stray closing tag precedes the opening one.
0.1.0 - Unreleased
Initial development. Not published. Highlights that landed during this phase:
Added
- 57 commands spanning analysis, screening, trading bots, live trading, and portfolio management for US and Indian (NSE/BSE) markets.
- Daemon workers: continuous intraday bot (9 strategies, Kelly sizing, risk controls) and a daily long-term worker (6-pillar scoring + Monte Carlo).
- Paper-trading simulator with confidence rating.
- Live trading via Angel One; broker import for Zerodha Kite, INDmoney, and CSV.
- Local AI integration via Ollama, auto-injected into 6 commands.
- Redis response caching with in-memory fallback.
- Rate limiting, retry-with-backoff, and response caching for the Yahoo Finance data source.
- Multi-timeframe and braille terminal charts;
-p/--periodflag on chart commands. deepcommand — full report on a single stock in one shot.