Блог им. empenoso

Как я создал систему поиска недооценённых американских акций, используя данные Yahoo Finance: мой путь к разумному выбору

Хочу рассказать о своем опыте поиска ценных бумаг на американском рынке, которые торгуются на NYSE, NASDAQ и AMEX.

Из России покупать акции иностранных компаний в 2024 году сложно, но варианты до сих пор остаются: иностранный брокер, страховая или некоторые российские брокеры, которые не попали под санкции.

Обычно я покупаю индексные фонды, но иногда хочется купить конкретные акции. Акции какой конкретной компании выбрать, ведь на американском рынке на сентябрь 2024 года их торгуется 10 522 штуки? Ответ на вопрос сложен и зависит от многих факторов. Правда, часто не хочется тратить много времени на анализ, но и совсем случайную акцию покупать не хочется.

Существует популярный ресурс Яху Финанс, который предоставляет различные данные по акциям, включая фундаментальные данные, а ещё сводные рекомендации аналитиков различных инвестиционных компаний: прогнозируемую цену бумаги и рекомендацию: покупать / продавать / держать. Все эти данные представлены на Яху в структурированном виде. По одной компании может быть дано множество прогнозов, например для Apple Inc. (AAPL) в сентябре 2024 таких прогнозов было дано 38 от различных инвестиционных компаний.

Как я создал систему поиска недооценённых американских акций, используя данные Yahoo Finance: мой путь к разумному выбору
Точки на графике — это рекомендации аналитиков

Мне пришла идея — а почему бы не собрать эти данные по каждой бумаге, отфильтровать по потенциалу роста — проценту между текущей и прогнозируемой по мнению этих аналитиков ценой, а ещё учесть сколько компаний-аналитиков проводило анализ за два последних месяца. Обязательно фильтровать и учитывать текущую дивидендную доходностью. При практических исследованиях оказалось, что не все акции имеют такие данные о прогнозной цене, а только 4 250 из 10 522 бумаг. Оставшиеся 6 272 акции не имеют данных о прогнозируемой цене.

Акции с прогнозными ценами — можно перебирать каждую из 4 250 бумаг и если она отвечает требованиям — включать в выборку. Ну а с выборкой уже работать самому, когда механический отбор произведён.

Почему именно американский рынок?

Как я создал систему поиска недооценённых американских акций, используя данные Yahoo Finance: мой путь к разумному выбору

UBS Global Investment Returns Yearbook: Summary Edition 2024

Доминирование американского рынка капитала – это не просто недавнее явление; это результат столетнего экономического, технологического и геополитического развития.

Об этом говорит один график, отражающий историю капитализации мирового фондового рынка. До Первой мировой войны мир был действительно многополярным с точки зрения экономической мощи. Великобритания, крупнейшая экономика того времени, занимала лишь 24% мировой рыночной капитализации, за ней следовали США с 15% и Германия с 13%. Ни одна страна не доминировала с подавляющим большинством на мировых рынках капитала.

Но ситуация резко изменилась в 1920-х годах, когда США начали отдаляться от своих коллег. К концу 20-го и в начале 21-го века Соединенные Штаты укрепили свои позиции ведущего мирового рынка капитала. Сегодня на ее долю приходится ошеломляющий 61% капитализации мирового фондового рынка, что намного превосходит любую другую страну. Масштаб этого доминирования таков, что ни одна другая нация не достигает даже двузначных цифр. Даже Китай, вторая по величине экономика мира, остается далеким конкурентом в сфере рынков капитала.

На протяжении прошлого столетия ни одна страна не смогла успешно бросить вызов лидерству Америки в мировых финансах. Ближе всего к этому пришла Япония в 1980-х годах, оседлав волну экономического процветания и быстрого роста. Однако к началу 1990-х годов японский пузырь лопнул, и она отступила от своего вызова американскому доминированию.

Несколько факторов объясняют подъем американского рынка капитала. Огромный размер, устойчивость и рост экономики США сыграли центральную роль. Уолл-стрит стала синонимом финансовой мощи, поддерживаемой сильными институтами, глубокими пулами капитала и нормативно-правовой средой, которая, несмотря на ее сложности, способствовала созданию стабильного и предсказуемого рынка.

В других странах наблюдается снижение их относительного влияния на мировых рынках капитала. Столетие назад, например, на долю России приходилось 6% мировой рыночной капитализации.

Где взять список тикеров, торгуемых на NYSE, NASDAQ и AMEX?

Если искать полный список тикеров, торгуемых на NYSE, NASDAQ и AMEX, его можно найти на официальном сайте Nasdaq Trader. Страница по этому адресу предоставляет доступ к полному каталогу всех акций, котирующихся на этих биржах.

На nasdaqtrader.com можно скачать файлы, содержащие тикеры, названия компаний и другую информацию. Эти файлы доступны в различных форматах, включая .txt и .zip, что упрощает доступ к данным и работу с ними.

Для конвертации в json формат я использую скрипт nasdaqtraded.sh:

