You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
That is today's price against a three-month average volume — two different clocks in one number — and it is then classified STATIC_SAFE in app/screen.py, meaning a screen can prefilter on it before live quotes are fetched.
The intent is defensible and documented: it is a liquidity floor, not a reading of the tape. avgdvol > 20m means "this name normally trades enough to get out of", and half a day of price drift genuinely does not change that answer. That is why it is static-safe while today's dollar_volume deliberately is not.
But the docstring does not say that the two inputs come from different periods, and a reader checking whether the field means what they think will not find out from the code. For a name whose price has halved since the quarter began, the figure overstates historical liquidity by 2x.
What to decide
Either is a good outcome — pick one and argue for it in the PR:
Document it. Extend the comment in derive() to state the mixed time base explicitly and why it is the right trade for a liquidity floor. Cheapest, and possibly correct.
In
app/universe.py:That is today's price against a three-month average volume — two different clocks in one number — and it is then classified
STATIC_SAFEinapp/screen.py, meaning a screen can prefilter on it before live quotes are fetched.The intent is defensible and documented: it is a liquidity floor, not a reading of the tape.
avgdvol > 20mmeans "this name normally trades enough to get out of", and half a day of price drift genuinely does not change that answer. That is why it is static-safe while today'sdollar_volumedeliberately is not.But the docstring does not say that the two inputs come from different periods, and a reader checking whether the field means what they think will not find out from the code. For a name whose price has halved since the quarter began, the figure overstates historical liquidity by 2x.
What to decide
Either is a good outcome — pick one and argue for it in the PR:
derive()to state the mixed time base explicitly and why it is the right trade for a liquidity floor. Cheapest, and possibly correct.If you change the number
Anything that shifts what
avgdvolreturns changes which rows every liquidity screen matches, so:dvoldropdown inFILTER_SPECSstill compiles to thresholds that mean the same thing.tests/test_screen.pyalready assertsavgdvol > 20mnarrows before re-pricing. Keep that property or explain why it should change.Small, self-contained, and it makes you read the most interesting part of the screener — the static-versus-live split.