Skip to content

Learn

Stock Strategy Development

A post-earnings announcement drift stock strategy research pack

Post-earnings announcement drift research needs historical expectations as well as reported earnings. Freeze the estimate before the announcement, compare compatible EPS values, map public availability to the first later trading open and hold for a declared twenty-session interval. A current consensus value cannot be pasted into an earlier event and treated as information the strategy already knew.

This guide supplies synthetic EPS and announcement records with explicitly provided real US session dates. CoTrading event datasets remain planned or unverified. No historical analyst-expectations archive or actual earnings-event feed was downloaded, and the account result is a mechanism check rather than evidence that drift earns returns.

Specify the external event record first

Each canonical event needs issuer identity, fiscal period, announcement timestamp, first usable public timestamp, actual EPS, preannouncement consensus EPS, consensus freeze time and compatible measurement basis. Keep source versions and the original documents or vendor snapshot identifiers. A timestamp without provenance is not a complete historical observation.

The SEC EDGAR API reference describes reported submissions and financial facts. This experiment still requires separately frozen expectations and actual announcement evidence. Successful access to filings does not establish that the research has recovered a contemporaneous analyst consensus or the earliest public release time.

For real data, distinguish the issuer’s release from a later filing, ingestion or research time. The first usable timestamp cannot precede the actual announcement. If the evidence has date-only precision, use a documented conservative convention rather than invent a premarket time that captures a favorable opening move.

Define a relative surprise with matching basis

The author-defined surprise is actual EPS minus expected EPS, divided by the absolute expected EPS. Require finite values and a nonzero expectation. Enter when the relative surprise is at least ten percent. This is a simple relative measure, not a claim to reproduce every standardized-unexpected-earnings definition used in research.

Expected and actual values must refer to the same fiscal period, currency, per-share scale and GAAP/adjusted, basic/diluted basis. An adjusted estimate compared with a GAAP actual can create a false event. The fixture checks its declared basis labels and rejects a mismatch rather than converts it through an undocumented adjustment.

The expectation freeze must be strictly before announcement. Equality is rejected because the snapshot may already incorporate the news at the available resolution. A positive surprise can occur even when earnings remain negative; the event rule is not the separate positive-income quality screen. Preserve that economic distinction in the strategy name.

Resolve duplicates before counting opportunities

Use a stable economic event identifier, not merely one file per download. Two identical copies of the same canonical event produce one opportunity. The script tests exact duplicate removal so a repeated record cannot double the intended exposure or fee count.

Conflicting records under the same event identifier are not silently overwritten. The example raises and requires external version resolution. A real amendment must be retained with its availability and economic meaning before deciding whether it updates an old event or constitutes a new one. This small pack does not claim to parse arbitrary raw announcements automatically.

Keep ineligible events and their reasons in the research output. Dropping zero-denominator or late-expectation events without a record can hide coverage changes. The desired deliverable is an auditable event population, not just a list of profitable fills.

Rebuild the premarket example

The synthetic ALFA event announces January 5, 2026 at 08:00 with a minus-five-hour offset. The supplied expectation snapshot is January 4 at 20:00, expected diluted GAAP USD EPS one. Actual on the same basis is 1.2. The surprise is twenty percent, above the ten-percent threshold.

Public availability equals the supplied announcement time in this fixture. The first later provided open is January 5 at 09:30. Buy forty shares at ten and pay a fictional fee of one from 1,000, leaving 599 cash. The announcement is not used to trade a price before it became public.

Twenty open-to-open session intervals later is February 3 in the frozen table. Sell forty at eleven and pay another one, receiving 439. Final cash and equity are 1,038 with zero shares and two total fees. Gross price gain forty less fees two gives net thirty-eight; it is not an actual historical earnings-drift return.

Map the after-close counterexample separately

Move only announcement and availability to January 5 at 16:10. The same positive surprise cannot use that day’s earlier open. The first later open becomes January 6 at 09:30, and the twenty-interval deadline becomes February 4.

In a separate synthetic account, the entry is again ten and the February 4 exit is 10.5. Final cash is 1,018 with two fees. The different result is explained by a different executable holding path, not by rewriting the surprise. Never combine the two example accounts and describe them as one tested portfolio.

The NYSE holiday and hours reference supplies the relevant session context, including the January 19 closure. The fixture lists its sessions explicitly; it does not count twenty calendar days or assume every weekday is tradable. A full historical calendar service remains a separate input.

Enforce expiry without future qualification

The deadline is entry index plus twenty. Later events do not reset this event’s holding interval. The entry decision does not require that all future exit data already be present: a truncated dataset can still contain an eligible entry and an unfinished position.

The prefix test keeps the first ten ledger rows identical to the full run. It does not invent a terminal sale at the truncated last row. A completed twenty-session result requires an actual supplied exit event; missing future data should leave the observed position unresolved rather than manufacture cash.

Zero expected EPS is rejected, a same-time expectation freeze is rejected and an adjusted-versus-GAAP basis mismatch is rejected. The exact ten-percent boundary passes while 9.9% does not. These are different failure mechanisms from premarket/after-close scheduling and are asserted independently.

Run the event acceptance pack

Download the complete example, save it as R590.py and run python R590.py with Python 3.12 or later. It uses only the standard library and synthetic financial inputs. The source is docs/growth/research/round-5/examples/R590.py.

Assertions verify event deduplication, conflicting-version rejection, surprise qualification, both entry dates and twenty-session deadlines, exact orders, cash, fees and final quantities. The session input must also be unique and chronologically ordered. The output labels all expectation data as supplied synthetic records, not an available product dataset.

Prepare a real research handoff

Archive the frozen expectations, actual-release sources, basis mapping, canonical event version, calendar, threshold, quantities and cost model. Rebuild one accepted and one rejected event from that package before scaling. A vendor revision must not retroactively become the earlier forecast snapshot.

Report missing historical expectations as a data dependency, not a result of zero strategy return. Completion here is a reproducible event rule and full synthetic holding ledger with explicit unavailable cases. Evidence that information is incorporated slowly, or that the strategy survives real trading costs, requires a separate historical study with genuine time-consistent inputs.

Inspect timing without selecting the winning convention

The premarket and after-hours fixtures are independent accounts, not two opportunities available from one disclosure. Preserve both announcement versions as explicit controls and never choose between them using the resulting 1,038 or 1,018 cash. For a real event, source evidence must determine the timestamp before the return path is inspected. If the evidence cannot distinguish morning from evening, report that uncertainty and adopt a predeclared conservative availability rule; a favorable synthetic comparison cannot resolve an unknown historical time.

FAQ

Can today’s consensus stand in for the old estimate?

No. The estimate must have been frozen before that event’s announcement.

Does a positive surprise guarantee positive profit?

No. It is an entry condition, not a prediction that the subsequent holding will succeed.