<code class="bash">#!/bin/bash<br /># $ sh nasdaqtraded.sh<br /><br />echo -n '["' > nasdaqtraded.json<br />curl -o nasdaq.txt ftp://ftp.nasdaqtrader.com/symboldirectory/nasdaqtraded.txt<br />cat nasdaq.txt | grep -Eo '^\w\|\w*' | sed 's/^\w|//g' | sed 'H;1h;$!d;x;y/\n/,/' | sed 's/,/\",\"/g' >> nasdaqtraded.json<br />echo '"]' >> nasdaqtraded.json<br />sed -i ':a;N;$!ba;s/\n//' nasdaqtraded.json<br />rm nasdaq.txt</code>
Как я создал систему поиска недооценённых американских акций, используя данные Yahoo Finance: мой путь к разумному выбору
nasdaqtraded.jsonГде брать данные цен, финансовую информацию и прогнозы по компаниям?

Хотя официальное API Яху Финанс было закрыто ещё в 2017 году, однако практически сразу же появилась его недокументированная работоспособная версия, которая жива до сих пор.

Примерно год назад, в прошлом 2023 году, API которое до сих пор живо и работает стало требовать требовать куки для каждого запроса. Привычным способом возвращалась только ошибка Invalid Crumb. Однако на stackoverflow.com практически сразу появилось решение этой проблемы.

Теперь в 2024 году рабочий код запроса к API Яху Финанс выглядит следующим образом:

