Блог им. empenoso
Хочу поделиться своим опытом разработки скринера и бектестера для анализа акций на основе фундаментальных данных. Это не только автоматизация, но и способ глубже разобраться в инвестиционных стратегиях, которые можно заложить в алгоритм.
Фундаментальный анализ — это метод оценки акций, основанный на финансовых показателях компаний, таких как прибыль, выручка, коэффициенты ликвидности и другие экономические параметры. В отличие от технического анализа, который фокусируется на движении цен, фундаментальный анализ помогает определить реальную стоимость компании и ее перспективы в долгосрочной перспективе.
При этом фундаментальный анализ не так популярен среди частных инвесторов, как технический анализ, поскольку требует глубокого изучения отчетности, макроэкономических факторов и финансовых коэффициентов.
Хочу создать собственный скринер и бектестер для анализа акций по фундаментальным показателям. Чтобы сделать это правильно, нужно понимать не только программирование, но и сам предмет — фундаментальный анализ. В этой статье я разбираюсь какие вообще существуют подходы, а также ищу источники данных.
Буду использовать для анализа сразу два рынка: США и РФ.
США: здесь торгуется более 10 тысяч компаний, а объем открытых данных позволяет глубже изучать инвестиционные стратегии.
РФ: рынок значительно меньше (всего несколько сотен компаний), но, поскольку мы живем здесь, он остается актуальным для анализа и инвестиций.
В идеале хочу использовать лучшие практики фундаментального анализа на глобальном рынке и адаптировать их к российским реалиям.
Американская ассоциация частных инвесторов (AAII) — это независимая некоммерческая организация, которая помогает частным инвесторам принимать обоснованные решения. Она предлагает исследования, аналитические материалы и инструменты, включая формализованные наборы готовых стратегий по книгам известных инвесторов. У них это называется Guru Screens и это подборка из 42 инвестиционных стратегий.
Хотя Guru Screens позволяют применять стратегии на практике, нет единого толкования книжной стратегии и конечно требуется адаптации к современным реалиям.
Я выбрал пять стратегий, основанных на трудах известных инвесторов:
Weiss Blue Chip Div Yield – ориентирована на дивидендные акции крупных компаний.
Lakonishok – стратегия, основанная на стоимостном инвестировании.
Wanger (Revised) – фокусируется на малых компаниях с потенциалом роста.
O'Neil's CAN SLIM Revised 3rd Edition – сочетает фундаментальный и технический анализ.
Buffett: Hagstrom – следует принципам Уоррена Баффетта, отбирая недооцененные компании с высоким потенциалом.
Стратегия Weiss Blue Chip Div Yield фокусируется на инвестициях в «голубые фишки» с высокими дивидендами. Разработана Джеральдин Вайсс, известной как «первая леди дивидендного инвестирования». Стратегия основана на выборе недооцененных компаний с высокой дивидендной доходностью, стабильным ростом дивидендов и сильной финансовой надежностью.
Критерии стратегии:
Только крупные американские компании (blue chips).
Дивиденды:
Выплаты не менее 25 лет.
Рост дивидендов в 5 из последних 12 лет.
Коэффициент выплат ≤ 20%.
Финансовая устойчивость:
Отношение долга к капиталу ≤ 20% (коммунальные компании — 50%).
Текущая ликвидность > 2.
Рост EPS в 7 из последних 12 лет.
Оценка стоимости: Продажа при снижении дивидендной доходности до минимума или ухудшении финансов.
Я настроил критерии на скринере finviz.com.
Допущения: без истории и рейтингов, только текущий момент.
Стратегия Lakonishok ориентирована на поиск недооцененных компаний, которые временно не пользуются популярностью у инвесторов, но демонстрируют признаки роста. Основная идея заключается в том, что рынок часто переоценивает «звездные» акции и недооценивает компании, которые испытывали трудности, но начинают восстанавливаться. Метод основан на анализе четырех ключевых мультипликаторов, а также динамики цены и прогнозов аналитиков.
Для отбора акций используются следующие параметры:
Цена акции ниже средних значений по отрасли по одному из показателей: P/B, P/CF, P/E или P/S.
Относительная сила за 6 месяцев > 0 (признак роста).
Относительная сила за 3 месяца > 0 (дополнительное подтверждение роста).
Положительный сюрприз прибыли (разница между фактическими и прогнозными показателями).
Рост консенсус-прогноза аналитиков за последние 6 месяцев.
Подход Lakonishok позволяет находить недооцененные компании, способные демонстрировать высокую доходность в долгосрочной перспективе.
Я настроил критерии на скринере finviz.com.
Допущения: выбраны не верхние проценты по рынку, а заданы фиксированные значения.
Стратегия Wanger (Revised), впервые представленная в 1997 году, направлена на снижение рисков при инвестировании в акции малых компаний. Ее ключевой принцип — поиск динамично развивающихся компаний с устойчивыми финансовыми показателями, высоким потенциалом роста прибыли и разумной оценкой. Подход ориентирован на долгосрочное инвестирование и позволяет находить перспективные активы среди компаний с малой капитализацией, избегая завышенно оцененных и нестабильных бизнесов.
Критерии стратегии
Рыночная капитализация: от $100 млн до $2 млрд.
Рост прибыли: ожидаемый рост не менее 15% в год на ближайшие 5 лет.
Оценка: P/E < 30, P/S < 3.
Финансовая устойчивость: долг/собственный капитал < 1, текущая ликвидность > 1.
Я настроил критерии на скринере finviz.com.
Методология CAN SLIM, разработанная Уильямом О’Нилом, сочетает фундаментальный и технический анализ для выявления акций с наибольшим потенциалом роста. Эта стратегия ориентирована на быстрорастущие компании, которые уже демонстрируют высокие показатели доходности. Она учитывает не только финансовые показатели, но и рыночные тенденции, что делает ее одной из самых популярных среди частных инвесторов.
Критерии стратегии:
Текущие доходы: рост прибыли за три года — не менее 25%.
Годовая прибыль: квартальный рост прибыли — минимум 25%.
Инновации: наличие новых продуктов или услуг, способных стимулировать рост.
Спрос и предложение: высокая институциональная заинтересованность и относительная сила.
Рыночное лидерство: инвестиции в компании-лидеры отрасли.
Тренд рынка: покупки только в условиях общего бычьего тренда.
Я настроил критерии на скринере finviz.com.
Эта стратегия основана на принципах инвестирования Уоррена Баффетта, описанных в книге Роберта Хагстрома. Она ориентирована на поиск недооцененных компаний с устойчивым ростом, высокой рентабельностью и разумной долговой нагрузкой. В отличие от краткосрочного трейдинга, подход Баффетта предполагает долгосрочное владение качественными активами.
Критерии стратегии:
ROE: минимум 15% – отражает эффективность управления капиталом.
Рост прибыли на акцию: минимум 10% – показатель устойчивого развития.
Соотношение долга к капиталу: не более 50% – ограничение финансовых рисков.
P/E: не выше 20 – избежание переоцененных активов.
Я настроил критерии на скринере finviz.com.
Краткие выводы по стратегиям от гуруКонечно всё это не рекомендации, а просто повод задуматься о том, что существуют разные стратегии и множество из них публичны.
Не все стратегии можно достоверно повторить на бесплатных скринерах, потому что часть нужных параметров отсутствует, но это не повод опускать руки и можно подробнее познакомиться с методами и логикой, которые авторы используют.
И конечно надо проверить заинтересовавшую вас стратегию на истории — как выборки составленные в прошлом показывали результаты в настоящем.
Для этого я и хочу написать свой скринер и бэктестер.
Это моя субъективная оценка, разбито по категориям как в скринере Яху Финанс:
Price (End of Day) — цена на конец дня
Market Cap (Market Capitalization) – рыночная капитализация
Общая стоимость компании на фондовом рынке, определяется как цена акции × количество акций.
Эти коэффициенты помогают инвесторам оценить стоимость компании и её финансовую устойчивость.
ROA (Return on Assets) – Рентабельность активов
Показывает, насколько эффективно компания использует свои активы для получения прибыли.
🟰 > 5%: эффективно использующая свои активы компания должна генерировать не менее 5% прибыли. Низкий ROA может означать плохое использование активов или неэффективную деятельность.
ROE (Return on Equity) – Рентабельность собственного капитала
Оценивает прибыльность компании относительно её собственного капитала.
🟰 > 10%, в идеале > 15%: более высокий ROE показывает, что компания эффективно генерирует прибыль из акционерного капитала.
Debt/Equity (Debt-to-Equity Ratio) – Коэффициент долг/капитал
Соотношение общего долга к собственному капиталу.
🟰 < 1, в идеале < 0,5: более низкий коэффициент указывает на то, что компания не слишком полагается на заемные средства для финансирования операций, что снижает финансовый риск. Компании с D/E > 1 имеют высокую долговую нагрузку, что может быть рискованно в условиях роста процентных ставок.
Current Ratio – Коэффициент текущей ликвидности
Показывает способность компании погашать краткосрочные обязательства.
🟰1,5 – 3: гарантирует, что компания может выполнить свои краткосрочные обязательства. Коэффициент ниже 1,5 может указывать на проблемы с ликвидностью, тогда как коэффициент выше 3 может указывать на неэффективное распределение капитала.
Gross Profit Margin – Валовая рентабельность
Доля валовой прибыли в выручке компании. Чем выше, тем эффективнее производство.
🟰> 30%: более высокая валовая маржа означает, что у компании сильная ценовая политика и эффективность затрат. Это указывает на конкурентное преимущество в производстве или услугах.
Dividend Yield – Дивидендная доходность
Процент дивидендов к цене акции. Чем выше, тем больше компания платит акционерам.
🟰 > 2%, но < 8%: умеренная дивидендная доходность обеспечивает доход. Чрезвычайно высокая дивидендная доходность в долларах (> 8%) может указывать на падение цены акций из-за бизнес-рисков.
Этот раздел отражает финансовые результаты компании за определённый период.
EPS Growth (Earnings Per Share Growth) – Рост прибыли на акцию
Показывает рост прибыли на акцию по сравнению с предыдущим периодом.
🟰> 10% год за годом: растущие прибыли указывают на здоровый и расширяющийся бизнес. Компании с постоянным ростом EPS привлекают инвесторов и оправдывают более высокую оценку с течением времени.
Sales Growth (Revenue Growth) – Рост выручки
Изменение выручки компании по сравнению с прошлым периодом. Высокий рост указывает на развитие компании.
🟰5% год за годом: стабильный рост выручки поддерживает долгосрочную устойчивость бизнеса. Если выручка стагнирует или снижается, рост EPS может быть неустойчивым.
Operating Margin (Operating Profit Margin) – Операционная рентабельность
Процент выручки, остающийся после вычета операционных расходов (зарплаты, аренда, амортизация и т.д.).
🟰> 10%, в идеале > 15%: более высокая операционная маржа указывает на эффективную работу и лучший контроль над расходами. Она также обеспечивает подушку безопасности во время экономических спадов.
Net Profit Margin – Чистая рентабельность
Процент выручки, остающийся после вычета всех расходов, включая налоги и проценты.
🟰> 10%, в идеале > 15%: высокая чистая маржа показывает сильную прибыльность после учета всех расходов, включая проценты и налоги.
Раздел оценивает эффективность использования активов и капитала.
P/E (Price-to-Earnings Ratio) – Коэффициент цена/прибыль
Показывает, во сколько раз цена акции превышает прибыль на акцию (EPS).
🟰< 15 (в идеале от 8 до 12): более низкий P/E предполагает, что акции недооценены относительно их прибыли. P/E < 5 может сигнализировать о финансовых трудностях, тогда как P/E > 20 может указывать на переоценку компании.
P/B (Price-to-Book Value Ratio) – Коэффициент цена/балансовая стоимость
Отношение рыночной цены акции к балансовой стоимости компании.
🟰< 1,5, в идеале < 1: P/B ниже 1 предполагает, что акция торгуется ниже своей балансовой стоимости, что указывает на потенциальную недооценку. Однако акции с низким P/B могут быть и в отраслях, находящихся в упадке.
P/S (Price-to-Sales Ratio) – Коэффициент цена/выручка
Соотношение рыночной капитализации к выручке компании.
🟰< 2, в идеале < 1: более низкий P/S означает, что выручка компании не переоценена рынком.
Price/Cash (Price-to-Cash Flow Ratio, P/CF) – Цена к денежному потоку
Показывает, сколько инвесторы платят за каждый доллар денежных потоков компании.
🟰< 10: более низкий P/CF означает, что инвесторы платят меньше за каждый доллар денежного потока, что делает акции более привлекательными.
Получение фундаментальных данных по российскому фондовому рынку — непростая задача, поскольку доступных API значительно меньше, чем для американских акций. Тем не менее, существует несколько источников, которые можно использовать для автоматизации анализа.
T-Invest API https://russianinvestments.github.io/investAPI/swagger-ui/#/
T-Invest API предоставляет данные о российских акциях, включая фундаментальные показатели. Но выдаёт только текущие — истории нет, для скринера это АПИ не подходит.
Запрос: /tinkoff.public.invest.api.contract.v1.InstrumentsService/GetAssetFundamentals
Пример ответа:
<code class="json">GetAssetFundamentalsResponse(fundamentals=[ StatisticResponse(asset_uid='40d89385-a03a-4659-bf4e-d3ecba011782', currency='RUB', market_capitalization=6878249241240.0, high_price_last_52_weeks=330.45, low_price_last_52_weeks=219.2, average_daily_volume_last_10_days=65639361.43, average_daily_volume_last_4_weeks=60348494.76, beta=0.8, free_float=0.48, forward_annual_dividend_yield=0.0, shares_outstanding=21586948000.0, revenue_ttm=8676400000000.0, ebitda_ttm=0.0, net_income_ttm=1580300000000.0, eps_ttm=73.21, diluted_eps_ttm=0.0, free_cash_flow_ttm=0.0, five_year_annual_revenue_growth_rate=0.0, three_year_annual_revenue_growth_rate=33.48, pe_ratio_ttm=4.35, price_to_sales_ttm=0.79, price_to_book_ttm=0.96, price_to_free_cash_flow_ttm=0.0, total_enterprise_value_mrq=0.0, ev_to_ebitda_mrq=0.0, net_margin_mrq=0.0, net_interest_margin_mrq=0.0, roe=23.36, roa=2.81, roic=0.0, total_debt_mrq=0.0, total_debt_to_equity_mrq=0.0, total_debt_to_ebitda_mrq=0.0, free_cash_flow_to_price=0.0, net_debt_to_ebitda=0.0, current_ratio_mrq=0.0, fixed_charge_coverage_ratio_fy=0.0, dividend_yield_daily_ttm=10.45, dividend_rate_ttm=33.3, dividends_per_share=33.3, five_years_average_dividend_yield=8.36, five_year_annual_dividend_growth_rate=0.0, dividend_payout_ratio_fy=45.49, buy_back_ttm=0.0, one_year_annual_revenue_growth_rate=55.49, domicile_indicator_code='', adr_to_common_share_ratio=0.0, number_of_employees=0.0, ex_dividend_date=datetime.datetime(2024,7,11,0,0,tzinfo=datetime.timezone.utc), fiscal_period_start_date=datetime.datetime(1970,1,1,0,0,tzinfo=datetime.timezone.utc), fiscal_period_end_date=datetime.datetime(1970,1,1,0,0,tzinfo=datetime.timezone.utc), revenue_change_five_years=181.25, eps_change_five_years=87.02, ebitda_change_five_years=0.0, total_debt_change_five_years=0.0, ev_to_sales=0.0)])</code>
FinanceMarker.ru API https://financemarker.ru/api/swagger-ui/
Для частных лиц только 400 запросов в день.
Исторический период, по основной отчетности с 2012 года.
Гранулярность данных зависит от частоты выпущенных компанией отчетов, если компания выпускает отчетность по квартально – то квартал, по полугодиям, то полугодие. По РСБУ отчетности – чаще всего квартал. Это относится к категории – reports.
Мультипликаторы (ratios) рассчитываются только в годовом значении и ТТМ (последние 12 месяцев и текущая капитализация).
Запрос: /fm/v2/stocks/{exchange}:{code} Получить данные по компании
Пример ответа:
<code class="json">"capex_revenue": 10.74, "capital": 18483, "changed_at": "2025-03-13T03:35:17", "code": "TATN", "current_ratio": 0.93, "debt_equity": 0.63, "debt_ratio": 0.39, "debtebitda": 0.1, "dpr": null, "ebitda_margin": 22.43, "ev_ebit": 4.18, "evebitda": 3.59, "evs": 0.81, "exchange": "MOEX", "gross_margin": null, "interest_coverage": 14.79, "month": 6, "net_margin": 15.29, "net_working_capital": 0.93, "netdebt_ebitda": -0.19, "operation_margin": 20.89, "pbv": 1.25, "pcf": 3.75, "pe": 5.52, "period": "YTM", "pfcf": 7.14, "pffo": null, "ps": 0.85, "roa": 13.75, "roce": 25.03, "roe": 22.48, "roic": 20.85, "ros": 19.28, "type": "МСФО", "year": 2024</code>
RU Data от Интерфакс dh2.efir-net.ru/swagger/index.html
Не уверен что частное лицо может подключиться.
Вот ссылка-описание: https://rudata.info/rd-api
Conomy DATA conomy.ru/partnership/api
Сервис для предоставления данных о компаниях через API. Используются открытые источники: отчёты, документы, сообщения эмитентов и данные Центробанка. Рассчитываются фундаментальные коэффициенты деятельности компаний. Сервис ещё разрабатывается, но часть данных уже доступна. Информация делится на блоки: общая информация, оцифрованная отчётность, аналитика, прогнозы по акциям и статьи. Цена договорная.
Вот ссылка-описание: https://conomy.ru/partnership
Я писал на указанную ими почту и мне ничего не ответили за две недели.
TradingView
Как ни странно, но сюда похоже ещё можно отнести сервис TradingView, который включает базовые показатели и основные строки из отчетности. У них есть свой язык программирования Pine. Этот язык используется для создания собственных индикаторов и стратегий. График может отображать почти любые строки из отчетности или макроэкономические показатели. Вот ссылка на справку и синтаксис как правильно писать.
А с помощью Pine скрипта можно составить индикаторы, которые отобразят ROE компании и SMA200.
Изменение ROE в отдельной панели:
<code class="javascript">// Михаил Шардин, https://shardin.name/ //@version=6 indicator("ROE History", overlay=false) // Получение ROE roe = request.financial(syminfo.tickerid, 'RETURN_ON_EQUITY', 'FQ') // Plot ROE на отдельной панели plot(roe, title="ROE", color=roe > 15 ? color.green : color.red, linewidth=2) // Добавление горизонтальных линий для визуальной индикации hline(0, title="Нулевая линия", color=color.gray, linestyle=hline.style_dashed) hline(15, title="Порог ROE 15%", color=color.green, linestyle=hline.style_dashed) // Цветовая индикация bgcolor(roe > 15 ? color.new(color.green, 90) : color.new(color.red, 90))</code>
SMA200 и бирки с отметками о ROE:
<code class="javascript">// Михаил Шардин, https://shardin.name/ //@version=6 indicator("ROE с SMA200", overlay=true) // Получение ROE roe = request.financial(syminfo.tickerid, 'RETURN_ON_EQUITY', 'FQ') // Расчет SMA200 на основе цены закрытия sma200 = ta.sma(close, 200) // Визуализация SMA200 на графике plot(sma200, color=color.red, linewidth=2, title="SMA200") // Переменная для отслеживания предыдущего значения ROE var float previousRoe = na // Функция создания метки ROE create_roe_label(float currentRoe) => label.new(x = bar_index, y = high + high * 0.05, text = "ROE (FY): " + str.tostring(currentRoe, "#.##") + "%", color = currentRoe > 15 ? color.green : color.red, style = label.style_label_down,textcolor = color.white) // Создание метки при изменении ROE if (not na(roe) and (na(previousRoe) or math.abs(roe - previousRoe) > 0.01)) create_roe_label(roe) previousRoe := roe // Цветовая индикация графика bgcolor(roe > 15 ? color.new(color.green, 90) : color.new(color.red, 90))</code>
Знаете ещё какие-нибудь API по России?
Если не использовать API, то теоретически можно спарсить данные с какого нибудь сайта и поместить их в базу данных — но это сложнее.
Фундаментальный анализ выявляет недооцененные компании с сильными финансовыми показателями, что критично для долгосрочных инвестиций.
Технический анализ помогает определить оптимальные точки входа и выхода, учитывая рыночные тренды и психологию толпы.
Комбинация обоих подходов повышает точность решений: фундаментальные данные дают «что покупать», технические — «когда покупать».
Автор: Михаил Шардин
🔗 Моя онлайн-визитка
📢 Telegram «Умный Дом Инвестора»
9 апреля 2025 г.
Хотелось бы увидеть графики в лог. масштабе,
оценки риска (хотя бы график макс. дд),
пару слов о влиянии ошибки выжившего,
сравнение с финрезами фондов под управлением авторов стратегий.
Подозреваю, что с авторами выйдет не гладко.
Сравнивается обычный сипи с стратегией рекапитализацией %…
Михаил Шардин, кстати ...
насчет скринера финвиза...
очень просто ну прям все… с твоими настройками 58 бумаг из них растут т.е больше сма200 на дневках всего 16штук… 27%
в том же сипи500 500 бумаг из них растут 88… т.е 17.6%
т.е что то вроде похожего на альфу есть
но проблема в том что половина 23 штуки этих акций не американские… так зачем сравнивать с американским индексом?
причем из растущих 16 бумаг 10 не американские...
теперь по капитализации — из 58 бумаг 40шт средней малой и микро капитализации… и сравнивать с гигантами индекса сипи тоже сомнительно
Михаил Шардин, зацени компашку из скринера )))
finviz.com/quote.ashx?t=PSHG&ty=c&p=m&b=1
ves2010, вообще моя идея совместить фундаментальный и теханализ — это позволит избежать такого выбора.
Проще всего на текущий момент для исследований выглядит решение через Pine Script в TradingView
т.е сначала он ищет характерный паттерн на графике = сломанный тренд с двойной вершиной или аналогичное дно… а затем лезет в фундаментал