Акції з низьким P/E біля 52-тижневих мінімумів
Точний фільтр акцій із низьким P/E біля 52-тижневих мінімумів, рейтинг за відстанню до мінімуму та дані про нові мінімуми після відбору.
Акції з низьким P/E поблизу 52-тижневих мінімумів потрапляють на перетині двох дуже різних фільтрів: низького trailing P/E і ціни, що перебуває біля нижньої межі власного річного діапазону. Наведений нижче фільтр задає обидві умови у вигляді числових параметрів, які можна відтворити, ранжує відібрані акції за відстанню до мінімуму та показує query під кожною панеллю. Важливе застереження: такий список принаймні не рідше збирає falling knives, ніж недооцінені акції. Окремий розділ нижче пояснює арифметику цього підходу.
Що вважається близькістю до 52-тижневого мінімуму
52-тижневий мінімум — це найнижча ціна, за якою акція торгувалася протягом останнього року. Відстань до мінімуму переводить цей показник у відсоток: остання ціна закриття, поділена на 52-тижневий мінімум, мінус одиниця. Якщо акція закрилася на рівні 55 за 52-тижневого мінімуму 50, вона перебуває на 10% вище мінімуму. Ця арифметика повністю визначає ранжування, а в нашому матеріалі про 52-тижневі максимуми та мінімуми діапазон розглянуто докладніше.
Коефіцієнт P/E — це ціна, поділена на прибуток на акцію за останні дванадцять місяців. Він походить із таблиці щоденних коефіцієнтів stocks_ratios, яка є тим самим джерелом, що й для нашого фільтра акцій із найвищою dividend yield. Ціновий діапазон походить із stocks_daily_aggs, де кожній акції та торговій сесії відповідає один рядок.
Фільтр визначають чотири параметри. Кожен із них є умовним, доки його не зафіксовано:
- відстань до 52-тижневого мінімуму — не більше 10%;
- trailing P/E — вище нуля, але не більше 15;
- market cap — не менше $10 billion;
- середній денний обсяг — не менше 1,000,000 акцій.
Останні два параметри залишають у списку компанії з реальним ринком з обох боків. Компанія вартістю $40 million, акції якої торгуються по 20,000 штук на день, може мати будь-який коефіцієнт.
Точний SQL-код для кожного числа
WITH ratios AS
(
SELECT
ticker,
argMax(price_to_earnings, date) AS pe,
argMax(market_cap, date) AS mcap,
argMax(average_volume, date) AS adv
FROM global_markets.stocks_ratios
WHERE date >= today() - 14
AND ticker NOT IN ('SPCX')
GROUP BY ticker
),
band AS
(
SELECT
ticker,
min(low) AS low_52w,
argMax(close, date) AS last_close
FROM global_markets.stocks_daily_aggs
WHERE date >= today() - 372
AND ticker NOT IN ('SPCX')
GROUP BY ticker
)
SELECT
b.ticker AS ticker,
round(toFloat64(b.last_close) / toFloat64(b.low_52w) * 100 - 100, 1) AS pct_above_low,
round(r.pe, 1) AS pe_ratio
FROM band AS b
INNER JOIN ratios AS r ON r.ticker = b.ticker
WHERE r.mcap >= 10000000000
AND r.adv >= 1000000
AND r.pe > 0
AND r.pe <= 15
AND b.low_52w > 0
AND toFloat64(b.last_close) / toFloat64(b.low_52w) <= 1.10
ORDER BY pct_above_low ASC, b.ticker ASC
LIMIT 15У панелі наведено 6 назв, які за цими параметрами найближчі до власних мінімумів. Максимальний розмір списку — п’ятнадцять рядків. VICI розташована найближче до власної нижньої межі: її ціна на 2.3% вища за найнижчу ціну за останній рік, а trailing multiple становить 10.5. На іншому кінці панелі BRK.B перебуває на 9.7% вище власного мінімуму.
Як ранжувати список
Сортування — це крок, який більшість фільтрів пропускає. Ранжування за P/E виводить нагору коефіцієнт, що виглядає найдешевшим, але приховує положення ціни в діапазоні. Ранжування за відстанню до мінімуму виводить нагору акції, найближчі до нового мінімуму, але приховує їхню оцінку. Панель сортує акції за зростанням відстані до мінімуму, а коефіцієнт показує в наступному стовпці. Так обидва показники залишаються в одному рядку. За однакових значень застосовується алфавітне сортування. Це важливо, коли кілька назв після округлення мають однакове значення.
Для відтворення потрібні чотири вхідні дані: ряд щоденних цін закриття за повний останній рік, показник trailing EPS, кількість акцій для розрахунку market cap і середній обсяг. Далі потрібні лише віднімання та ділення.
Скільки назв проходять фільтр, залежить від параметрів
Зміна одного параметра змінює розмір списку. У наведеній нижче панелі мінімальні значення market cap і ліквідності залишаються незмінними. Діапазон відстані змінюється від 5% до 30%, а кількість відібраних назв показано для двох граничних значень P/E.
Точний SQL-код для кожного числа
WITH ratios AS
(
SELECT
ticker,
argMax(price_to_earnings, date) AS pe,
argMax(market_cap, date) AS mcap,
argMax(average_volume, date) AS adv
FROM global_markets.stocks_ratios
WHERE date >= today() - 14
AND ticker NOT IN ('SPCX')
GROUP BY ticker
),
band AS
(
SELECT
ticker,
min(low) AS low_52w,
argMax(close, date) AS last_close
FROM global_markets.stocks_daily_aggs
WHERE date >= today() - 372
AND ticker NOT IN ('SPCX')
GROUP BY ticker
),
universe AS
(
SELECT
b.ticker AS ticker,
toFloat64(b.last_close) / toFloat64(b.low_52w) * 100 - 100 AS pct_above_low,
r.pe AS pe
FROM band AS b
INNER JOIN ratios AS r ON r.ticker = b.ticker
WHERE r.mcap >= 10000000000
AND r.adv >= 1000000
AND r.pe > 0
AND b.low_52w > 0
)
SELECT
concat('within ', toString(cutoff), '%') AS distance_band,
countIf(pct_above_low <= cutoff AND pe <= 15) AS names_pe_under_15,
countIf(pct_above_low <= cutoff AND pe <= 25) AS names_pe_under_25
FROM
(
SELECT
pct_above_low,
pe,
arrayJoin([5, 10, 15, 20, 25, 30]) AS cutoff
FROM universe
)
GROUP BY cutoff
ORDER BY cutoffЗа параметрами першої панелі — діапазону 10% і граничного P/E 15 — загалом проходять 7 large caps. Якщо звузити діапазон до 5%, залишаються 1. Якщо розширити його до 30%, кількість зростає до 43, а підвищення граничного P/E до 25 за тієї самої ширини дає 137. Жодне з цих значень не є об’єктивно правильним. Це параметри, і чесний спосіб публікувати фільтр — чітко вказати, на яких значеннях їх зафіксовано.
52-тижневий мінімум є рухомою межею
Сам мінімум змінюється. Це ковзний показник: у міру просування календаря старий мінімум випадає з періоду, а нижня межа підвищується навіть у день, коли з акцією нічого не відбувалося. Якщо відстежувати одну назву щомісяця, це стає очевидним. У наведеній нижче панелі KO, велика компанія широкого споживчого ринку, порівнюється з найнижчою ціною за останні дванадцять місяців.
Точний SQL-код для кожного числа
SELECT
formatDateTime(m, '%Y-%m') AS month,
round(toFloat64(month_close), 2) AS close_price,
round(toFloat64(trailing_low), 2) AS trailing_12m_low,
round(toFloat64(month_close) / toFloat64(trailing_low) * 100 - 100, 1) AS pct_above_low
FROM
(
SELECT
m,
month_close,
min(month_low) OVER (ORDER BY m ASC ROWS BETWEEN 11 PRECEDING AND CURRENT ROW) AS trailing_low
FROM
(
SELECT
toStartOfMonth(date) AS m,
argMax(close, date) AS month_close,
min(low) AS month_low
FROM global_markets.stocks_daily_aggs
WHERE ticker = 'KO'
AND date >= today() - 1100
GROUP BY m
)
)
WHERE m >= toStartOfMonth(today() - 400)
ORDER BY mСтаном на 2026-08 KO закрилася на рівні $87.71 проти мінімуму за останні дванадцять місяців $65.35. Відстань становила 34.2%. Різниця між двома ціновими лініями — це показник, який вимірює цей фільтр. Якщо лінія мінімуму підвищується, а лінія ціни закриття залишається пласкою, вимірювана відстань скорочується без зміни ціни акції.
Чому фільтр збирає falling knives
Механізм є арифметичним. Літера E у P/E означає trailing earnings, і цей показник оновлюється чотири рази на рік після звітності компанії. Літера P оновлюється щосекунди, поки ринок відкритий. Якщо ціна знижується протягом кварталу, а показник прибутку залишається незмінним до наступного звіту, multiple щотижня знижується сам по собі. Коефіцієнт виглядає найдешевшим саме тоді, коли ціна найбільше віддалилася від останнього оприлюдненого показника. Коли наступний звіт показує зниження прибутку, multiple знову розширюється навіть за нижчої ціни. Насправді акція ніколи не була дешевою. Такий сценарій називається value trap.
Циклічні компанії демонструють протилежну картину. Виробник автомобілів або забудовник зазвичай має найнижчий trailing P/E на піку циклу прибутків, коли trailing EPS досягає максимуму, і найвищий — на дні циклу.
Щоб виміряти цю закономірність, потрібно відтворити фільтр станом на минулу дату, а потім відстежити кожну назву, яка його пройшла. Для цього потрібен trailing multiple для кожного ticker саме на ту минулу дату, а не лише останнє значення. Рядки stocks_ratios, що лежать в основі наведених панелей, зчитуються за останньою доступною датою для кожного ticker. Тому ця сторінка описує механізм, але не наводить показник подальшої динаміки, оскільки не може показати query для його розрахунку. Одна когорта з однієї стартової дати все одно була б лише одним спостереженням: якщо почати в іншому місяці, числа зміняться. Список не містить жодного висновку про подальшу динаміку ціни.
Що не враховує низький P/E
- Який саме прибуток. Trailing EPS включає одноразові статті, продаж активів і юридичні виплати. Один надзвичайно прибутковий квартал знижує multiple на рік, навіть коли отримані кошти вже витрачені.
- Галузевий контекст. Банки, страховики, автовиробники та нафтопереробні компанії мають структурно нижчі multiple, ніж software-компанії. Єдине граничне значення для всіх галузей заповнює список тими самими кількома секторами.
- Баланс. P/E не враховує борг. Дві компанії з однаковим multiple, але дуже різним рівнем leverage, не перебувають на однаковому рівні оцінки.
- Збитки. Для компанії з від’ємним прибутком P/E не має змістовного значення, тому вона ніколи не з’являється в цьому списку. Відсутність у списку не є висновком щодо компанії.
Два сусідні списки добре доповнюють цей. Найбільші рухи акцій цього місяця показує, які назви пройшли найбільшу відстань за останній місяць, а акції з найнижчою волатильністю демонструє протилежний профіль.
Примітки та визначення даних
- Ціни походять із
stocks_daily_aggs, де кожній акції та торговій сесії відповідає один рядок. 52-тижневий мінімум — це мінімальне значення колонки щоденного мінімуму за останні 372 календарні дні. - Multiple, market cap і середній обсяг походять із
stocks_ratios, де для кожного ticker береться найновіший рядок. - Split або велика спеціальна distribution протягом періоду змінює необкоригований ціновий діапазон. Це варто перевіряти для будь-якої назви, щодо якої така подія відбулася протягом останнього року.
- Фільтр вимагає позитивного trailing multiple, тому збиткові компанії в ньому не з’являються.
FAQ
Що означає, коли акція перебуває поблизу 52-тижневого мінімуму?
Це означає, що поточна ціна близька до найнижчої ціни, за якою акція торгувалася протягом останнього року. Відстань до мінімуму — це остання ціна закриття, поділена на 52-тижневий мінімум, мінус одиниця, виражена у відсотках.
Який P/E вважається низьким?
Фіксованої межі немає. У фільтрах trailing multiple часто обмежують значенням 15, а для суворішого відбору — 10. Крім того, multiple достатньо відрізняються за галузями, тому єдине граничне значення для всього ринку заповнює список тими самими кількома секторами.
Чи є акція з низьким P/E поблизу 52-тижневого мінімуму вигідною покупкою?
Жоден фільтр не дає відповіді на це запитання, і ця сторінка також не дає її. Дві умови описують минуле: скільки ринок платить за долар уже оприлюдненого прибутку та де ціна перебуває у власному річному діапазоні. Жодна з них не описує подальшу динаміку.
Що таке value trap?
Value trap — це акція, яка виглядає дешевою за trailing multiple, але продовжує падати. Прибуток на акцію оновлюється щокварталу, а ціна — безперервно. Тому падіння ціни на тлі незмінного trailing E поступово знижує multiple, а наступний звіт може підвищити цей multiple навіть за нижчої ціни.
Кожна панель містить query, за допомогою якого її побудовано. Відкрийте панель, змініть граничний P/E або діапазон відстані, і список буде перебудовано за вашими параметрами в терміналі Strasmore.