акції з незвичним обсягом торгів за тиждень
Рейтинг акцій з незвичним обсягом за тиждень: порівняння обороту з середнім показником за 40 сесій, тижнева прибутковість та показники стійкості тренду.
Незвичний обсяг означає, що акції торгуються значно вище за їхній власний нормальний рівень, а не за ринковий. Для компанії з надвеликою капіталізацією обсяг у 40 мільйонів акцій є звичною справою; для компанії з малою капіталізацією це подія. Ця сторінка ранжує акції з незвичним обсягом за минулий тиждень: для кожного активу розраховано середній обсяг за останні п'ять сесій, поділений на його власний середній обсяг за попередні сорок сесій, з мінімальним порогом у один долар, щоб кожен рядок представляв акції, доступні для реальної торгівлі. Дані оновлюються щотижня, а позначка «дані станом на» визначає часове вікно. Сама методика — відносний обсяг — має свій повний посібник.
Лідери тижня за обсягом торгів
Три стовпці визначають результати. Множник показує, наскільки перевищив обсяг торгів середній показник акції. Базовий рівень вказує на нормальний обсяг; великий множник при низькому базовому рівні є менш значущим, ніж помірний множник при високій активності. Сума в доларах показує економічну значущість активності. Останній стовпець — зміна ціни від відкриття до закриття за тиждень — зазвичай не враховується у фільтрах за обсягом.
Точний SQL-код для кожного числа
WITH sess AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
sum(toFloat64(volume)) AS vol,
sum(toFloat64(close) * toFloat64(volume)) AS dollars,
argMin(toFloat64(open), toTimeZone(window_start, 'America/New_York')) AS day_open,
argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS day_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 70 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
GROUP BY ticker, d
),
cal AS (
SELECT d, row_number() OVER (ORDER BY d DESC) AS rn
FROM (SELECT DISTINCT d FROM sess)
),
per_name AS (
SELECT s.ticker AS ticker,
avgIf(s.vol, c.rn <= 5) AS adv_recent,
avgIf(s.vol, c.rn BETWEEN 6 AND 45) AS adv_base,
sumIf(s.dollars, c.rn <= 5) AS dollar_recent,
argMaxIf(s.day_open, c.rn, c.rn <= 5) AS week_open,
argMinIf(s.day_close, c.rn, c.rn <= 5) AS week_close,
countIf(c.rn <= 5) AS recent_sessions,
countIf(c.rn BETWEEN 6 AND 45) AS base_sessions
FROM sess s INNER JOIN cal c ON s.d = c.d
GROUP BY s.ticker
HAVING adv_base > 100000 AND dollar_recent >= 500000000 AND recent_sessions = 5 AND base_sessions >= 35
)
SELECT ticker,
round(adv_recent / adv_base, 1) AS rvol_week,
round(adv_recent / 1e6, 2) AS recent_adv_m,
round(adv_base / 1e6, 2) AS baseline_adv_m,
round(dollar_recent / 1e9, 2) AS week_dollar_bn,
round(100.0 * (week_close / week_open - 1), 1) AS week_pct
FROM per_name
ORDER BY rvol_week DESC, ticker ASC
LIMIT 8Кожен рядок читається у такому порядку:
- JLHL — у 99.2 раз перевищує власну норму, лідер списку: 16.95 млн акцій за день при базовому рівні 0.17 млн, обсяг торгів $0.68 млрд, зміна від відкриття до закриття 160.6%.
- AGEN — у 41.1 раз при базовому рівні 0.62 млн акцій, обсяг торгів $0.88 млрд; зміна за тиждень склала 54.3%.
- IONS — у 4.7 раз, але при низькому базовому рівні 1.43 млн акцій та обсязі торгів лише $2.1 млрд; зміна за тиждень -19.6%.
- ALNY — у 2.3 раз, 1.91 млн акцій за день проти звичайних 0.83 млн; зміна від відкриття до закриття -26.2%.
- BBIO — у 2.1 раз, обсяг торгів $2.25 млрд, зміна за тиждень -0.2%.
- MULL — у 2.1 раз при базовому рівні 1.96 млн акцій, обсяг торгів $0.52 млрд, зміна від відкриття до закриття -22.8%.
- HLI — у 1.9 раз, 0.9 млн акцій за день, обсяг $0.61 млрд; зміна за тиждень 5.6%.
- QGEN — восьмий і останній рядок, у 1.8 раз при обсязі торгів $0.76 млрд та зміні 8.7%.
Напрямок руху не впливає на рейтинг, що підтверджують два крайні стовпці: лідер списку завершив тиждень зі зміною 160.6% від ціни відкриття, тоді як восьма позиція показала зміну 8.7% від своєї ціни відкриття; однакові фільтри, протилежні результати. Висока активність торгів свідчить про те, що float акції проходить справжнє випробування; це не вказує на те, яка сторона цього випробування виявилася сильнішою.
Як розраховується мультиплікатор
Візьмемо акцію, середня кількість торгів якої за попередні сорок сесій становила 200,000 акцій на день. Протягом останнього тижня обсяги торгів складали 1,000,000, потім 1,400,000, потім 900,000, потім 1,100,000, а потім 600,000 акцій — середній показник за п'ять сесій становить 1,000,000. Поділимо: 1,000,000 ÷ 200,000 = 5.0x. Якщо взяти для цієї ж акції базовий показник у два мільйони акцій, то той самий тиждень дасть результат 0.5x. Чисельник — це показник за цей тиждень; знаменник — це типовий рівень торгов акції. (Саме знаменник є середнім денним обсягом, що вимірюється за сорок сесій, а не за стандартні двадцять.)
Чому сорок сесій? Це триває приблизно два календарні місяці — цього достатньо, щоб один попередній сплеск не домінував у знаменнику, але при цьому період достатньо короткий, щоб описувати стан акції на сьогодні. Чому п'ять для чисельника? Це повний тиждень, тому одна сесія з зупинкою торгів або одна окрема блокова угода не змінять показник кардинально.
Ця арифметика містить чесне попередження: чим менший базовий показник, тим дешевшим є мультиплікатор. Лідер цього тижня має базовий показник лише у 0.17M акцій на день — за такого обсягу одна перевантажена сесія підвищує весь середній тижневий показник, саме тому рада вимагає шестизначного базового показника та тижневого обсягу у $500M, перш ніж назва компанії взагалі з'явиться у списку.
Наскільки рідкісним є такий тиждень?
Мультиплікатор має значення лише відносно розподілу, з якого він походить. Ті самий ринок, той самий період, усі відповідні активи згруповані за їхнім мультиплікатором:
Точний SQL-код для кожного числа
WITH sess AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
sum(toFloat64(volume)) AS vol,
sum(toFloat64(close) * toFloat64(volume)) AS dollars
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 70 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
GROUP BY ticker, d
),
cal AS (
SELECT d, row_number() OVER (ORDER BY d DESC) AS rn
FROM (SELECT DISTINCT d FROM sess)
),
per_name AS (
SELECT s.ticker AS ticker,
avgIf(s.vol, c.rn <= 5) AS adv_recent,
avgIf(s.vol, c.rn BETWEEN 6 AND 45) AS adv_base,
sumIf(s.dollars, c.rn <= 5) AS dollar_recent,
countIf(c.rn <= 5) AS recent_sessions,
countIf(c.rn BETWEEN 6 AND 45) AS base_sessions
FROM sess s INNER JOIN cal c ON s.d = c.d
GROUP BY s.ticker
HAVING adv_base > 100000 AND dollar_recent >= 500000000 AND recent_sessions = 5 AND base_sessions >= 35
),
scored AS (
SELECT ticker,
multiIf(adv_recent / adv_base >= 10, 1,
adv_recent / adv_base >= 5, 2,
adv_recent / adv_base >= 3, 3,
adv_recent / adv_base >= 2, 4,
adv_recent / adv_base >= 1.5, 5,
adv_recent / adv_base >= 1, 6, 7) AS bucket_key
FROM per_name
),
buckets AS (
SELECT arrayJoin([(1, '10x or more'), (2, '5x to 10x'), (3, '3x to 5x'), (4, '2x to 3x'),
(5, '1.5x to 2x'), (6, '1x to 1.5x'), (7, 'below 1x')]) AS bk
)
SELECT bk.2 AS rvol_bucket,
countIf(scored.bucket_key = bk.1) AS names,
round(100.0 * countIf(scored.bucket_key = bk.1) / count(), 1) AS pct_of_universe,
count() AS universe_names
FROM scored CROSS JOIN buckets
GROUP BY bk
ORDER BY bk.1 ASCЦього тижня 647 акцій та ETF перевищили свої показники. З них 2 торгувалися у десять разів вище за власну норму або більше — це 0.3% від загальної кількості. Ще 0 потрапили у діапазон від п'яти до десяти разів, а 1 — у діапазон від трьох до п'яти разів. Наведений вище список лідерів складено з цієї невеликої верхівки. Нижче 3 активів торгувалися у два-три рази вище за власну норму (0.5% від загальної кількості), а 5 потрапили у діапазон від одного з половиною до двох разів (0.8%). Ще 19 активів продемонстрували лише помірне зростання у діапазоні від одного до одного з половиною разів, що становить 2.9% від відповідних активів.
Інший кінець таблиці — це те, що ніхто не робить скріншотів: 617 активів — 95.4% від загальної кількості — цього тижня торгувалися нижче свого середнього значення за сорок сесій. Це звичайний стан ринку, і саме це робить верхівку списку справжнім відхиленням, а не похибкою округлення.
Чи зберігається нетиповий обсяг торгу?
Існує думка, що нетиповий обсяг зберігається протягом кількох днів, тому назва на початку такого списку зазвичай вже пройшла основний рух. Це можна перевірити. Для кожного з восьми лідерів: скільки з п'яти сесій мали обсяг у два рази вищий за базовий або краще, наскільки великою була одна наймасштабніша сесія, і скільки сесій відділяло цю наймасштабнішу сесію від останньої сесії тижня.
Точний SQL-код для кожного числа
WITH sess AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
sum(toFloat64(volume)) AS vol,
sum(toFloat64(close) * toFloat64(volume)) AS dollars
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 70 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
GROUP BY ticker, d
),
cal AS (
SELECT d, row_number() OVER (ORDER BY d DESC) AS rn
FROM (SELECT DISTINCT d FROM sess)
),
per_name AS (
SELECT s.ticker AS ticker,
avgIf(s.vol, c.rn <= 5) AS adv_recent,
avgIf(s.vol, c.rn BETWEEN 6 AND 45) AS adv_base,
sumIf(s.dollars, c.rn <= 5) AS dollar_recent,
countIf(c.rn <= 5) AS recent_sessions,
countIf(c.rn BETWEEN 6 AND 45) AS base_sessions
FROM sess s INNER JOIN cal c ON s.d = c.d
GROUP BY s.ticker
HAVING adv_base > 100000 AND dollar_recent >= 500000000 AND recent_sessions = 5 AND base_sessions >= 35
),
leaders AS (
SELECT ticker, adv_recent / adv_base AS rvol_week, adv_base
FROM per_name
ORDER BY rvol_week DESC, ticker ASC
LIMIT 8
),
daily AS (
SELECT l.ticker AS ticker,
l.rvol_week AS rvol_week,
c.rn AS rn,
s.vol / l.adv_base AS rvol_day
FROM sess s
INNER JOIN cal c ON s.d = c.d
INNER JOIN leaders l ON s.ticker = l.ticker
WHERE c.rn <= 5
)
SELECT ticker,
round(max(rvol_week), 1) AS week_rvol,
countIf(rvol_day >= 2) AS days_above_2x,
round(max(rvol_day), 1) AS peak_day_rvol,
argMax(rn, (rvol_day, -rn)) - 1 AS sessions_since_peak
FROM daily
GROUP BY ticker
ORDER BY days_above_2x ASC, peak_day_rvol ASC, ticker ASCЯкщо сортувати за стійкістю, то найменш стійка назва в списку, HLI, перевищила свій базовий рівень у два рази у 1 з п'яти сесій, досягнувши піку у 6.2x. Найбільш стійка, JLHL, зробила це у 3 з п'яти, з піком у 404.6x. Це багатосесійні події, а не разові операції — саме це є механічною причиною, чому тижневий та денний списки зазвичай містять одні й ті самі акції.
Остання колонка стосується часових показників: кількість сесій між наймасштабнішим днем та останньою сесією тижня — 4 для HLI, 4 для JLHL. Якщо цей розрив перевищує нуль, то найактивніші торги вже відбулися до закриття тижня. Цей список описує тиждень, що завершився; він не прогнозує наступний.
Пятнадцять сесій лідера по днях
Середнє значення за тиждень не відображає реальну картину. Нижче наведено щоденний відносний об'єм поточного лідера — кількість акцій за кожною сесією порівняно з тим самим базовим показником за сорок сесій — разом із зміною ціни від відкриття до закриття за останні п'ятнадцять сесій:
Точний SQL-код для кожного числа
WITH sess AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
sum(toFloat64(volume)) AS vol,
sum(toFloat64(close) * toFloat64(volume)) AS dollars,
argMin(toFloat64(open), toTimeZone(window_start, 'America/New_York')) AS day_open,
argMax(toFloat64(close), toTimeZone(window_start, 'America/New_York')) AS day_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 70 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
GROUP BY ticker, d
),
cal AS (
SELECT d, row_number() OVER (ORDER BY d DESC) AS rn
FROM (SELECT DISTINCT d FROM sess)
),
per_name AS (
SELECT s.ticker AS ticker,
avgIf(s.vol, c.rn <= 5) AS adv_recent,
avgIf(s.vol, c.rn BETWEEN 6 AND 45) AS adv_base,
sumIf(s.dollars, c.rn <= 5) AS dollar_recent,
countIf(c.rn <= 5) AS recent_sessions,
countIf(c.rn BETWEEN 6 AND 45) AS base_sessions
FROM sess s INNER JOIN cal c ON s.d = c.d
GROUP BY s.ticker
HAVING adv_base > 100000 AND dollar_recent >= 500000000 AND recent_sessions = 5 AND base_sessions >= 35
),
leader AS (
SELECT ticker, adv_base
FROM per_name
ORDER BY adv_recent / adv_base DESC, ticker ASC
LIMIT 1
),
path AS (
SELECT formatDateTime(s.d, '%Y-%m-%d') AS session_date,
formatDateTime(s.d, '%b %e') AS session_label,
s.vol / l.adv_base AS rvol_day,
100.0 * (s.day_close / s.day_open - 1) AS day_pct
FROM sess s
INNER JOIN cal c ON s.d = c.d
INNER JOIN leader l ON s.ticker = l.ticker
WHERE c.rn <= 15
)
SELECT session_date,
session_label,
round(rvol_day, 1) AS rvol_day,
round(day_pct, 1) AS day_pct,
round(max(rvol_day) OVER (), 1) AS peak_rvol_day
FROM path
ORDER BY session_date ASCП'ятнадцять сесій тому об'єм акцій становив 0.5 від базового рівня — це була звичайна, спокійна назва. Найбільший об'єм за цей період склав 404.6. У останню сесію, Jul 15, показник становив 0.7 зі зміною ціни від відкриття до закриття на рівні -3.5%.
Зверніть увагу на те, чого графік не робить: він не знижується рівномірно. Підвищений об'єм з'являється групами, а після піку показники можуть знову зростати, а не згасати. Саме тому твердження про те, що «об'єм вичерпується», слід перевіряти за щоденним рядом, а не припускати це. Цей самий щоденний ряд є основою для вимірювання внутрішньоденної динаміки, яка розраховується з нуля в посібнику з відносного об'єму та використовується VWAP.
Що фільтрує цей екран
Чотири правила забезпечують об'єктивність даних, і кожне з них виключає показники, які могли б зацікавити читача:
- Поріг обсягу торгів у $500M за тиждень. Один лише обсяг акцій переповнив би таблицю назвами, де мільйон акцій не є суттєвою сумою.
- Базовий рівень понад 100,000 акцій на день, щоб знаменник був реальним числом, а не похибкою округлення.
- Торгівлі щонайменше у 35 з попередніх 40 сесій, що виключає нещодавні лістинги — у нового IPO немає значущого "нормального" показника для ділення, і інакше він би займав цей список тижнями.
- Виключення повторно використаних символів: тікер, який біржі нещодавно призначили новому лістингу, через що історія постачальника даних об'єднує дві різні компанії. Його базовий показник був би фіктивним.
Правило 1 видаляє найбільш екстремальні мультиплікатори з котирувань. Ось шість найбільших об'єктів, які воно виключає:
Точний SQL-код для кожного числа
WITH sess AS (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS d,
sum(toFloat64(volume)) AS vol,
sum(toFloat64(close) * toFloat64(volume)) AS dollars
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 70 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
AND ticker NOT IN ('SPCX')
GROUP BY ticker, d
),
cal AS (
SELECT d, row_number() OVER (ORDER BY d DESC) AS rn
FROM (SELECT DISTINCT d FROM sess)
),
per_name AS (
SELECT s.ticker AS ticker,
avgIf(s.vol, c.rn <= 5) AS adv_recent,
avgIf(s.vol, c.rn BETWEEN 6 AND 45) AS adv_base,
sumIf(s.dollars, c.rn <= 5) AS dollar_recent,
countIf(c.rn <= 5) AS recent_sessions,
countIf(c.rn BETWEEN 6 AND 45) AS base_sessions
FROM sess s INNER JOIN cal c ON s.d = c.d
GROUP BY s.ticker
HAVING adv_base > 100000 AND recent_sessions = 5 AND base_sessions >= 35
AND dollar_recent > 0 AND dollar_recent < 500000000
)
SELECT ticker,
round(adv_recent / adv_base, 1) AS rvol_week,
round(dollar_recent / 1e6, 1) AS week_dollar_m,
round(dollar_recent / (adv_recent * 5), 2) AS avg_share_price,
round(adv_base / 1e6, 2) AS baseline_adv_m
FROM per_name
ORDER BY rvol_week DESC, ticker ASC
LIMIT 6SOBR торгувався 109.8x від свого нормального рівня, проте загальний обсяг за тиждень склав лише $262.4M при середній ціні акції $1.04. Наступні: ZBAO з показником 109.3x при обсязі $72M (середня ціна $0.44), WRAP з показником 51.8x при обсязі $162.5M, CPHI з показником 38.1x при обсязі $31.8M, KAPA з показником 36.7x при обсязі $9.5M, та LGPS з показником 20.2x при обсязі $57.5M. Це реальна активність, яка є справді незвичайною для цих назв — у категорії, де мультиплікатор приховує дуже малі суми грошей.
Джерела нетипового обсягу торгів
Постійні фактори, що прискорюють рух котирувань: тижні звітності — єдине заплановане джерело; корпоративні події — злиття, пропозиції, включення або виключення з індексів — які створюють механічний обсяг, не пов'язаний з ринковими настроями; динаміка squeeze, коли обсяг зростає разом зі швидкістю зміни ціни, що описано в поясненні до short squeeze; та нові лістинги, які домінують у котируваннях до моменту стабілізації обсягу вільних акцій. Котирування будь-якого тижня зазвичай є сумішшю цих факторів та одного-двох справжніх загадок — і саме ці загадки варті додаткової уваги.
FAQ щодо аномальних обсягів
Що вважається аномальним обсягом для акції?
Офіційного порогу не існує, тому використовуйте розподіл: з 647 назв, що пройшли через нижню межу цієї сторінки цього тижня, лише 2 торгувалися у 10 разів вище за власну норму, а 95.4% торгувалися нижче за своє середнє значення. Будь-який показник вище приблизно у два рази вже входить до найменшого відсотка ринку за певний тиждень.
Аномальний обсяг — це бичачий чи ведмежий сигнал?
Ні — це лише ознака уваги, а увага супроводжує як ралі, так і обвали. Цього тижня лідер дошки завершив п'ять сесій на 160.6% від ціни відкриття, а восьма назва завершила на 8.7%; обидва показники відповідають однаковим критеріям вимірювання.
Як довго триває аномальний обсяг?
Зазвичай довше ніж один день. Панель стійкості підраховує кількість сесій для кожної назви на дошці, що перевищують базовий показник у два рази: цього тижня вони варіюються від 1 з п'яти (HLI) до 3 з п'яти (JLHL), і наймасичніша сесія зазвичай припадає на період до завершення тижня, а не на його останній день.
Чому у списку використовується поріг за обсягом у доларах?
Фільтр за кількістю акцій без такого порогу переповнюється дешевими тікерами, де кратність величезна, а реальні гроші — ні: найбільша назва, що була виключена цього тижня, торгувалася у 109.8x від своєї норми на загальну суму $262.4M при середній ціні $1.04 за акцію. Щотижневий поріг у $500M дозволяє кожному рядку в дошці залишатися економічно значущим.
Чи відображається аномальний обсяг акцій на ринку опціонів?
Часто так — значні обсяги торгів акціями та опціонами зазвичай з'являються одночасно для одних і тих самих назв, тому трейдери стежать за обома ринками. Проте активність в опціонах вимірюється інакше: кількість угод у контрактах — це показник потоку, тоді як відкритий інтерес (open interest) підраховує позиції, що залишаються відкритими, і ці два показники дають відповіді на різні питання — перегляньте обсяг опціонів проти відкритого інтересу, перш ніж робити висновки з оповіщення про «аномальну активність опціонів».
Кожне наведене вище число є результатом збереженого запиту з версіонуванням — розгорніть SQL під будь-якою панеллю, щоб побачити точне вимірювання, або запустіть той самий фільтр за будь-який обраний вами період на терміналі Strasmore.