Methodology

This page shows, without hiding anything, how we validate our rules and what their limits are.

How we validate

  • Walk-forward: scores use only data available up to the rebalance date, and results are checked only against what actually happened afterward.
  • Out-of-sample testing: performance is measured on periods not used to set the rules.
  • No lookahead: data not yet available at that point in time (e.g. the next day's close) is never used in the calculation.
  • Transaction cost assumptions: minimum validation window 3 years, commission 0.005/share, minimum commission 1.0, slippage 5bp, minimum paper-trading period 90 days.

Survivorship bias

Backtesting only with stocks that are alive today inflates results, since delisted stocks are excluded. So the goal is to store the universe (candidate list) as a weekly snapshot of what actually existed at that time. The buy-fitness table doesn't have that snapshot yet (partial coverage), so it uses today's universe even for past periods — stocks that were delisted or newly added in between aren't reflected.

Rules & parameters (fixed in advance)

The numbers below were fixed when the strategy was designed, not fitted after looking at the data. By default, buy candidates exclude companies with a caution signal in revenue, profit, or debt (e.g. ongoing losses, high debt) — this can be turned off per strategy.

Parametervalue
top_k20
horizon_days21
max_position_pct10.0%
weight · trend_1201.0
weight · momentum_12_11.0
weight · zscore_20-0.5
weight · vol_regime-0.5
weight · dist_high_2520.5
exit.balancedstop 8% · trail 10% · take-profit 25% · max 120d
exit.trendstop 10% · trail 15% · take-profit 40% · max 180d
exit.dipstop 6% · trail 8% · take-profit 15% · max 60d
exit.stablestop 5% · trail 7% · take-profit 12% · max 90d

Parameter sensitivity

We check that small changes to the stop-loss level or the trend lookback window don't swing the results wildly (an overfitting check).

US

ParameterAvg returnHit rateSample
trend_120 = 100d+3.13%59%35
trend_120 = 120d+3.38%60%35
trend_120 = 150d+4.28%60%35
stop = 6%+1.15%44%700
stop = 8%+1.40%50%700
stop = 10%+1.60%53%700

Korea

ParameterAvg returnHit rateSample
trend_120 = 100d+3.65%53%34
trend_120 = 120d+4.34%54%34
trend_120 = 150d+4.43%53%34
stop = 6%+4.66%41%680
stop = 8%+4.89%45%680
stop = 10%+5.32%50%680

Japan

ParameterAvg returnHit rateSample
trend_120 = 100d+2.23%55%34
trend_120 = 120d+1.54%55%34
trend_120 = 150d+2.41%57%34
stop = 6%+2.24%48%680
stop = 8%+2.46%54%680
stop = 10%+2.52%57%680

Hong Kong

ParameterAvg returnHit rateSample
trend_120 = 100d+1.39%55%34
trend_120 = 120d+1.57%56%34
trend_120 = 150d+1.81%57%34
stop = 6%+1.61%48%680
stop = 8%+1.81%53%680
stop = 10%+1.62%54%680

Crypto

ParameterAvg returnHit rateSample
trend_120 = 100d+2.20%45%57
trend_120 = 120d+2.07%45%57
trend_120 = 150d+2.25%45%57
stop = 6%+1.11%27%1135
stop = 8%+0.84%31%1135
stop = 10%+0.50%33%1135

Buy fitness

In past walk-forward validation, the share of stocks that rose 21 trading days (about a month) later when a (market weather stage) × (that day's rank bucket) × (caution flag present/absent) condition held. No arbitrary weights. Weather-stage labels are today's rules applied retroactively to the whole history (an approximation — those rules didn't necessarily exist back then).

US

Weather stageRank bucketCaution flagShare upAvg returnSample (stock-days)Sample (trading days)
Storm1-5No51.8%+1.03%38288
Storm1-5Yes53.4%+6.58%5836
Storm6-10No53.0%+1.57%36488
Storm6-10Yes55.3%+1.08%7650
Storm11-20No57.2%+1.92%71588
Storm11-20Yes58.8%+1.16%16559
Storm21-50No55.7%+1.15%207588
Storm21-50Yes58.6%+2.64%56581
Rain1-5No55.5%+2.33%1386310
Rain1-5Yes58.6%+4.24%169115
Rain6-10No52.1%+1.19%1289311
Rain6-10Yes62.8%+3.63%266167
Rain11-20No55.7%+1.78%2580311
Rain11-20Yes55.1%+2.56%530220
Rain21-50No56.7%+1.80%7477311
Rain21-50Yes56.9%+2.12%1853290
Cloudy1-5No58.4%+2.99%979223
Cloudy1-5Yes61.0%+6.47%13687
Cloudy6-10No57.6%+2.66%935223
Cloudy6-10Yes60.0%+2.78%180110
Cloudy11-20No59.2%+2.95%1827223
Cloudy11-20Yes62.0%+2.34%403146
Cloudy21-50No58.8%+2.65%5454223
Cloudy21-50Yes59.6%+2.14%1236191
Sunny1-5No63.8%+3.74%461101
Sunny1-5Yes59.1%+3.18%4423
Sunny6-10No60.4%+3.57%465101
Sunny6-10Yes57.5%+3.43%4032
Sunny11-20No62.6%+3.60%890101
Sunny11-20Yes55.8%+3.09%12053
Sunny21-50No66.4%+4.49%2669101
Sunny21-50Yes61.8%+3.03%36183

Korea

Weather stageRank bucketCaution flagShare upAvg returnSample (stock-days)Sample (trading days)
Storm1-5No1002
Storm1-5Yes1002
Storm6-10No1002
Storm6-10Yes1002
Storm11-20No1002
Storm11-20Yes1002
Storm21-50No1002
Storm21-50Yes1002
Rain1-5No43.1%-1.77%36077
Rain1-5Yes42.9% (Small sample · merged with a broader condition)-2.36%38577
Rain6-10No47.3%-0.89%35377
Rain6-10Yes46.9%+0.34%3225
Rain11-20No53.6%+1.00%68677
Rain11-20Yes59.5%+5.54%8441
Rain21-50No48.3%+0.10%209677
Rain21-50Yes38.3%-0.50%21462
Cloudy1-5No59.8%+5.31%1491332
Cloudy1-5Yes51.4%+1.05%179114
Cloudy6-10No60.7%+5.66%1435334
Cloudy6-10Yes52.8%+6.04%235156
Cloudy11-20No59.1%+4.60%2838334
Cloudy11-20Yes57.6%+4.68%502228
Cloudy21-50No56.9%+3.38%8443334
Cloudy21-50Yes52.9%+4.11%1577305
Sunny1-5No57.7%+6.09%1169281
Sunny1-5Yes58.9%+8.24%236151
Sunny6-10No61.4%+7.72%1103281
Sunny6-10Yes63.9%+11.23%302174
Sunny11-20No57.5%+5.03%2247281
Sunny11-20Yes59.0%+9.52%563226
Sunny21-50No58.2%+4.55%6485281
Sunny21-50Yes54.9%+6.73%1945272

Japan

Weather stageRank bucketCaution flagShare upAvg returnSample (stock-days)Sample (trading days)
Storm1-5No57.8%+2.26%23255
Storm1-5Yes48.8%+0.87%4322
Storm6-10No59.4%+3.05%22955
Storm6-10Yes58.7%+3.36%4628
Storm11-20No57.7%+3.29%43055
Storm11-20Yes53.3%+1.12%12046
Storm21-50No59.6%+3.62%130255
Storm21-50Yes47.4%+0.26%34854
Rain1-5No55.6%+2.52%1871431
Rain1-5Yes59.2%+5.37%289175
Rain6-10No57.5%+2.23%1801432
Rain6-10Yes59.6%+3.23%359211
Rain11-20No55.9%+1.77%3579430
Rain11-20Yes56.3%+1.69%741303
Rain21-50No55.9%+1.56%10516432
Rain21-50Yes51.7%+0.63%2444408
Cloudy1-5No61.7%+4.29%847193
Cloudy1-5Yes64.7%+5.76%13378
Cloudy6-10No62.3%+4.68%818195
Cloudy6-10Yes64.2%+4.64%16289
Cloudy11-20No62.8%+3.57%1655194
Cloudy11-20Yes65.6%+4.40%305108
Cloudy21-50No64.6%+3.82%4838196
Cloudy21-50Yes61.3%+3.01%1042156
Sunny1-5No63.0%+5.65%4614
Sunny1-5Yes65.7% (Small sample · merged with a broader condition)+8.48%7014
Sunny6-10No62.7%+4.45%5113
Sunny6-10Yes60.0% (Small sample · merged with a broader condition)+3.75%7014
Sunny11-20No58.7%+2.81%10914
Sunny11-20Yes41.9%+1.78%3110
Sunny21-50No62.1%+2.96%29814
Sunny21-50Yes66.4%+4.12%12214

Hong Kong

Weather stageRank bucketCaution flagShare upAvg returnSample (stock-days)Sample (trading days)
Storm1-5No53.0%-0.57%16439
Storm1-5Yes32.3%-2.58%3121
Storm6-10No52.8%-0.55%15939
Storm6-10Yes41.7%-2.93%3617
Storm11-20No52.1%+0.37%30339
Storm11-20Yes41.4%-1.60%8730
Storm21-50No45.3%-0.26%89639
Storm21-50Yes49.6%-0.56%27438
Rain1-5No48.5%-0.27%1525357
Rain1-5Yes50.6%+1.55%265169
Rain6-10No48.9%+0.03%1410355
Rain6-10Yes50.8%-0.38%380204
Rain11-20No49.0%+0.39%2849358
Rain11-20Yes51.6%+0.44%731272
Rain21-50No50.0%+0.22%8695358
Rain21-50Yes46.4%-0.43%2045312
Cloudy1-5No55.9%+2.13%1316289
Cloudy1-5Yes65.9%+3.59%12983
Cloudy6-10No60.5%+1.82%1244288
Cloudy6-10Yes60.2%+2.40%201133
Cloudy11-20No61.4%+3.10%2444289
Cloudy11-20Yes59.0%+2.40%446181
Cloudy21-50No55.7%+2.67%7605289
Cloudy21-50Yes61.6%+3.82%1065220
Sunny1-5No78.6%+7.05%5614
Sunny1-5Yes82.9% (Small sample · merged with a broader condition)+9.49%7014
Sunny6-10No74.6%+4.96%5914
Sunny6-10Yes78.6% (Small sample · merged with a broader condition)+5.59%7014
Sunny11-20No71.2%+5.21%11114
Sunny11-20Yes72.1% (Small sample · merged with a broader condition)+5.92%14014
Sunny21-50No63.6%+3.57%38514
Sunny21-50Yes80.0%+10.77%3513

Crypto

Weather stageRank bucketCaution flagShare upAvg returnSample (stock-days)Sample (trading days)
Storm1-5No41.1%-3.08%39287
Storm1-5Yes41.9%-0.14%4330
Storm6-10No34.9%-3.55%38486
Storm6-10Yes29.4%-5.25%5128
Storm11-20No36.6%-4.25%78486
Storm11-20Yes18.3%-7.00%8223
Storm21-50No31.3%-4.44%28178
Storm21-50Yes30.8% (Small sample · merged with a broader condition)-4.84%30582
Rain1-5No48.3%-0.18%2378512
Rain1-5Yes41.2%-1.29%182124
Rain6-10No47.6%+0.43%2364509
Rain6-10Yes35.7%-0.08%196117
Rain11-20No47.0%-0.30%4670510
Rain11-20Yes30.1%-4.20%412167
Rain21-50No37.2%-3.01%1803472
Rain21-50Yes23.1%-8.13%15680
Cloudy1-5No52.4%+4.58%1893453
Cloudy1-5Yes53.9%+5.79%382217
Cloudy6-10No48.9%+4.87%1804442
Cloudy6-10Yes56.1%+8.23%471218
Cloudy11-20No48.0%+3.87%3514447
Cloudy11-20Yes57.5%+11.81%944251
Cloudy21-50No36.5%-2.78%1269352
Cloudy21-50Yes42.0%+1.48%317142
Sunny1-5No92.7%+18.53%5518
Sunny1-5Yes56.0%+6.83%5015
Sunny6-10No79.3%+21.88%5817
Sunny6-10Yes55.3%+18.83%4715
Sunny11-20No91.0%+22.87%11117
Sunny11-20Yes59.4%+32.97%9614
Sunny21-50No84.8%+30.36%4615
Sunny21-50Yes51.3%+18.65%3911

Sample (stock-days) is the count of stock-date pairs meeting the condition; sample (trading days) is the number of distinct trading days among them. If either falls short of the minimum (30 stock-days, 10 trading days), we show '–' instead of a value.

Testing the company-financials filter

We re-ran the rule 'drop companies with risky financials from the candidate list' using only the figures that were already filed on each day (point-in-time — no later restatements, nothing not yet published). For every trading day we take the 20 candidates and compare their return 21 trading days later against the index. Because holding periods overlap, days are not independent, so the 95% interval comes from a 21-day block bootstrap (1,000 resamples). The bar for 'adopted' was set before looking at the results: the lower bound must be above 0 and the sign must agree in at least two half-year periods.

US

Sample: 2025-08-11 to 2026-08-06, 249 trading days, 4960 stock-days. Financial verdict available for 100% of candidates.

Financial summary21-day meanShare that rosevs indexCases (stock x day)
Solid+5.16%55%+4.00%732
Average+2.12%58%+0.44%2938
Caution+2.02%51%+0.15%1290
No data0
How candidates are pickedvs indexDifference vs default95% intervalVerdict
Default (by score)+0.89%
Exclude caution companies+1.27%+0.38%[-0.17%, +1.25%]On hold (not enough evidence)
Solid companies first+1.90%+1.01%[-0.24%, +2.51%]On hold (not enough evidence)

Korea

Sample: 2025-07-28 to 2026-08-06, 250 trading days, 5000 stock-days. Financial verdict available for 100% of candidates.

Financial summary21-day meanShare that rosevs indexCases (stock x day)
Solid+7.61%63%-0.57%826
Average+6.04%56%-1.22%3314
Caution+2.73%55%-4.16%854
No data-11.67%17%-11.97%6
How candidates are pickedvs indexDifference vs default95% intervalVerdict
Default (by score)-1.63%
Exclude caution companies-1.37%+0.26%[-0.33%, +0.96%]On hold (not enough evidence)
Solid companies first-1.71%-0.08%[-1.43%, +1.03%]On hold (not enough evidence)

Limits: industry labels and the stock list are today's, applied backwards, so companies that disappeared in between are missing. The test window is about a year, giving only a dozen or so non-overlapping one-month periods - too few for a strong statistical conclusion. Trading costs are not included.

How to read the statistics

  • If the sample (n) is under 30, chance is too likely a factor — we don't draw conclusions.
  • Don't look at average return alone; check hit rate and sample size together.
  • Past performance does not guarantee future returns.

Limits & regimes where this doesn't work well

  • Being rule-based, it reacts slowly to sudden news or policy shocks.
  • For thinly traded stocks/markets, the slippage assumption may not match reality.
  • Markets with a short history (e.g. crypto) have lower validation confidence.

Data sources & license

Price data comes from public market data providers and is provided only as statistical information, not investment advice.

All figures on this page are statistical information, not investment advice.

1 2 3