A backtest is a story told with hindsight, not investment advice. The basket is made of stocks that are large today, which means every one of them survived and grew; that flatters every line below, the benchmarks included. The honest use of this page is to compare rules against each other on the same basket and the same window, and to notice how much the answer changes when the window moves.
Compare
Growth of 1
Drawdown from the running peak
How far each line sat below its own previous high, inside the window.
CAGR is the compound annual growth rate over the window; volatility is the annualised standard deviation of daily returns; Sharpe is CAGR over volatility with cash at zero; max drawdown is the worst peak-to-trough fall; turnover is one-way trading per year as a fraction of the portfolio, over the full run. ★ marks the highest CAGR in the window.
By year
Calendar-year returns of each line inside the window. Colour depth follows the size of the move.
Holdings now
What each rule chose at its last monthly rebalance. Weights are targets; whatever is not listed sits in cash.
How it works
Data. Daily bars from FinMind since 2005 for every stock in the basket, the Yuanta Taiwan 50 ETF and the TAIEX total return index. Prices are adjusted for cash and stock dividends, splits and capital reductions from the exchange's ex-date reference prices, so a strategy earns the dividends of what it holds. Capital reductions before 2011, which the data source does not list, are recognised by their jump beyond the daily price limit and neutralised; the five cases are named in the README.
Trading. Every rule rebalances on the first session of each month. Its signals use every close before that session and its trades are filled at that session's close, so nothing is bought with information from its own bar. Brokerage of 0.1425% is paid each way and the securities transaction tax of 0.3% (0.1% for the ETF) on every sale. Cash earns nothing, shares are fractional, and there is no slippage. A stock becomes tradable once it has 250 sessions of history; the equity curves start on the first session of 2006.
The rules.
The basket.
What is missing. A stock that was large in 2006 and has since shrunk or delisted is not in the basket, so the basket is not the market of 2006. Nothing is optimised: each rule uses the first parameters one would write down, and there is no model-based rule yet. The code lives in tools/mock_trading; a GitHub Actions workflow reruns it every Saturday and commits backtest.json.