Insights
How to Study Stock Reactions to FDA AdCom Votes
Alphanume Team · August 13, 2026
Define the AdCom vote question, resolve which answer favored the product, map the sponsor to a security, and freeze the event timestamp before calculating stock reactions.
To study stock reactions to FDA advisory committee votes, start with the vote that actually occurred rather than a headline saying the panel was positive or negative. Alphanume's FDA Advisory Committee Votes dataset stores one row per vote question from official minutes, including yes, no, and abstain counts, question polarity, the product-favorable outcome, and source-material links.
An AdCom vote is advice from an outside expert panel. It is not the FDA's final approval decision, a medical recommendation, or a guaranteed stock catalyst. The dataset also does not provide ticker mapping or stock prices. Those joins require separately timed sources and explicit review.
Resolve vote polarity before measuring margin
Field | Purpose | Failure to avoid |
|---|---|---|
vote_yes, vote_no, vote_abstain | Official tally from minutes | Assuming every meeting produced numbers |
vote_margin | Signed yes minus no | Treating a positive yes margin as always favorable |
favorable_answer | Names yes, no, or not applicable as product-favorable | Ignoring reverse-worded questions |
vote_outcome_favorable | 1 won, 0 lost, null undetermined | Converting ties or non-directional votes to losses |
vote_evidence | Explains tally or no-tally status | Dropping the coverage denominator |
Some questions ask whether benefits outweigh risks, so yes is favorable. Others ask whether use should be restricted, making no favorable. Calculate a product-favorable margin from favorable_answer, not from vote_margin alone. Exclude not_applicable polarity from directional comparisons while retaining it in the meeting coverage report.
Build one row per chosen event unit
A meeting can contain multiple vote questions. Decide whether the event unit is a question, meeting, asset, or sponsor before loading returns. Question-level analysis keeps record_id. Meeting-level analysis needs a predefined aggregation rule and cannot select the most favorable question after seeing the outcome.
def favorable_margin(row):
if row["favorable_answer"] == "yes":
return row["vote_yes"] - row["vote_no"]
if row["favorable_answer"] == "no":
return row["vote_no"] - row["vote_yes"]
return None
question_rows["favorable_margin"] = question_rows.apply(
favorable_margin,
axis=1,
)
analysis_rows = question_rows.loc[
question_rows["vote_evidence"] == "minutes_tally"
].copy()Rows with vote_seq=0 preserve meetings without a tally. Recent minutes can be unpublished for months, leaving counts null until the dataset updates. Use updated_since to collect those changes and keep the original event snapshot separate from later data completion.
Map the sponsor and event time explicitly
The source includes sponsor company, drug, indication, application identifiers, and asset_key, but no ticker. Build a reviewed sponsor-to-security map with effective dates. Partnerships, acquired assets, private sponsors, and subsidiaries can make a current ticker assignment wrong for the meeting date. Keep unmapped events in the denominator and exclusion report.
The meeting date is a daily anchor, not a precise public vote timestamp. Define whether the result was known before the close, after the close, or during a session using meeting materials and another timestamp source. Then choose the first eligible trading price consistently. Do not switch between same-day close and next-day open based on which produces a cleaner return.
Segment margin, size, and prior pricing
After mapping the security, join Historical Market Cap using an observation on or before the meeting date. Keep the cap date and group thresholds chosen before outcomes. To test whether success was already priced, calculate a predefined pre-meeting return or volatility measure from a separate point-in-time price source. The AdCom dataset itself does not contain prices or market-implied approval probabilities.
study_spec = {
"event_unit": "vote_question",
"event_key": "record_id",
"direction_field": "favorable_answer",
"margin_field": "favorable_margin",
"size_asof_rule": "latest market cap on or before meeting date",
"pre_event_window_sessions": [-20, -2],
"reaction_windows_sessions": [1, 2, 5],
"primary_outcome": "next-session absolute return",
"keep_unmapped_in_exclusions": True,
}Absolute return measures movement rather than direction. A favorable panel result can still coincide with a negative stock reaction if expectations were higher, other evidence was adverse, or the event was already priced. Report signed and absolute returns separately and compare them only within a design with enough observations.
Control the major biases
- Advice versus decision. Do not label a favorable vote as FDA approval or fill the later decision from memory.
- Missing tallies. Preserve no-tally meetings and
vote_evidencerather than analyzing only clean winners and losers. - Multiple questions. Predefine aggregation when a meeting has several votes.
- Ticker mapping. Review sponsor and asset ownership as of the meeting date.
- Small samples. Coverage begins in 2024, and committee events are sparse, so broad causal claims are fragile.
Free access provides the trailing 20 trading sessions after a one-trading-session delay. There may be no held meeting in a short window. An empty response can be valid rather than an outage. The AdCom field documentation explains statuses, evidence values, and the lack of v1 pagination.
Reproduce one committee slice
Choose one committee and retrieve all held meetings in a fixed period. Export the full meeting denominator, question-level tallies, polarity audit, sponsor mapping, market-cap matches, missing-price report, and frozen study specification. Verify every included tally against minutes_url. Then calculate the primary next-session absolute return once, followed by the predefined secondary windows. The event-study design guide is the appropriate next review before interpreting the estimates.