惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
V
Visual Studio Blog
C
Check Point Blog
Google DeepMind News
Google DeepMind News
S
SegmentFault 最新的问题
博客园 - 聂微东
量子位
T
Tailwind CSS Blog
罗磊的独立博客
I
InfoQ
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
L
LangChain Blog
小众软件
小众软件
Engineering at Meta
Engineering at Meta
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Security Latest
Security Latest
M
MIT News - Artificial intelligence
Know Your Adversary
Know Your Adversary
MongoDB | Blog
MongoDB | Blog
Google DeepMind News
Google DeepMind News
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
爱范儿
爱范儿
T
The Exploit Database - CXSecurity.com
有赞技术团队
有赞技术团队
V
Vulnerabilities – Threatpost
Martin Fowler
Martin Fowler
A
Arctic Wolf
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 司徒正美
Cyberwarzone
Cyberwarzone
阮一峰的网络日志
阮一峰的网络日志
The Hacker News
The Hacker News
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
GbyAI
GbyAI
Latest news
Latest news
云风的 BLOG
云风的 BLOG
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
腾讯CDC
AWS News Blog
AWS News Blog
aimingoo的专栏
aimingoo的专栏
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
博客园 - Franky
S
Securelist
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Threatpost
美团技术团队

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Диванный инвестор #3. +88% годовых на бектесте
Виталий · 2026-05-29 · via Все публикации подряд на Хабре

Простой

7 мин

6.9K

Если вы, как и я, пробовали инвестировать - покупали и продавали ценные бумаги по наитию или рандому, то вам сюда. Тут мы начнем выстраивать наши хаотические метания в систему для генерирования денег.

Я ни разу не профессиональный инвестор и экономического образования не получал, но стараюсь выстроить стратегию битвы с биржевым рынком для получения прибыли.

Всем привет. Цикл статей был переименован, вы могли меня раньше читать под названием “Инвестиционные боты (почти) с нуля”. Статьи были скучноваты, поэтому эта статья - небольшой эксперимент. Но хватит отвлекаться, погнали!


Чтобы понять, когда что-то покупать или продавать, нужно, чтобы кто-то тебе говорил, что сейчас хорошее время для этого. Этим кем-то будут выступать сигналы.

Сигналы должны анализировать состояние рынка и выдавать три различных сообщения: покупай, продавай, сиди на попе ровно.

Риски

Не существует ни одного 100% работающего сигнала, что бы вы ни придумали, рынок все равно вас обыграет и заберет себе часть прибыли. Нужно быть готовым к этому.

Тут я спросил у Грока, какой процент успеха считается хорошим, и получил неожиданный ответ. “40–45% успешных сделок - это обычный результат, 48–52% - это уже хороший результат.” 

Иллюстрация https://memepedia.ru/wat/

Иллюстрация https://memepedia.ru/wat/

Что? Это же чистый рандом. Как 50% успеха может считаться хорошим результатом? Ведь если я просто случайно буду делать сделки, не думая, то половина из них будет в плюсе, половина в минусе (если пренебречь комиссией и нулевыми сделками).

Но объяснение тут простое - кроме успешности сделки в расчет нужно брать очень важный показатель, а именно соотношение потери при неудаче и прибыли при выигрыше.

Такое соотношение принято называть R/R (от английского risk-reward) и обозначать через двоеточие, к примеру 1:2, что значит, что прибыль должна быть в 2 раза больше, чем возможные потери.

Постер к фильму "Чип и Дейл спешат на помощь". Rescue Rangers - R/R - risk-reward.

Постер к фильму "Чип и Дейл спешат на помощь". Rescue Rangers - R/R - risk-reward.

И вот тут уже становится все на свои места. Если винрейт у нас 50% при R/R 1:2, то мы в стабильном плюсе.

Хорошей стратегией в итоге становится стратегия с винрейтом 45-60% при R/R 1:2 - 1:3. При увеличении процента побед обычно падает возможная прибыль (менее рискованно и менее прибыльно). И наоборот, можно выбрать более рискованную стратегию с винрейтом ниже 40%, но при  R/R 1:4.

Вам уже интересно, какие боты получатся у меня? Мне очень! Поэтому погнали дальше.

Я уже дважды обещал рассказать про сигнал пересечения скользящих средних. Наконец-то это время пришло.

Пересечение скользящих средних (Moving Average Crossover)

Вы уже знаете, что такое скользящие средние? Да? Возьмите с полки пирожок. Если нет, то можете почитать мою предыдущую скучную статью о скользящих средних

Инвестиционные боты (почти) с нуля. Часть 2: свечи и индикаторы