<code class="javascript">async function getCredentials() { // на основе https://stackoverflow.com/a/76555529<br />    // Inline the API and User-Agent values<br />    const API = 'https://query2.finance.yahoo.com';<br />    const USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36';<br /><br />    // get the A3 cookie<br />    const response = await fetch('https://fc.yahoo.com', {<br />        headers: {<br />            'User-Agent': USER_AGENT<br />        },<br />        timeout: 10000 // Увеличиваем таймаут до 10 секунд<br />    })<br />    const cookie = response.headers.get('set-cookie')<br /><br />    // now get the crumb<br />    const url = new URL('/v1/test/getcrumb', API)<br />    const request = new Request(url, {<br />        headers: {<br />            'User-Agent': USER_AGENT,<br />            'cookie': cookie<br />        }<br />    })<br />    const crumbResponse = await fetch(request)<br />    const crumb = await crumbResponse.text()<br /><br />    return {<br />        cookie,<br />        crumb<br />    }<br />}<br /><br />async function USAStockGetName(ID, cookie, crumb) { //получаем имя бумаги <br />    // https://query1.finance.yahoo.com/v10/finance/quoteSummary/GRMN?modules=price&crumb=rxBh.H4z62E<br />    const url = `https://query1.finance.yahoo.com/v10/finance/quoteSummary/${ID}?modules=price&crumb=${crumb}`;<br />    console.log("%s. URL for %s: %s", getFunctionName(), ID, url);<br />    try {<br />        const response = await fetch(url, {<br />            headers: {<br />                'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',<br />                'cookie': cookie<br />            },<br />            timeout: 10000 // Увеличиваем таймаут до 10 секунд<br />        });<br />        const json = await response.json();<br />        const value = json.quoteSummary.result[0].price.longName;<br />        console.log("%s. Name for %s: %s", getFunctionName(), ID, value);<br />        if (value == 0) return 'нет';<br />        return value.replace(/\'/g, '');<br />    } catch (e) {<br />        console.log(`Ошибка: ${e}.`);<br />    }<br />}</code>

То есть как источник данных можно выбрать Yahoo Finance, потому что API предоставляет структурированные данные, включая прогнозируемые цены и рекомендации по покупке/продаже/держать от разных аналитиков.

Проблема выбора акций: слишком много вариантов

Когда есть пул более 10 000 компаний — сложно что-то выбрать вручную. На сайте Яху Финанс есть хорошие скринеры — фильтры, но вот по рекомендациям аналитиков они не работают.

Поэтому захотел написать свою реализацию скринера.

Как я создал систему поиска недооценённых американских акций, используя данные Yahoo Finance: мой путь к разумному выбору
Результат работы скрипта YahooFinance_Analyst Price TargetsСистема фильтрации акций — как работает скриптКак я создал систему поиска недооценённых американских акций, используя данные Yahoo Finance: мой путь к разумному выбору
YahooFinance_Analyst Price Targets

Этот скрипт предназначен для автоматизации процесса поиска недооцененных акций, торгуемых на фондовых биржах США (NYSE, NASDAQ и AMEX), путем получения данных из Yahoo Finance. Вот как это работает:

  1. Инициализация и настройка. Скрипт начинается с записи текущего времени и инициализации необходимых модулей, таких как fs, path, moment и fetch. Скрипт позволяет настроить пороговые значения для выбора акций, в том числе:

    • Потенциал роста: минимальный процентный рост между текущей и прогнозируемой ценой акций (например, 40% или более).

    • Рекомендации аналитиков: минимальное количество аналитических фирм, предоставивших рекомендации в течение последних двух месяцев (например, не менее 20).

    • Дивидендная доходность: минимальная текущая дивидендная доходность (например, 1% или более).

Как я создал систему поиска недооценённых американских акций, используя данные Yahoo Finance: мой путь к разумному выбору
Потенциал роста и рекомендации аналитиков
  1. Загрузка базы тикеров. Скрипт загружает файл JSON (nasdaqtraded.json), содержащий тикеры компаний, акции которых торгуются на биржах США. Он обеспечивает уникальность тикеров за счет фильтрации дубликатов.

Как я создал систему поиска недооценённых американских акций, используя данные Yahoo Finance: мой путь к разумному выбору
Дивидендная доходность акций
  1. Процесс анализа. Основная функциональность включает в себя перебор тикеров и получение финансовых данных для каждой акции из Yahoo Finance. Скрипт проверяет:

    • Потенциал роста: разница между текущей ценой акций и прогнозируемой ценой.

    • Аналитический тренд: количество рекомендаций аналитиков по акциям.

    • Дивидендная доходность акций.

    В окончательный отбор включаются только акции, соответствующие всем заданным условиям (потенциал роста, рекомендации аналитиков и дивидендная доходность).

  2. Обработка ошибок. Скрипт отслеживает ошибки, особенно когда для определенных акций отсутствуют данные о прогнозируемых ценах.

  1. Сортировка и регистрация данных. Выбранные акции сортируются по потенциалу роста, а результаты периодически регистрируются: каждые 100 обработанных акций скрипт сохраняет текущий прогресс на диск, создавая HTML-файл, суммирующий результаты.

  2. После того как скрипт обработает все тикеры, скрипт генерирует окончательный отчет, включающий все выбранные акции, соответствующие критериям, и выводит общее время, затраченное на исполнение.

Пошаговое руководство по использованию скрипта YahooFinance_Analyst Price Targets

Прежде чем приступить к работе, убедитесь, что на вашем компьютере установлено следующее:

  • Node.js и npm (менеджер пакетов Node): Node.js позволяет запускать JavaScript на вашем компьютере, а npm — это менеджер пакетов, входящий в состав Node.js. Вы можете скачать оба с официального сайта Node.js.

  • Редактор кода (необязательно). Для редактирования и просмотра файлов проекта рекомендуется использовать редактор кода, например Visual Studio Code. Загрузите его с веб-сайта Visual Studio Code.

Скачайте репозиторий проекта

Первый шаг — загрузить (клонировать) проект с GitHub.

Как я создал систему поиска недооценённых американских акций, используя данные Yahoo Finance: мой путь к разумному выбору
Список файлов

Установка зависимостей

Следующим шагом будет установка необходимых пакетов, необходимых для запуска проекта.

Для Windows воспользуйтесь файлом first start.bat.

Для Mac и Linux в терминале введите:

<code>npm install</code>

Эта команда установит все пакеты, перечисленные в файле package.json.

Запуск проекта

После установки зависимостей вы можете запустить проект.

Для Windows:

Воспользуйтесь файлом YahooFinance_Analyst Price Targets_start_windows.bat

Запуск занимает около 10 часов:

Как я создал систему поиска недооценённых американских акций, используя данные Yahoo Finance: мой путь к разумному выбору
После красной стрелочки ожидание 10 часов

Для Mac:

Откройте терминал и выполните команду, изменив путь на свой собственный:

<code class="bash">node /Users/mike/Desktop/YahooFinance_Analyst Price Targets/index.js 2>&1 | tee /Users/mike/Desktop/YahooFinance_Analyst Price Targets/log/log_$(date +%F_%T).txt</code>

Процесс также занимает около 10 часов, все логи можно посмотреть в папке log.

Для Linux:

Откройте терминал и выполните команду, изменив путь на свой собственный:

<code class="bash">node /home/mike/YahooFinance_Analyst Price Targets 2>&1 | tee /home/mike/YahooFinance_Analyst Price Targets/log/log_$(date +%F_%T).txt</code>

Просмотр результатов

После успешного выполнения скрипта в папке searching_results появится ещё один файл с текущей датой.

На названия столбцов можно нажимать — сортировка будет меняться.

Прошлые результаты поиска за несколько лет можно посмотреть здесь.

Как я создал систему поиска недооценённых американских акций, используя данные Yahoo Finance: мой путь к разумному выбору
Один из результатов поиска

Вместо итогов

Скрипт всегда доступен на Гитхабе.

Автор:Михаил Шардин

2 сентября 2024 г.

★8
6 комментариев
я навсегда запомнил как в 2008ом дойче банк рекомендовал покупать газпром по 360… а всего через 3 месяца рекомендовал продавать по 97… а дно было на 93... 
avatar
ves2010, 
 а всего через 3 месяца рекомендовал продавать по 97… а дно было на 93
шикарная рекомендация....
продавать же не на дне советовали…
avatar

ves2010, ну это же аналитики — им что-то надо в любом случае выдавать.

Это частным инвесторам не обязательно что-то делать всегда — можно и подождать.

avatar
интересно, попробую поюзать, запустится или нет )
avatar
Мр.Дакс, получилось?
avatar
Михаил, да, всё отлично работает, но качество выборки не очень как то , такое ощущение что «эти аналитики пишут под заказ» но скрипт делает своё дело верно 
avatar

теги блога Михаил Шардин

....все тэги



UPDONW
Новый дизайн