EagleView is a Russell 1000 quantitative rotation strategy. It picks ten stocks every week from a pool of roughly a thousand using five sub-scores: momentum, sector strength, point-in-time fundamentals, SEC 8-K events, and recent insider buying. Across 29 phases of testing I kept what worked, threw out what didn't, and ran statistical tests at every step to make sure I weren't fooling myself. What follows is the full story: the math, the wins, the failures I wrote up with the same detail as the wins, and the honest expectation for what this thing can actually do with real money.
The premise is simple. A $100,000 account, fully invested, holds ten US stocks at any moment. Once a week the system looks at the universe, scores everything, and replaces any holding that has fallen out of the top ranks. No shorting, no margin, no day trading. The whole edge comes from being slightly better than the index at deciding which ten names to hold.
Why long-only and why so few names? Because retail accounts have constraints that institutional desks don't. Tax drag on short-term gains, lousy borrow on shorts, and the very real possibility that the human running the account will panic during a 30% drawdown. A ten-stock long-only book is something a normal person can actually hold through a bad year. Ten is also the empirical sweet spot I found in Phase 16b: dropping from twenty positions to ten lifted CAGR by 0.97 percentage points because the highest-conviction picks systematically beat the diluted ones below them.
Every Friday close, the system asks six questions about every Russell 1000 name. The ten stocks with the best aggregate answer become next week's portfolio.
Yield curve, realized vol on SPY, credit spreads. If multiple stress signals fire at once I scale total exposure from 100% down toward 60%. I never go to cash. Cash is its own bet, usually a losing one.
I look at the eleven SPDR sector ETFs and measure their six-month return relative to SPY. A stock in a sector that is beating the market gets a tailwind bonus. This is the single largest weight in the score (40%) because sector rotation explains more cross-sectional variance than any single-stock factor.
P/E, P/B, EV/EBITDA, ROE, debt-to-equity, sales growth. Built from SEC 10-Q and 10-K filings using the date the filing hit EDGAR, not the period end. That avoids the most common look-ahead bug in academic backtests.
Twelve-month return excluding the most recent month, plus a 200-day trend filter. I do not buy falling knives no matter how cheap they look. If capital is not already flowing into the name, I wait.
SEC 8-K filings have item codes. Item 4.02 (non-reliance on prior financials) and Item 1.03 (bankruptcy) are basically corporate emergency flares. I count these over a 60-day window and penalize names that just lit one off.
Form 4 open-market purchases by officers and directors. I exclude 10%+ holders because those are usually passive funds. When operating officers put their own money in, especially several of them clustered together, they tend to know something the market doesn't yet.
I fish in the Russell 1000, not the S&P 500. That single decision was the largest source of alpha in the entire project: 2.94 additional percentage points of CAGR, matched-window, validated out-of-sample. It is worth explaining why.
The S&P 500 is the most over-analyzed slice of equity in the world. Every megacap has dozens of sell-side analysts publishing quarterly notes, every pension fund holds every name, every quant shop runs the same five factors on the same five hundred tickers. By the time a signal fires on Apple, the world has already priced it. The Russell 1000 includes those five hundred plus another five hundred mid-cap names below the S&P cap line. That second half is where the dispersion lives.
A lot of academic backtests use the current S&P 500 list as the universe and run it back through history. This is a silent disaster. You end up testing a strategy on a universe that excludes every company that went bankrupt, got acquired, or fell out of the index because it underperformed. The survivors look great because the dead were quietly buried before the test even started.
What I do instead: rebuild the Russell 1000 membership as it actually existed on every June 30 (Russell's official reconstitution date) since 2016. A backtest considering June 2018 sees only the names that were in the index in June 2018, including names that later died or got delisted. The historical equity curve includes every loss that a real investor would have eaten.
I validate this against the actual Wikipedia R1000 list on the most recent available date: 952 true positives, 48 names I included that shouldn't be there, 50 names I missed. That's an F1 score of 0.951. The 5% error is almost entirely at the size boundary, names ranked around 950 to 1050 by market cap where small shares-outstanding errors flip them across the cutoff. A paid Norgate subscription at $650 per year would push F1 above 0.99 and I may upgrade later, but the marginal alpha from fixing the last 5% is small relative to what's already in the strategy.
Every Friday at the close, each of the roughly thousand eligible names in the Russell 1000 gets a composite score. The composite is a weighted average of five sub-scores, each capturing a different kind of information. The ten names with the highest composite become next week's portfolio. Below I walk through each sub-score: what it measures, the actual formula, why it is in the stack, and what its weight was set to and why.
The reason for stacking five independent layers instead of training one big machine-learning model is replicability. I can point at every input, name it, and reproduce it from scratch. When something stops working, I can isolate which layer broke and turn it off. A black box doesn't let you do that, and black boxes have a strong tendency to discover patterns that hold for exactly the in-sample window and then evaporate.
The other reason is that the layers actually capture different information. If momentum and value were 95% correlated, blending them would just add noise. The cross-sectional correlation matrix below shows most pairwise correlations sit below 0.30, which means each layer is contributing largely independent signal. The insider and events layers in particular are nearly orthogonal to the price-based layers, which is exactly why they add marginal alpha rather than duplicating what momentum already knows.
Four well-documented anomalies bundled into one layer because each works in a different regime and they smooth each other out. Twelve-minus-one momentum (Jegadeesh and Titman, 1993) is the workhorse: skip the most recent month because of short-term reversal, then look back twelve months. The 200-day trend filter is the Faber tactical asset allocation rule, used here as a sign filter so I don't buy names that are technically falling. Short-term reversal is the Lo-MacKinlay one-week mean reversion effect, weighted half because it works best in choppy markets and gets noisy in trends. The inverse-vol component captures the low-volatility anomaly (Ang, Hodrick, Xing and Zhang, 2006): empirically, lower-vol names earn higher risk-adjusted returns than CAPM predicts.
Combining all four matters because momentum dominates in trending markets, reversal dominates in choppy markets, and low-vol holds up in risk-off. A single one of these would underperform half the time. The blend is more stable across regimes than any component on its own.
This is the biggest weight and the most important conceptual call I made. Rather than try to predict which sector will lead next, I let the sectors that are already leading earn a bonus for the stocks inside them. When XLE has been beating SPY for six months, every energy name in the universe gets a positive tailwind contribution. When XLE rolls over and XLK takes the lead, the tailwind automatically rotates to tech. I never have to decide; the price data decides for me.
Why does this work? Because sector leadership is persistent over multi-month windows. A sector that has been leading for six months tends to lead for another one to three months on average. That's exactly the holding-period horizon for a weekly-rebalanced book picking names with momentum half-lives in the same range. The sector layer carries the most weight because in 4-fold walk-forward tests, dropping it costs about 3 percentage points of CAGR. Dropping any single one of the other four layers costs less than 1.5.
Built from SEC 10-Q and 10-K filings parsed straight from EDGAR. The thing that makes this point-in-time is that I never use a number before the date it was actually filed. A Q2 result with a period end of June 30 doesn't enter the data until the 10-Q is filed in early August. This sounds obvious but most academic backtests get it wrong by using the period end as the availability date, which leaks roughly 45 days of future information into the past. That single leak typically inflates strategy CAGR by 1 to 3 percentage points.
The composition (cheap + healthy + growing) is essentially Joel Greenblatt's Magic Formula generalized. I don't claim it's novel. I claim it works because it captures the empirical finding that good companies at fair prices outperform the index, and I wired it up carefully enough not to cheat.
When something material happens at a US company, the SEC requires an 8-K filing within four business days, classified by item code. Item 1.03 means bankruptcy. Item 2.06 means a material asset impairment. Item 4.02 means the company is telling investors not to rely on previously-filed financials, which is the polite version of "my accounting is broken." Item 5.02 is an executive departure, often a CFO leaving suddenly.
The weight is only 10% because most of the time most stocks have zero negative filings, so the layer is sparse and only fires when something is actually wrong. That's exactly what I want from a risk filter: silent when nothing is broken, loud when it is. The layer prevented me from holding several names that announced restatements and then dropped 30 to 60% over the following weeks.
Insiders, meaning the C-suite and the board, are required by Section 16 of the Securities Exchange Act to disclose any trade in their own company's stock within two business days. There is a long literature (Lakonishok and Lee 2001, Cohen, Malloy and Pomorski 2012) showing that informed insider buys, the open-market purchases by operating executives, predict positive abnormal returns over the following three to twelve months.
The trick is excluding the noise. I drop sales entirely because the reasons to sell are many (taxes, diversification, divorce) and the reasons to buy are few (you think the stock will go up). I drop 10%+ holders because those are typically index funds or activist stakes that are not "informed" in the same sense. I weight by both dollar size and by the cluster of distinct insiders buying, because one insider buying $50k is noise but three insiders buying $500k each over the same month is a strong directional bet.
I tried this signal on the S&P 500 in Phase 5 and it didn't work. The reason: megacap insider buys are reported instantly, picked up by Bloomberg terminals, and priced within hours. By the time my Friday-close rebalance could act on it, the move was already done. On the Russell 1000 mid-caps in Phase 19, the same signal added 1.32 percentage points of CAGR. The price reaction in mid-caps is more gradual and I have time to participate. This was the entire reason to expand the universe.
A composite score on its own is a single number. To know why the model picked a name I decompose the score into its five layer contributions. Names that score high on three or four layers tend to outperform names that score high on just one, even if the total composite is the same. Broad signal beats narrow signal.
The scoring stack tells me which ten names to hold. It does not tell me how to size them, when to trim, or how much total exposure to run. Those decisions are the difference between a backtest that looks good on paper and one a human can actually hold through a bad year. Each of the six construction rules below was chosen for a specific reason and validated by a specific experiment.
Liquidity and survivor filters. The dollar-volume floor rules out names where a $20k position would move the price. The $5 price filter excludes penny-stock noise. Both are conservative for a $100k book and become more binding as the account scales.
A naive "pick top ten every week" approach generates a lot of churn. Names sit near the cutoff and flip in and out depending on tiny score wiggles, paying friction on every flip with no signal advantage. The rotation buffer says: an already-held name keeps its slot unless a non-held name beats its score by more than 10% in score units. This is anti-churn hysteresis. Phase 25's parameter sweep tested buffers from 0.00 to 0.25 in steps of 0.05. The 0.10 value was the local maximum on Sharpe.
Equal-weighting ten names treats a low-vol utility the same as a high-vol biotech, which is dumb. Inverse-vol weighting gives the steadier names larger positions because they can carry more dollars without dominating portfolio risk. The 20% cap exists because with only ten names, pure inverse-vol can occasionally produce a 35%+ position in the lowest-vol name. That's too much single-name risk. The cap keeps the largest possible position at one-fifth of the book.
When a name is down 8% from its peak since I bought it, I cut to 60% of full size. At 15% down, I cut to 30%. This is mechanical stop-loss logic with two important properties: it scales the position rather than fully exiting (so I don't sell the bottom and miss the rebound), and it restores the position if the price recovers. The cash freed up sits idle, not redeployed, because I want the system to express less risk during deterioration rather than rotate into something else and hope.
Stock-by-stock risk controls catch idiosyncratic blowups. They do not catch a market-wide selloff where all ten of my names go down together. For that I have a regime overlay that scales total gross exposure based on macro stress. The inputs are the 2-year vs 10-year Treasury yield spread, realized SPY volatility, and high-yield credit spreads. When two of the three flag stress, exposure scales from 100% toward 60%.
None of the backtest results in this document are gross numbers. Every CAGR and Sharpe is computed after subtracting realistic execution costs. The table below shows the friction assumptions baked into the engine. They are tight but defensible for a retail account at Interactive Brokers or Schwab trading mid-caps in modest size.
| Component | Value | Why this number |
|---|---|---|
| Slippage | 5 bps each side | Modest market impact at $100k notional in mid-caps |
| Half-spread | 3 bps each side | Typical bid-ask for R1000 names ex-megacaps |
| Commission | $1.00 per trade | Standard at IB; Schwab is now $0 fixed |
| Cash yield | 4.0% APY | On the idle cash from drawdown caps and regime de-risking |
Total round-trip friction is about 16 bps per trade. With weekly rebalancing and roughly 3 to 4 name changes per week, that's ~3.5% of annual turnover cost built into every quoted return. The cash yield gives a small offset when the regime overlay parks dollars on the sidelines.
Because the sector tailwind layer is the largest weight in the score, the portfolio's sector composition shifts dynamically as leadership rotates. I never coded an explicit "rotate into energy now" rule. The rotation is a downstream effect of the sector tailwind layer simply doing its job.
The hardest problem in quant research isn't building the strategy. It's knowing whether the result you got is real or whether you stumbled onto something that worked by luck and won't repeat going forward. Every promising result in this project went through three independent statistical tests before I believed it. The reason for the tests is uncomfortable: most published quant strategies don't replicate.
Imagine you test 100 slightly different versions of a strategy. Even if every single one is identical to baseline at the population level, simple sampling noise will produce a distribution of in-sample Sharpe ratios across the 100 variants. The best one of those 100 will look impressively better than the worst, purely by luck. If you pick the best one and call it your "discovery," you have fooled yourself.
The math is exact. Under the null hypothesis that all N variants have identical true Sharpe, the expected maximum Sharpe across N trials is approximately:
Plug in realistic numbers. The cross-variant standard deviation of measured Sharpe on a 5-year window is roughly 0.30. Test 100 variants. Expected best by chance: 0.30 * sqrt(2 * 4.6) = 0.91 Sharpe units. That means even if every variant is secretly identical to the baseline, you should expect the best one to look 0.91 Sharpe better than the worst one. This is why every blog post promising a Sharpe-3 strategy should be treated with extreme skepticism until somebody runs it forward in real money.
Across the full project I tested approximately 78 distinct strategy variants across the 29 phases. I have to assume some fraction of any "winning" result is order-statistic noise from that search, and I discount the headline numbers accordingly.
Take the candidate's daily return series. Resample it 2,000 times in overlapping 20-day blocks (block resampling preserves the autocorrelation structure that ordinary resampling would destroy). Each resample gives a Sharpe, a CAGR, and a max drawdown. The 2.5th and 97.5th percentiles of those 2,000 numbers form a 95% confidence interval. If the candidate's lower bound sits above the baseline's point estimate, the improvement is robust to sampling noise.
Compute the daily (candidate minus baseline) alpha series. The null hypothesis is that this series has zero mean (the two strategies are equally good). Under the null, the sign of any individual day's alpha is random. So I randomly flip the sign of each day 5,000 times, compute the mean of each permuted series, and count what fraction exceed the observed mean. That fraction is the p-value. This is the cleanest paired test available: it cancels out market-wide variance because both legs ate the same market.
Bailey and Lopez de Prado, 2014. Given N total variants searched in the project, compute the probability that the observed Sharpe genuinely exceeds the expected maximum-by-chance under the null. The deflated Sharpe ratio bakes the multiple-testing penalty directly into a single number. DSR above 0.80 means I're at least 80% confident the result isn't just the best of N random draws.
| Gate | Observed | Verdict |
|---|---|---|
| G1 (CI separation) | v0.7 Sharpe lower bound 0.641 vs v0.6.4 point estimate 0.949 | FAIL (CIs overlap) |
| G2 (sign-flip permutation) | p = 0.0094 | PASS |
| G3 (deflated Sharpe with N=30) | DSR = 0.9266 | PASS |
| Overall | 2 of 3 gates pass | Meaningful evidence. Paper-trade required before live promotion. |
G1 fails because individual-strategy Sharpe confidence intervals on 8 years of daily data are intrinsically very wide (roughly +/- 0.3 Sharpe units). For paired comparisons G1 is almost guaranteed to fail and it's not the right test to lean on. G2 is the test that matters and the p-value of 0.0094 means the observed alpha is significantly different from zero at the 1% level. The deflated Sharpe of 0.93 means I're 93% confident the result isn't the order-statistic of my search. Together that's strong enough evidence to keep moving forward, but not strong enough to skip paper trading.
Twenty-nine numbered research phases, roughly 78 distinct variants tested across them, three genuine wins, one variant that fooled me before the rigor framework caught it, and a long list of honest failures. The failures matter as much as the wins because they map the boundary of where alpha actually exists in this universe. Below: every result, what the experiment was, what it produced, and why it survived or didn't.
The experiment: a 2x2 factorial varying the number of positions (10 vs 20) and the weighting scheme (equal vs inverse-volatility). Same scoring stack across all four cells. The clean comparison let me isolate concentration from weighting. Result: dropping from 20 names to 10 with inverse-vol weighting added 0.97 percentage points of CAGR. Why: the top-ranked names by composite score systematically outperformed the names ranked 11 through 20. Holding both dilutes the edge.
The biggest single discovery in the project. The experiment: identical strategy code, two different universes (S&P 500 vs Russell 1000 PIT), same 2017-2024 walk-forward window. Result: the R1000 version produced 2.94 more percentage points of CAGR and meaningfully better Sharpe. The mechanism is institutional capacity. Quant funds large enough to matter cannot deploy meaningfully in mid-caps, so the mid-cap cross-section is less arbitraged and signals retain more predictive power.
Adding the Form 4 insider-buy layer described in section 3.6. Result on R1000: +1.32 percentage points of CAGR and +0.09 Sharpe over the no-insider baseline. Phase 21 then put this result through the rigor framework: the sign-flip permutation gave p = 0.0094 and the deflated Sharpe was 0.927. That's the strongest survives-everything result in the project. The same signal had been rejected at the S&P 500 level in Phase 5, which tells me the alpha is specifically in mid-cap insider activity, not megacap.
Tested in both Phase 6 (S&P 500) and Phase 20 (R1000). The signal was a combination of ATR breakouts, Mansfield relative strength, and signed ADX, the kind of stack a technical-analysis textbook would recommend. Failed in both universes. Diagnosis: by the time I observe a Friday-close breakout and rebalance the following Monday open, the breakout move is already over. The signal has no edge at weekly rebalance frequency. Useful finding: the failure is universe-independent. It's not "wrong universe," it's "wrong cadence."
Phase 15 tested a 30-day rolling average news tone score from the GDELT Project as a layer. Phase 15b tested a narrower event-window version, specifically because the user (correctly) pushed back on whether the first rejection was implementation-specific. Both failed. Why: the 8-K event layer already captures the categorical material news that moves stocks. General-purpose news sentiment is almost all ambient noise that adds no marginal information.
Analyst grade upgrades and downgrades as a layer. Result was negative across two different implementations. Why: analyst rerates are lagging. The stock has already moved by the time the analyst publishes. Buying on a sell-side upgrade is buying after the smart money has already positioned. I'd be the dumb money.
The classic Ball and Brown (1968) earnings-surprise drift signal. The finding has been documented in finance literature for fifty years but has decayed substantially since 2000 as algorithmic traders started arbitraging it. My test confirmed: it not only doesn't add lift, it actively hurts at weekly cadence. There's also overlap with the insider signal (insiders buy after good earnings reports), so adding both would just double-weight the same names.
Phase 22 tested whether I could save friction by rebalancing less often. Monthly rebalance cost 4.7 percentage points of CAGR. Quarterly cost 8.5. Why: the signal stack has an empirical half-life of roughly 30 to 60 days. Slower rebalancing means trading on stale signals. The friction savings (maybe 50-80 bps a year) get dwarfed by the alpha decay (4-8%). Weekly is the right cadence for this stack.
Tested a layer that scales total exposure to maintain a constant realized vol target. Worked as designed: vol came down, max drawdown came down. But return came down proportionally, so Sharpe was flat. The existing per-position drawdown caps plus regime overlay already capture most of the available vol-management benefit. Adding a third layer of vol-control was redundant.
Phase 28 swapped 12-1 momentum for 6-1. Headline: +2.25% CAGR, +0.202 Sharpe. Looked like a winner. Phase 29 rerun caught that the two implementations were normalizing differently. On matched normalization the real lift was +23 bps and the permutation p-value was 0.464. The single clearest illustration of why I run rigor on everything that looks good.
Phase 25 systematically swept four hyperparameters (rotation buffer, sector-tailwind weight, insider weight, insider lookback window) around their current values. The current values turned out to be the local maximum on every axis. That's reassuring: I picked them based on first-principles intuition and they happen to also be the empirical optima. There's no easy +1% sitting on the table from tuning.
Every number in this section comes from a 4-fold walk-forward backtest, not a single in-sample fit. The 2017 to 2025 window is split into 4 folds. For each fold I use the prior data to set parameters and the held-out year to score. Stitching the four out-of-sample returns end-to-end gives the equity curve below. This is as close to "what would have actually happened" as a backtest can get without being a live forward run.
The walk-forward backtest produced a CAGR near 15%. The honest forward expectation is closer to 13%. The 2-point gap is not because the backtest is "wrong." It's because there are four specific things the backtest cannot fully account for, each of which costs a known amount. Below: each discount, quantified.
The sum of those four discounts is about -2.83 percentage points. Backtest CAGR of 15.33% minus 2.83 = roughly 12.5%. I round to "~13%" as my honest forward expectation. That's still meaningfully above SPY's ~10% long-run average and represents the genuine alpha I believe the strategy can deliver.
The numbers below are subjective probabilities calibrated against three reference points: SPIVA's annual report on how active funds fare against benchmarks (most lose over 10-year windows), Bessembinder's 2018 paper showing that 4% of stocks account for all of the long-run equity return above Treasuries, and Lopez de Prado's work on multiple-testing and backtest overfitting. They are estimates, not promises. Anyone who promises you a probability of beating SPY is selling something.
| Scenario | Estimated probability |
|---|---|
| Beat SPY on Sharpe (risk-adjusted return) over a 10+ year window | 70 to 75% |
| Beat SPY on raw CAGR, pre-tax | 55 to 60% |
| Beat SPY on raw CAGR, after-tax, in a Roth or traditional IRA | 55 to 60% |
| Beat SPY on raw CAGR, after-tax, in a taxable brokerage account | 30 to 40% |
| Hit the original stretch goal of 15% CAGR or better | 25 to 35% |
| Underperform SPY by 5+ percentage points on annualized return | 10 to 15% |
| Catastrophic underperformance: 10+ points behind SPY | 5 to 8% |
Why is the Sharpe-beat probability much higher than the CAGR-beat probability? Because Sharpe is more stable. SPY's annualized return swings widely based on where you measure (15% in some decades, 5% in others). The strategy's edge in risk-adjusted terms is more stable than its absolute return advantage. Beating SPY on Sharpe is a much more defensible claim than beating it on raw CAGR.
If I had to compress 29 phases of work into ten transferable lessons for the next quant project, these would be them. Most are not original; I picked them up the hard way and verified each one by accidentally violating it first.
Moving from S&P 500 to Russell 1000 added 2.94 percentage points of CAGR. No single signal I tested on the S&P 500 came close to that. If you can't find alpha, try a less-arbitraged universe before you try a cleverer signal.
Every win in this project (insider buys, sector tailwind, R1000 mid-caps) is the strategy acting before the market fully prices something. Every failure (analyst revisions, PEAD, technical breakouts at weekly cadence) is the strategy reacting after. If your signal arrives after the price moves, you have no edge.
Phase 28's T5 looked like a +2.25% CAGR win and turned out to be 90% a normalization artifact. I came within one rerun of shipping it. The discipline of running every promising result through the rigor framework is the single most important habit in the whole project.
PEAD has roughly halved since 2000 as algo desks arbitraged it. Analyst revisions are effectively dead at retail cadence. If an effect was first documented in the 1980s and is in every textbook, assume it's been priced away and test before deploying.
The vol-targeting overlay failed in Phase 25 not because it didn't work but because the per-position drawdown cap and the macro regime overlay had already eaten the marginal vol-management benefit. Adding more risk control on top of a system that already has it just costs return without buying Sharpe.
Phase 25 tested four hyperparameters around their current values. All four were already at the local maximum. The 5 to 10 basis points you might squeeze out by tuning further is dominated by the multiple-testing noise the additional tuning itself introduces. Time is better spent on a new signal than re-tuning an existing one.
Roughly 25 of the variants I tested across 29 phases failed. That's not wasted effort. Each failure tightens the boundary of where the alpha actually lives. After 25 rejections, the surviving v0.7-candidate is much more credible as a genuine local maximum than it would be after one cherry- picked win.
Universe reconstruction error, multiple-testing inflation, friction under-modeling, and regime-period normalization between them cost approximately 2.83 percentage points of CAGR vs forward expectations. Bake those four discounts into every backtest result you quote. The 15.33% becomes 12.5% becomes "roughly 13%" forward.
CAGR depends heavily on the specific window: SPY's number changes by 5+ percentage points depending on the decade. Sharpe is more stable. Quoting "v0.7-candidate has Sharpe roughly 1.25 vs SPY's roughly 0.85" is a more replicable claim than quoting any specific CAGR.
I've extracted approximately as much signal as a careful researcher with 29 phases of effort can extract from the historical record. The remaining unknown is whether the edge survives outside the training period in real conditions. The only way to answer that is to run it forward in paper trade, which is what I're doing for the next 30 days before any promotion decision.