Но вы вряд ли будете её читать - скучная теория, поэтому вкратце: все скользящие средние - это, как бы банально это ни звучало, усреднение цены за последние несколько интервалов времени по каким-то правилам. Правил огромное множество, я реализовал и рассказал в предыдущей статье только о 5 из них, и любую скользящую среднюю можно использовать как основу для сигнала пересечения скользящих.

В общем виде все сигналы пересечения скользящих средних опираются на построение двух графиков скользящих средних (Moving Average) MA - длинной и короткой. Для длинной MA берется более долгий промежуток времени, для короткой, соответственно, короткий промежуток. 

На основе этого пересечения можно сгенерировать сигнал:

  • на покупку - если короткая MA пересекает длинную MA снизу вверх, то это может означать смену тренда: цена начала расти быстрее, чем в среднем за более длинный период.

  • на продажу - если короткая MA пересекает длинную MA сверху вниз. Это сигнализирует о начале нисходящего тренда - цена падает.

  • ожидание - во всех прочих ситуациях

Пересечение EHMA9 и EHMA20 по активу АбрауДюрсо

Пересечение EHMA9 и EHMA20 по активу АбрауДюрсо

Вот, к примеру, хорошее отображение того, как можно было заработать. На скрине есть 2 пересечения. Сначала 20 ноября короткая EHMA9 пересекает EHMA20 вниз и цена падает, потом пересекает вверх и цена так же стремительно растёт.

Также у этого сигнала есть дополнительный фильтр - дистанция - то, как сильно отдалился один график от второго, обычно в процентах. Если дистанция слишком маленькая, то это может быть боковой тренд и его нужно игнорировать.

+14714% или +88% или -25% годовых?

Хватит теории, пора и проверить на деле, что получается.

Для начала я сделал простенькую логику, которая возьмет свечи за предыдущие периоды и будет итеративно проверять сигнал, каждый раз добавляя по 1 свече, то есть будет эмулировать течение времени. Для каждого нового дня мы будем проверять наличие сигнала и стараться покупать или продавать (если есть что).

Иллюстрация https://www.meme-arsenal.com/create/meme/14576238

Иллюстрация https://www.meme-arsenal.com/create/meme/14576238

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

Тем не менее, вот входные параметры теста.

  • Актив - Банк ВТБ, BBG004730ZJ9

  • Начало теста 1 января 2025, конец 31 декабря 2025

  • Комиссия 0.05% от операции (Т-Банк тариф Трейдер)

  • Цена покупки и продажи = среднему значению между ценами открытия и закрытия

  • Не учитываем возможность проскальзывания и влияния своих продаж на рынок

  • Сигнал - пересечение скользящих EHMA9 и EHMA20, интервал - дни

  • Фильтр для покупки - дистанция 0.4%

  • Фильтр для продажи - отсутствует

  • Денег в портфеле на старте - 1 000 000 р.

Запускаем вычисления, немного ждем и получаем результат торгов.

В конце года получаем баланс 147140871.49.

Мельком глянул на цифру и подумал 47% как-то слишком хорошо для запуска, какой я классный инвестор. Но что-то не так, начинаю считать цифры и получается, что это не 1,5 млн, а 147 млн. Т.е. 14714% годовых.

Я, конечно, надеюсь, что я изобрел крутой алгоритм, но понимаю, что тут что-то не так. После выяснения деталей оказывается, что я забыл уменьшать баланс при каждой покупке и он только рос на продажах. 

Что ж, исправляем и повторяем запуск. Результат уже более реальный и он приведен ниже в таблице.

Дата

Цена сделки

Количество

Изменение

Сумма на счете

16.01.2025 

84.56

11944

-999 973,66

26,34

28.01.2025 

84.66

-11944

1 003 630,01

1 003 656,36

14.02.2025 

87.79

11609

-1 003 577,18

79,17

28.02.2025 

91.7

-11609

1 048 290,70

1 048 369,87

12.04.2025 

78.17

13505

-1 048 309,32

60,55

11.05.2025 

99.07

-13505

1 335 449,12

1 335 509,67

14.06.2025 

98.55

13572

-1 335 473,60

36,07

03.07.2025 

99.94

-13572

1 373 817,05

1 373 853,12

20.07.2025 

82.9

16519

-1 373 828,45

24,67

01.08.2025 

76.68

-16519

1 276 940,67

1 276 965,34

08.10.2025 

66.04

18945

-1 276 962,81

2,53

24.10.2025 

67.28

-18945

1 280 799,08

1 280 801,61

21.11.2025 

71.16

17884

-1 280 776,79

24,82

05.12.2025 

73.17

-17884

1 299 606,09

1 299 630,91

В итоге 5 декабря мы получаем почти 1,3 млн, то есть 30% годовых. Но можно обратить внимание, что если бы мы остановились 3 июля, то получили бы 1,37 млн - это примерно 88% годовых. К такому нужно стремиться.

Звучит слишком шоколадно, учитывая, насколько глупая стратегия у нас была? Да, к сожалению, так оно и есть. Значения фильтров и индикаторы немного подобраны на бектесте для более красивых значений.

Реальные цифры для стратегии пересечения скользящих при использовании разных типов скользящих и дистанций в среднем лежат примерно от -25% годовых до +15%. Виден явный перекос в отрицательную сторону, поэтому нужно усложнять логику, чем мы с вами и займёмся в будущих частях.

Но я не унываю, это все-таки максимально глупый алгоритм, у которого есть проблемы и где еще много мест, которые можно дорабатывать. Главное в том, что если его верно настроить, то потенциал у него есть.

Страница с сигналами для всех активов

Это не основное направление проекта, а просто добавка для наглядности. Я ленивый и не хочу для каждого актива руками тыкать - хочется видеть картину сразу по всему рынку. У кого сейчас buy, у кого sell, кого игнорим. По сути скринер на минималках.

Страница с сигналами

Страница с сигналами

Сверху настройки: интервал (день, час, 15 минут) и один или несколько сигналов пересечения. Каждый сигнал - пара индикаторов плюс подтверждение: 1 бар, 2 бара или от 1 до 3 баров. По умолчанию подставляются EHMA9/SMA20 и EHMA9/HMA20 - те самые, которые в бэктесте показали себя «ну хотя бы не -25%».

Настройка сигналов

Настройка сигналов

Жмём Build - система пробегается по всем доступным инструментам, скачивает свечи и считает сигнал. Идёт в фоне, фронт раз в секунду спрашивает «ну как там?». 84/1856. 85/1856. 86/1856.

Сама проверка пересечения работает по последним 4 барам - смотрим, поменялись ли индикаторы местами и на каком именно баре:

function checkCross(barCount, lastBars) {
  if (barCount == 1) {
    if (lastBars.bar1 && !lastBars.bar2) return 1;
    if (!lastBars.bar1 && lastBars.bar2) return -1;
  }
  else if (barCount == 2) {
    if (lastBars.bar1 && lastBars.bar2 && !lastBars.bar3) return 1;
    if (!lastBars.bar1 && !lastBars.bar2 && lastBars.bar3) return -1;
  }
  else if (barCount == 3) {
    if (lastBars.bar1 && lastBars.bar2 && lastBars.bar3 && !lastBars.bar4) return 1;
    if (!lastBars.bar1 && !lastBars.bar2 && !lastBars.bar3 && lastBars.bar4) return -1;
  }

  return 0;
}

Подтверждение на 2-3 бара отсекает часть ложных срабатываний на боковике. Правда, так мы упускаем момент и может быть слишком поздно для входа.

Качать свечи по всем инструментам каждый раз - это медленно, и можно получить блок по рейт-лимиту. Поэтому кеш в памяти:

async function getCandlesCached(figi, interval) {
  if (!Mars.cache.Candles) Mars.cache.Candles = {};
  if (!Mars.cache.Candles[interval]) Mars.cache.Candles[interval] = {};
  const cached = Mars.cache.Candles[interval][figi];
  if (cached) return { candles: cached, fromCache: true };

  const candles = await Mars.services.GetCandles({ figi, interval }, Req);
  Mars.cache.Candles[interval][figi] = candles;
  return { candles, fromCache: false };
}

По мере вычисления таблица с инструментами постепенно наполняется и можно просматривать сигналы. Зелёный buy, красный sell, прочерк - мимо кассы. Сортировка по любой колонке, поиск по названию, клик по строке открывает карточку инструмента сбоку. Всё как у взрослых.

Таблица с сигналами по всем активам

Таблица с сигналами по всем активам

Главная фишка - несколько сигналов одновременно. Если и EHMA9/SMA20 говорит buy, и EMA9/EMA21 тоже buy - это уже не один пьяный советчик, а целый консилиум пьяных советчиков. А когда они все согласны - это уже что-то.

Ограничения те же, о которых говорили выше: пересечение скользящих со всеми его болячками, плюс данные не в реальном времени. Для скальпинга не подойдёт - пока страница посчитает, рынок успеет три раза передумать. Для дневного таймфрейма - нормально.

Как по мне, уже вполне себе полезный продукт получается. Вопрос к вам интересна ли будет вам такая страница с сигналами, если я выложу ее в общий доступ?

Послесловие

Это продолжение серии постов Инвестиционные боты (почти) с нуля, которые вы можете найти в моем профиле. Серия переименована, а так же был создан телеграмм канал с более частыми апдейтами. Кому интересно, подписывайтесь https://t.me/divaninvest