neuroalpha 0.2.0 → 0.3.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/LICENSE +17 -0
  2. package/README.md +9 -3
  3. package/bin/cli.js +69 -69
  4. package/config/seed-run.json +1 -0
  5. package/config/strategy.json +4 -10
  6. package/deploy/install.sh +128 -0
  7. package/docs//320/224/320/225/320/237/320/233/320/236/320/231.md +103 -0
  8. package/docs//320/230/320/235/320/241/320/242/320/240/320/243/320/232/320/246/320/230/320/257.md +1 -1
  9. package/docs//320/234/320/225/320/245/320/220/320/235/320/230/320/232/320/220_/320/230_/320/237/320/220/320/240/320/220/320/234/320/225/320/242/320/240/320/253.md +171 -0
  10. package/package.json +15 -5
  11. package/public/admin.html +449 -0
  12. package/public/app.js +1182 -379
  13. package/public/index.html +87 -22
  14. package/public/landing.html +1217 -870
  15. package/public/legal.html +51 -8
  16. package/public/styles.css +71 -16
  17. package/server/api/routes.js +220 -35
  18. package/server/auth/index.js +633 -340
  19. package/server/billing/yookassa.js +1 -0
  20. package/server/brokers/index.js +1369 -645
  21. package/server/config.js +6 -4
  22. package/server/data/moex.js +1 -0
  23. package/server/db.js +69 -4
  24. package/server/hub.js +1 -0
  25. package/server/index.js +10 -2
  26. package/server/llm/client.js +1 -0
  27. package/server/llm/providers.js +50 -3
  28. package/server/model/dataset.js +362 -352
  29. package/server/model/forecast.js +202 -37
  30. package/server/model/linalg.js +1 -0
  31. package/server/model/live.js +476 -486
  32. package/server/model/metrics.js +1 -0
  33. package/server/model/models.js +31 -21
  34. package/server/model/profiles.js +1 -0
  35. package/server/model/research.js +128 -205
  36. package/server/model/vocab.js +1 -0
  37. package/server/news/index.js +1 -0
  38. package/server/notify/index.js +304 -168
  39. package/server/params-meta.js +22 -26
  40. package/server/settings.js +1 -0
  41. package/server/strategist/analytics.js +2 -1
  42. package/server/strategist/index.js +7 -7
  43. package/server/strategist/tools.js +2 -1
  44. package/server/util.js +1 -0
  45. package/server/model/gpu-worker.html +0 -11
  46. package/server/model/gpu-worker.js +0 -60
  47. package/server/model/tf-node.js +0 -26
  48. package/server/model/transformer-core.js +0 -330
  49. package/server/model/transformer-gpu.js +0 -221
  50. package/server/model/transformer-pool.js +0 -200
  51. package/server/model/transformer-worker.js +0 -28
  52. package/server/model/transformer.js +0 -57
@@ -1,26 +1,20 @@
1
1
  {
2
2
  "modelAutoAdapt": true,
3
3
  "modelType": "attention",
4
- "modelHorizon": 2,
4
+ "modelHorizon": 2.5,
5
5
  "modelMinEdge": 2.5,
6
- "modelExitRatio": 0.75,
7
- "modelMinHoldHours": 0,
8
- "modelTopK": 3,
6
+ "modelExitRatio": 0.95,
7
+ "modelTopK": 2,
9
8
  "modelAllocMode": "equal",
10
9
  "modelDirection": "longshort",
11
10
  "modelMarketFilter": "off",
12
11
  "modelShortFeePct": 20,
13
12
  "modelTrainDays": 90,
14
- "modelHistoryDays": 850,
13
+ "modelHistoryDays": 1000,
15
14
  "modelEmbedDim": 11,
16
15
  "modelUseDividends": true,
17
16
  "modelUseMacro": false,
18
17
  "modelTextWeight": 0,
19
- "modelUseTransformer": false,
20
- "transformerEpochs": 8,
21
- "transformerStride": 6,
22
- "transformerParallel": true,
23
- "transformerGpu": false,
24
18
  "capital": 1000000,
25
19
  "commissionPct": 0.04,
26
20
  "slippagePct": 0.01,
@@ -0,0 +1,128 @@
1
+ #!/usr/bin/env bash
2
+ # Copyright (c) 2026 Roman A. Perepelkin. All rights reserved. Proprietary software.
3
+ set -e
4
+
5
+ echo "======================================================"
6
+ echo " ◈ НейроАльфа — Автоматическая установка облака (VPS)"
7
+ echo "======================================================"
8
+
9
+ if [ "$EUID" -ne 0 ]; then
10
+ echo "Ошибка: запустите скрипт от имени root (sudo bash install.sh)"
11
+ exit 1
12
+ fi
13
+
14
+ read -p "Введите ваш домен [neuroalpha.odant.org]: " DOMAIN
15
+ DOMAIN=$(echo "${DOMAIN:-neuroalpha.odant.org}" | sed -e 's|^https\?://||' -e 's|/.*$||' | tr -d ' ')
16
+
17
+ read -p "Введите ваш Email администратора [admin@$DOMAIN]: " ADMIN_EMAIL
18
+ ADMIN_EMAIL=${ADMIN_EMAIL:-admin@$DOMAIN}
19
+
20
+ read -s -p "Придумайте пароль администратора (не короче 6 символов): " ADMIN_PASS
21
+ echo ""
22
+ if [ ${#ADMIN_PASS} -lt 6 ]; then
23
+ echo "Ошибка: пароль должен быть не короче 6 символов."
24
+ exit 1
25
+ fi
26
+
27
+ read -s -p "Ключ от сервера ИИ https://models.odant.org (sk-bf-..., можно пусто и ввести позже в админке): " LLM_KEY
28
+ echo ""
29
+ read -s -p "Токен Telegram-бота @neuroalpha_trade_bot (можно пусто и ввести позже): " TG_TOKEN
30
+ echo ""
31
+
32
+ echo "→ 1/5. Обновление пакетов и установка Node.js 22..."
33
+ apt-get update -y
34
+ apt-get install -y curl ca-certificates gnupg debian-keyring debian-archive-keyring apt-transport-https
35
+ if ! command -v node >/dev/null 2>&1 || [ "$(node -v | cut -d. -f1 | tr -d 'v')" -lt 22 ]; then
36
+ curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
37
+ apt-get install -y nodejs
38
+ fi
39
+
40
+ echo "→ 2/5. Установка веб-сервера Caddy (автоматический бесплатный HTTPS)..."
41
+ if ! command -v caddy >/dev/null 2>&1; then
42
+ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg --yes
43
+ curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list
44
+ apt-get update -y
45
+ apt-get install -y caddy
46
+ fi
47
+
48
+ echo "→ 3/5. Установка пакета neuroalpha из npm..."
49
+ mkdir -p /opt/neuroalpha/data
50
+ cd /opt/neuroalpha
51
+ if [ ! -f package.json ]; then
52
+ npm init -y >/dev/null
53
+ fi
54
+ npm install neuroalpha@latest
55
+
56
+ echo "→ 4/5. Настройка аккаунта администратора и службы systemd..."
57
+ ADMIN_EMAIL="$ADMIN_EMAIL" ADMIN_PASS="$ADMIN_PASS" LLM_API_KEY="$LLM_KEY" TELEGRAM_BOT_TOKEN="$TG_TOKEN" NEUROALPHA_DATA_DIR="/opt/neuroalpha/data" node --disable-warning=ExperimentalWarning -e "
58
+ import { db } from './node_modules/neuroalpha/server/db.js';
59
+ import { hashPassword, ensureApiKey } from './node_modules/neuroalpha/server/auth/index.js';
60
+ import { saveNotifyConfig } from './node_modules/neuroalpha/server/notify/index.js';
61
+ const h = hashPassword(process.env.ADMIN_PASS);
62
+ db.prepare('UPDATE users SET email = ?, name = ?, pass_hash = ?, role = ?, plan = ? WHERE id = 1')
63
+ .run(process.env.ADMIN_EMAIL.toLowerCase(), 'Администратор', h, 'admin', 'pro');
64
+ const key = ensureApiKey(1);
65
+ if (process.env.TELEGRAM_BOT_TOKEN) {
66
+ saveNotifyConfig({ tgBotName: 'neuroalpha_trade_bot', tgToken: process.env.TELEGRAM_BOT_TOKEN });
67
+ }
68
+ console.log('✓ Аккаунт администратора готов. APIKey:', key);
69
+ "
70
+
71
+ cat >/opt/neuroalpha/.env <<EOF
72
+ NODE_ENV=production
73
+ CLOUD_MODE=1
74
+ PORT=3000
75
+ NEUROALPHA_DATA_DIR=/opt/neuroalpha/data
76
+ LLM_PROVIDER=openai
77
+ LLM_BASE_URL=https://models.odant.org/v1/chat/completions
78
+ LLM_MODEL=Qwen/Qwen3.8-27B-FP8
79
+ LLM_REASONING_EFFORT=low
80
+ LLM_API_KEY=$LLM_KEY
81
+ TELEGRAM_BOT_NAME=neuroalpha_trade_bot
82
+ TELEGRAM_BOT_TOKEN=$TG_TOKEN
83
+ EOF
84
+ chmod 600 /opt/neuroalpha/.env
85
+
86
+ cat >/etc/systemd/system/neuroalpha.service <<EOF
87
+ [Unit]
88
+ Description=NeuroAlpha Trading Platform
89
+ After=network.target
90
+
91
+ [Service]
92
+ Type=simple
93
+ WorkingDirectory=/opt/neuroalpha
94
+ EnvironmentFile=/opt/neuroalpha/.env
95
+ ExecStart=/usr/bin/node --disable-warning=ExperimentalWarning /opt/neuroalpha/node_modules/neuroalpha/server/index.js
96
+ Restart=always
97
+ RestartSec=5
98
+
99
+ [Install]
100
+ WantedBy=multi-user.target
101
+ EOF
102
+
103
+ systemctl daemon-reload
104
+ systemctl enable neuroalpha
105
+ systemctl restart neuroalpha
106
+
107
+ echo "→ 5/5. Настройка HTTPS для домена $DOMAIN..."
108
+ cat >/etc/caddy/Caddyfile <<EOF
109
+ $DOMAIN {
110
+ reverse_proxy 127.0.0.1:3000
111
+ }
112
+ EOF
113
+
114
+ systemctl reload caddy || systemctl restart caddy
115
+
116
+ echo ""
117
+ echo "======================================================"
118
+ echo " ✓ ГОТОВО! Платформа НейроАльфа запущена 24/7"
119
+ echo "======================================================"
120
+ echo " Сайт и лендинг: https://$DOMAIN"
121
+ echo " Логин админа: $ADMIN_EMAIL"
122
+ echo " Пароль админа: (указанный вами при установке)"
123
+ echo ""
124
+ echo " Что сделать дальше:"
125
+ echo " 1. Откройте https://$DOMAIN и нажмите «Войти»."
126
+ echo " 2. В терминале откройте «Настройки → Профиль, тариф и боты»."
127
+ echo " 3. Укажите ваши реквизиты оферты, Shop ID и ключ ЮKassa, токены ботов Telegram/MAX."
128
+ echo "======================================================"
@@ -0,0 +1,103 @@
1
+ # Пошаговая инструкция по запуску (Деплою), ЮKassa и `npx`
2
+
3
+ Эта инструкция написана простым языком для запуска вашего коммерческого облачного сайта «НейроАльфа» с нуля: от покупки домена до приёма платежей через ЮKassa и раздачи ключей `APIKey` пользователям.
4
+
5
+ ---
6
+
7
+ ## 1. Как связаны между собой Сайт, ЮKassa и `npx neuroalpha`
8
+
9
+ У вашей платформы **гибридная архитектура** (как у современных облачных сервисов):
10
+
11
+ 1. **Ваш Облачный Сайт (`https://ваш-домен.ru`)**:
12
+ * На главной странице открывается продающий **лендинг** с живой витриной стратегий и тарифами (`3 900 ₽` и `9 900 ₽`).
13
+ * Посетитель нажимает **«Попробовать бесплатно»** или **«Оформить подписку»**, регистрируется и оплачивает тариф картой МИР или через СБП (ЮKassa).
14
+ * В личном кабинете на сайте пользователь получает свой персональный **`APIKey` (`na_live_...`)**.
15
+
16
+ 2. **Два режима работы для вашего клиента**:
17
+ * **Вариант А — Прямо в браузере на вашем сайте:** клиент нажимает «Открыть веб-терминал» и пользуется платформой онлайн.
18
+ * **Вариант Б — На своём компьютере через `npx`:** клиент открывает у себя командную строку и запускает:
19
+ ```bash
20
+ npx neuroalpha --key na_live_его_ключ --cloud https://ваш-домен.ru
21
+ ```
22
+ Его локальная программа связывается с вашим сайтом по этому ключу, проверяет оплаченную подписку, включает тариф («Инвестор» или «Профи») и автоматически использует ИИ-Стратега вашего сервера, при этом **ключи от его брокера (Т-Банк, БКС, Финам, Алор) хранятся только на его личном компьютере**.
23
+
24
+ ---
25
+
26
+ ## 2. Ответы на главные вопросы по ЮKassa и домену
27
+
28
+ ### Вопрос 1: Привязывается ли ЮKassa к конкретному домену?
29
+ **Да.** При подключении боевого магазина в ЮKassa вы указываете адрес вашего сайта (например, `https://neuroalpha.ru`). Менеджер ЮKassa перед включением платежей заходит на этот адрес и проверяет 4 пункта:
30
+ 1. Сайт открывается по защищённому протоколу **`https://`** (с SSL-сертификатом).
31
+ 2. На сайте понятно описана услуга и указаны цены в рублях (у нас это уже есть на лендинге).
32
+ 3. Внизу страницы есть рабочие ссылки на **Публичную оферту**, **Политику конфиденциальности (152-ФЗ)** и **Декларацию о рисках** (у нас они уже готовы на странице `/legal`).
33
+ 4. На странице `/legal` указаны **реквизиты вашего юрлица / ИП / самозанятого (ИНН, ОГРНИП и Email поддержки)** — *мы добавили форму в вашу Админ-панель, чтобы вы заполнили их прямо из браузера за 30 секунд!*
34
+
35
+ ### Вопрос 2: Что делать, если у вас УЖЕ есть магазин ЮKassa на другом домене?
36
+ У вас есть два простых пути:
37
+ * **Путь 1 (Поддомен — самый быстрый):** Если у вас уже одобрен домен `мой-сайт.ru`, вы можете повесить НейроАльфу на поддомен `alpha.мой-сайт.ru` (или `trade.мой-сайт.ru`) и в личном кабинете ЮKassa нажать **«Добавить магазин»** для этого поддомена. Так как юрлицо уже проверено, второй `Shop ID` одобряют за 1 рабочий день.
38
+ * **Путь 2 (Новый домен):** Купить отдельный красивый домен (например, `neuroalpha.ru`) и добавить его как новый магазин в вашем личном кабинете ЮKassa.
39
+
40
+ > **Важно про формулировку для модерации ЮKassa:**
41
+ > Если служба поддержки ЮKassa спросит, чем занимается сервис, отвечайте:
42
+ > *«Предоставление подписки на аналитическое программное обеспечение (SaaS-калькулятор статистики и интерфейс автоматизации). Мы не принимаем деньги на депозиты, не управляем чужими счетами и не даём индивидуальных инвестиционных рекомендаций».*
43
+ > Именно так юридически выстроена наша оферта в `/legal` — для такой деятельности **не требуется** лицензия ЦБ РФ.
44
+
45
+ ---
46
+
47
+ ## 3. Запуск сайта в интернете за 15 минут (Пошагово)
48
+
49
+ ### Шаг 1. Арендуйте сервер (VPS) и домен
50
+ 1. Зарегистрируйтесь на любом российском облачном хостинге: **Timeweb Cloud** (`timeweb.cloud`), **Reg.ru** или **Selectel**.
51
+ 2. В разделе **«Облачные серверы (VPS)»** нажмите «Создать сервер»:
52
+ * **ОС:** `Ubuntu 24.04` (или `Ubuntu 22.04`)
53
+ * **Тариф:** 2 CPU, 4 ГБ RAM, 40 ГБ NVMe (~600–900 ₽/мес).
54
+ 3. Скопируйте выданный вам **IP-адрес сервера** (например, `185.10.20.30`) и пароль `root`.
55
+ 4. В разделе **«Домены и DNS»** направьте ваш домен (запись типа **`A`** для `@`) на этот IP-адрес.
56
+
57
+ ### Шаг 2. Подключитесь к серверу и запустите авто-установщик
58
+ 1. На своём компьютере в Windows откройте стандартную **Командную строку** и введите:
59
+ ```cmd
60
+ ssh root@ВАШ_IP_АДРЕС
61
+ ```
62
+ *(На вопрос `Are you sure you want to continue connecting?` введите `yes` и вставьте пароль `root` от сервера).*
63
+ 2. Вставьте одну команду для запуска нашего автоматического установщика:
64
+ ```bash
65
+ curl -fsSL https://unpkg.com/neuroalpha@latest/deploy/install.sh -o install.sh && bash install.sh
66
+ ```
67
+ 3. Скрипт спросит у вас 3 вещи:
68
+ * **Ваш домен** (например, `neuroalpha.ru`)
69
+ * **Ваш Email администратора** (например, `admin@neuroalpha.ru`)
70
+ * **Пароль администратора**
71
+ 4. Всё остальное скрипт сделает сам за ~2 минуты:
72
+ * Установит Node.js 22;
73
+ * Установит веб-сервер Caddy и **автоматически выпустит бесплатный HTTPS-сертификат Let's Encrypt**;
74
+ * Установит ваш пакет `neuroalpha` и запустит его как системную службу 24/7 (которая сама перезапускается даже после перезагрузки сервера).
75
+
76
+ ---
77
+
78
+ ## 4. Настройка сайта через Админ-панель в браузере
79
+
80
+ После завершения скрипта откройте в браузере **`https://ваш-домен.ru`**:
81
+
82
+ 1. В правом верхнем углу нажмите **«Войти»** и введите Email и пароль администратора, которые вы указали при установке.
83
+ 2. Перейдите в терминал (`Открыть веб-терминал →`) → вкладка **«Настройки»** → раздел **«Профиль, тариф и боты»**.
84
+ 3. Внизу страницы вы увидите **Панель администратора облака**:
85
+ * **Реквизиты Исполнителя (`/legal`):** впишите ваши ФИО/ИП, ИНН, ОГРНИП и Email поддержки → нажмите **«Сохранить реквизиты»**. Они сразу появятся внизу страницы `https://ваш-домен.ru/legal`.
86
+ * **Приём оплаты ЮKassa:** вставьте `Shop ID` и `Секретный ключ` из кабинета ЮKassa, включите галочку «Чеки 54-ФЗ» (если в ЮKassa подключена онлайн-касса) → нажмите **«Сохранить ЮKassa»**.
87
+ * Скопируйте показанный там **Webhook URL** (`https://ваш-домен.ru/api/billing/yookassa/webhook`) и вставьте его в личном кабинете ЮKassa в разделе **«Интеграция → HTTP-уведомления»**.
88
+ * **Модель ИИ для облака:** во вкладке **«Настройки → Модели ИИ»** подключите вашу рабочую модель ИИ (например, GigaChat, OpenAI-совместимый сервер или Qwen). Теперь она будет обслуживать и пользователей сайта, и пользователей `npx` по их `APIKey`!
89
+ * **Эталонные эксперименты для витрины:** проведите 1–2 исследования во вкладке «Эксперименты» и нажмите кнопку **«☆ На витрину»** — они сразу появятся на главной странице лендинга.
90
+
91
+ ---
92
+
93
+ ## 5. Как обновлять проект в будущем
94
+
95
+ Когда мы вносим улучшения в проект:
96
+ 1. На вашем рабочем компьютере публикуем новую версию в npm:
97
+ ```cmd
98
+ npm version patch && npm publish --access public
99
+ ```
100
+ 2. На облачном сервере выполняем одну команду обновления (база данных, пользователи и оплаты при этом полностью сохраняются):
101
+ ```bash
102
+ cd /opt/neuroalpha && npm update neuroalpha && systemctl restart neuroalpha
103
+ ```
@@ -126,7 +126,7 @@
126
126
  | Минимальное удержание, часов | Не закрывать позицию раньше этого времени при обычном ослаблении прогноза. Снижает число сделок и комиссий |
127
127
  | Сколько акций держать | Сколько лучших по прогнозу акций держать одновременно (при продажах — и столько же на продажу) |
128
128
  | Распределение суммы между акциями | «Поровну» — одинаково; «Обратно размаху акции» — спокойным бумагам больше, волатильным — меньше (снижает просадку) |
129
- | Направление торговли | «Только покупки», «Покупки и продажи» (продажа без покупки — заработок на падении акции относительно рынка) или «Нейтрально к рынку» (сильные покупаем, слабые продаём на равные суммы — общий рост или падение рынка почти не влияет). При продажах сумма на одну акцию вдвое меньше |
129
+ | Направление торговли | «Только в рост (без шорта)» — классическая покупка акций и продажа купленного с прибылью (работает на любом счёте и ИИС); «В рост и в падение (с шортом)» — дополнительно зарабатывает на падающих акциях за счёт коротких продаж (требуется маржинальная торговля; если на брокерском счёте она выключена, система автоматически переключает счёт в режим «Только в рост») |
130
130
  | Фильтр падающего рынка | Не открывать новые покупки, когда индекс Мосбиржи одновременно ниже уровня 2 часов назад и уровня торгового дня назад |
131
131
  | Плата за заём акций, % годовых | Сколько брокер берёт за заём акций для продажи без покупки. Начисляется за всё время, пока продажа открыта (20% годовых — около 0,05% за сутки) |
132
132
  | Окно обучения | На скольких последних днях стратегия учится |
@@ -0,0 +1,171 @@
1
+ # Устройство и математические принципы платформы «НейроАльфа»
2
+
3
+ > Подробное руководство простым языком: как работает концепция «Рынок как язык», откуда берётся устойчивая доходность >40% годовых, как устроены все механики самообучения, учёт цикличности и параметры системы.
4
+
5
+ ---
6
+
7
+ ## 1. Главная идея: «Рынок как язык»
8
+
9
+ В классическом теханализе каждую акцию смотрят отдельно: рисуют скользящие средние, RSI, MACD по графику условного Сбербанка в отрыве от остальных 99 компаний рынка. В реальности акции не живут в вакууме — капитал перетекает между связанными бумагами.
10
+
11
+ Платформа **«НейроАльфа»** переносит архитектуру больших языковых моделей (LLM) на поток биржевых котировок Московской биржи:
12
+
13
+ | Понятие в языковой модели (LLM) | Как это работает в «НейроАльфе» |
14
+ |---|---|
15
+ | **Словарь (Vocabulary)** | **~100 самых ликвидных акций Мосбиржи** (состав индекса широкого рынка `MOEXBMI`) + индекс `IMOEX` + макро-токены (`Brent`, `RGBI`, `CNYRUB`, `USDRUB`, `GLDRUB`). |
16
+ | **Эмбеддинг слова (Смысл)** | **Координаты акции на многомерной «карте рынка»**. Акции оказываются рядом не потому, что кто-то вручную прописал им отрасль, а потому, что они объективно движутся синхронно или имеют схожий профиль бизнеса. |
17
+ | **Контекст (Предыдущие слова)** | **Состояние всех ~100 акций за последние часы** (их очищенные от индекса движения цены и аномальные денежные потоки на трёх масштабах времени: 1 час, 2 часа до этого и предыдущие 5 часов). |
18
+ | **Механизм внимания (Attention)** | **Переток сигнала между соседями по карте**. Модель смотрит, куда сдвинулись ближайшие и дальние соседи акции, и вычисляет, догонит ли бумага своих соседей (переток капитала) или вернётся после чрезмерного рывка (возврат к среднему). |
19
+ | **Предсказание следующего токена** | **Прогноз остаточного движения каждой акции на `H` часов вперёд** (на сколько процентов бумага обгонит или отстанет от индекса Мосбиржи). |
20
+
21
+ ---
22
+
23
+ ## 2. Подготовка данных и защита от искажений
24
+
25
+ Любая математическая модель слепа, если в исторических котировках есть ложные разрывы или заглядывание в будущее. В «НейроАльфе» данные проходят 4 ступени очистки:
26
+
27
+ ### 2.1. Таймфрейм и исполнение сделок без «подглядывания»
28
+ * Базовый шаг времени — **10-минутные свечи** Мосбиржи (`BAR_INTERVAL = 10`).
29
+ * Решение принимается строго **по закрытию свечи $t$**, а сделка в симуляции и в жизни исполняется **по цене открытия следующей свечи $t + 1$ (`open[t + 1]`)** за вычетом комиссии брокера (`commissionPct`) и биржевого проскальзывания (`slippagePct`).
30
+
31
+ ### 2.2. Обратная корректировка дивидендных отсечек со сверкой по цене
32
+ * В день дивидендной отсечки (экс-даты) акция утром открывается вниз на размер дивиденда (например, −10%). Если не корректировать историю, модель примет это за «катастрофический обвал», а продавец в шорт получит в симуляции фальшивую прибыль.
33
+ * Справочники дивидендов в интернете часто содержат ошибки в датах на ±1–2 дня или неутверждённые дивиденды.
34
+ * Поэтому алгоритм (`adjustDividends` в `dataset.js`) берёт список дивидендов и **проверяет каждую отсечку по фактическому ночному разрыву цены**: если в районе расчётной даты (с учётом перехода Мосбиржи с режима `T+2` на `T+1` 31.07.2023) реально был утренний гэп, близкий к размеру дивиденда, цены до отсечки пропорционально масштабируются. Так ряд цен превращается в честный ряд **полной доходности (Total Return)**.
35
+
36
+ ### 2.3. Выделение чистого «остаточного движения» (Альфы)
37
+ Каждая акция ходит вместе с общим рынком. Если индекс Мосбиржи вырос на +2%, почти все акции выросли. Но предсказывать сам индекс за счёт прошлых свечей малоэффективно — зато **предсказывать, какая акция вырастет сильнее или упадёт слабее индекса, можно с огромной точностью**.
38
+
39
+ В каждом обучающем окне для каждой акции $i$ вычисляются:
40
+ 1. **Чувствительность к рынку ($\beta_i$, бета):** насколько сильно акция реагирует на движение индекса `IMOEX`.
41
+ 2. **Обычный размах ($\sigma_i$, волатильность):** стандартное отклонение остатка $e_i(t) = r_i(t) - \beta_i \cdot r_{\text{IMOEX}}(t)$.
42
+ 3. **Нормированное остаточное движение ($z$-скор):**
43
+ $$z_i(t) = \text{clip}\left(\frac{r_i(t) - \beta_i \cdot r_{\text{IMOEX}}(t)}{\sigma_i}, -8, +8\right)$$
44
+ Именно величины $z_i(t)$ делают спокойные акции (например, `SBER` или `TRNFP`) и высоковолатильные бумаги (например, `MTLR` или `VKCO`) сопоставимыми в единой шкале.
45
+
46
+ ---
47
+
48
+ ## 3. Учёт временны́х циклов: часы дня, дни недели, месяц и год
49
+
50
+ Рынок неоднороден во времени. В платформе реализован научно обоснованный учёт цикличности там, где статистика достоверна, и отсечены циклы, ведущие к переобучению:
51
+
52
+ ### 3.1. Суточный цикл (Почасовой профиль объёма `valRatio`) — **Огромный вклад в точность**
53
+ На Мосбирже объём торгов внутри дня имеет ярко выраженную U-образную форму:
54
+ * В **10:00–11:00 МСК** (утреннее открытие) и **17:00–18:50 МСК** (закрытие основной сессии) обороты в **4–6 раз выше**, чем в **13:00–15:00** или на вечерней сессии **19:05–23:50**.
55
+ * Если сравнивать оборот текущей свечи просто со средним оборотом за последние 50 часов подряд, модель каждое утро будет ошибочно думать, что происходит «аномальный всплеск объёма», а каждый вечер — что рынок «замер».
56
+ * **Как сделано в «НейроАльфе» (`dataset.js`):** Для каждой акции ведётся **24 отдельных скользящих счётчика по часам суток МСК**. Оборот свечи в 10:20 утра сравнивается со средним оборотом этой же акции именно в 10-м часу утра за прошлые торговые дни!
57
+ * **Результат внедрения:** Средняя ранговая корреляция прогноза с фактом (`IC`) выросла с **0.098 до 0.103**, коэффициент Шарпа вырос с **3.08 до 3.76**, а доходность на контрольном периоде (OOS) выросла с **+21.1% до +41.9%**!
58
+
59
+ ### 3.2. Внутридневная динамика точности сигнала (по часам МСК)
60
+ Измерение реальной предсказуемости рынка по часам суток показывает чёткую картину:
61
+ * **10:00–11:30 МСК:** Отыгрыш утренних гэпов и возврат перепроданных бумаг к сектору (`IC ≈ 0.08–0.12`).
62
+ * **13:00–15:30 МСК:** Дневное затишье (`IC ≈ 0.05`) — мелкие колебания лучше пропускать с помощью порога выгоды `modelMinEdge`.
63
+ * **16:00–19:30 МСК:** **Пик предсказуемости перетоков капитала (`IC ≈ 0.15–0.19`)** — закрытие дневной сессии и выравнивание портфелей крупными участниками.
64
+ * **Края сессии (09:50–10:10 и 18:35–18:55 МСК):** В стакане расширяется спред и проходят аукционы открытия/закрытия, поэтому брокерский предохранитель `skipEdgeMinutes` блокирует выставление реальных заявок в эти минуты.
65
+
66
+ ### 3.3. Дни недели и календарные циклы (Месяц / Год)
67
+ * **Дни недели:** Понедельник утром имеет более низкую предсказуемость (`IC ≈ 0.087`) из-за геополитических новостей выходных, тогда как **среда и четверг** дают пиковую точность (`IC ≈ 0.112–0.116`), а в пятницу вечером действует фактор сокращения риска перед выходными.
68
+ * **Почему в 2-часовую модель НЕ зашиваются жёсткие веса «месяца года»:**
69
+ Окно обучения модели составляет 90–120 торговых дней (4–5 месяцев). Внутри одного окна модель физически не видит остальные 8 месяцев года. Добавление признака «номер месяца» привело бы к ложному запоминанию одного конкретного года. Вместо этого среднесрочные сдвиги режима рынка (дивидендный сезон, циклы ставки ЦБ, налоговые недели экспортёров) улавливаются **адаптивным макро-фильтром тренда индекса** и **скользящим переобучением карты рынка каждый месяц**.
70
+
71
+ ---
72
+
73
+ ## 4. Три модели прогноза (Лесенка сложности)
74
+
75
+ Система никогда не верит сложной модели на слово — в каждом эксперименте одновременно обучаются и соревнуются три математические модели:
76
+
77
+ 1. **Ступень 0 — «Своя инерция» (`inertia`):**
78
+ Базовая планка. Предсказывает движение акции только по её собственным движениям за последний 1 час, 2 часа и 5 часов (гребневая регрессия из 3 весов). На горизонте 1–2,5 часов на Мосбирже веса отрицательные: акция, резко дёрнувшаяся против рынка без поддержки соседей, склонна откатывать назад.
79
+ 2. **Ступень 1 — «Кто за кем ходит» (`leadlag`):**
80
+ Линейная модель $N \times 2N$ без карты рынка: пытается предсказать каждую акцию по движениям всех остальных акций с автоматическим подбором регуляризации $\lambda$ на последних 20% окна обучения.
81
+ 3. **Ступень 2 — «Внимание через карту» (`attention` — Основная рабочая модель):**
82
+ * Сначала из матрицы корреляций остаточных движений методом вращений Якоби (`eigenSym`) извлекаются главные собственные векторы — **эмбеддинги акций** (размерность `modelEmbedDim`, по умолчанию 11).
83
+ * По косинусной близости эмбеддингов $\cos(e_i, e_j)$ строятся матрицы внимания с двумя температурами: **«широкое внимание» ($\beta = 4$, весь сектор)** и **«узкое внимание» ($\beta = 12$, только ближайшие 2–3 соседа)**.
84
+ * 12 голов внимания (2 вида признаков: цена и денежный поток с почасовой нормировкой объёма × 3 масштаба времени × 2 ширины внимания) + 3 собственных масштаба объединяются гребневой регрессией.
85
+
86
+ ---
87
+
88
+ ## 5. Механики управления портфелем и Самообучение правил (`modelAutoAdapt`)
89
+
90
+ Даже идеальный прогноз (`IC > 0.10`) можно превратить в убыток, если неправильно входить, пересиживать сделки или торговать бумагами, в которых сломалась структура. Поэтому поверх прогноза работает **адаптивный движок портфеля**:
91
+
92
+ ### 5.1. Ожидаемое движение (`Edge`) и Порог выгоды (`modelMinEdge`)
93
+ Модель выдаёт прогноз в стандартных отклонениях $\hat{y}_i$. Чтобы перевести его в реальные ожидаемые проценты движения за горизонт $H$ свечей, вычисляется:
94
+ $$\text{Edge}_i = \hat{y}_i \cdot \sigma_i \cdot \sqrt{H}$$
95
+ Сделка открывается только тогда, когда ожидаемое движение перекрывает удвоенные издержки (вход + выход = $2 \times (\text{комиссия} + \text{проскальзывание})$) минимум в `modelMinEdge` раз (по умолчанию в **2.5 раза**).
96
+
97
+ ### 5.2. Полушаговое сопровождение позиций (`H / 2`) и Двухступенчатый выход
98
+ Вместо того чтобы смотреть на рынок только раз в `H` часов, в режиме самообучения портфель проверяется каждые **`H / 2` свечей** (при горизонте 2 часа — каждый час):
99
+ * **В первой половине жизни сделки (`barsHeld < H`):** действует мягкий порог удержания (`0.35 × порог входа`), чтобы случайный внутридневной шум не выбил позицию сразу после открытия.
100
+ * **По истечении горизонта (`barsHeld >= H`):** включается строгий порог удержания (`0.75 × порог входа`). Если сигнал сохраняет силу — позиция удерживается дальше без лишней перепродажи и двойной комиссии; если импульс затух — прибыль сразу фиксируется, а слот освобождается для новой идеи.
101
+
102
+ ### 5.3. Временный карантин «акций-убийц» с экспоненциальным затуханием
103
+ На рынке периодически возникают бумаги, в которых из-за корпоративного конфликта, допэмиссии или специфических новостей перестают работать статистические связи.
104
+ * Система ведёт по каждой акции скользящий счётчик чистой доходности прошлых сделок `stockPnl[i]`.
105
+ * Если бумага за серию сделок (`stockCnt >= 3`) принесла накопленный убыток ниже `-1.2%`, она автоматически ставится **на карантин** — новые сделки по ней блокируются.
106
+ * **Важная механика амнистии:** на каждом шаге счётчики умножаются на коэффициент затухания `0.99` (период полураспада ~15 торговых дней). Поэтому бумага не банится навсегда — через 2–3 недели, когда аномалия на рынке проходит, акция возвращается в оборот.
107
+
108
+ ### 5.4. Адаптивная балансировка `Long / Short` по тренду индекса Мосбиржи
109
+ Модель предсказывает движение акции *относительно индекса*.
110
+ * Когда индекс Мосбиржи находится в среднесрочном падающем тренде (ниже уровня 10 торговых дней назад или в 3-дневном проливе >1%), покупать акции против падающего рынка опасно, а продавать слабые акции (шорт) — наоборот, вдвойне выгодно.
111
+ * В режиме `Покупки и продажи (longshort)` с включённым самообучением система автоматически **повышает входной фильтр для покупок (`×1.25`)** и **облегчает вход для коротких продаж (`×0.90`)** на падающем рынке (и наоборот — на растущем рынке).
112
+ * Именно эта механика позволяет стратегии стабильно зарабатывать и в растущие месяцы, и на затяжном падении индекса Мосбиржи (например, +253.9% за период, где сам индекс упал на −21%).
113
+
114
+ ### 5.5. Динамическое распределение капитала по слотам и силе сигнала (`Conviction Slot Sizing`)
115
+ При настройке `modelTopK = 2` в режиме `longshort` доступно до 2 слотов на покупку и до 2 слотов на продажу. Если в текущий момент на рынке есть только 1–2 сильных сигнала, капитал не делится мелкими долями `1/4`, оставляя половину денег лежать мёртвым грузом, а выделяет базовый слот до `35%` счёта и дополнительно масштабирует его пропорционально силе сигнала (`Conviction Sizing`: в диапазоне `0.85×…1.20×` от отношения ожидаемого движения к порогу входа `need`), с жёстким контролем, чтобы сумма всех открытых позиций никогда не превышала `99%` капитала (без кредитного плеча).
116
+
117
+ ---
118
+
119
+ ## 6. Справочник всех параметров платформы (3 логических раздела)
120
+
121
+ ### 6.1. Раздел «Стратегия и сигналы»
122
+ | Параметр | По умолчанию | Что делает и как влияет на торговлю |
123
+ |---|---|---|
124
+ | **Самообучение правил торговли (`modelAutoAdapt`)** | `Вкл` | Полный Автомат: включает мульти-горизонтное обучение (`1.5–3.5 ч`), полушаговое сопровождение `H/2`, двухступенчатый порог выхода (`0.35 / 0.95`), временный карантин убыточных бумаг, адаптацию порогов `Long/Short` к тренду индекса и взвешивание слота по силе сигнала (`Conviction Sizing`). При включённом Авто-режиме поля горизонта и порогов управляются автоматически. |
125
+ | **Сколько акций держать (`modelTopK`)** | `2` | Максимальное число одновременных позиций в лонг (и столько же в шорт при режиме `longshort`). `2–3` акции дают максимальную концентрацию в самых сильных сигналах при просадке в пределах 9–11.5%. |
126
+ | **Направление торговли (`modelDirection`)** | `В рост и в падение (с шортом)` (`longshort`) | • `Только в рост (без шорта)` (`long`) — классическая покупка акций и их продажа при фиксации прибыли (подходит для любого счёта и ИИС).<br>• `В рост и в падение (с шортом)` (`longshort`) — покупает лидеров и шортит аутсайдеров с авто-балансировкой по тренду индекса (**максимальная доходность +1 061% за 2,4 года / +134.6% OOS, Шарп 4.04**; на реальном брокерском счёте без подключённой маржинальной торговли шорты отключаются автоматически). |
127
+ | **Горизонт прогноза, часов (`modelHorizon`)** | `2.5` ч *(авто: 1.5–3.5ч)* | В режиме Авто управляется автоматически (мульти-горизонтная траектория `0.6H / 1.0H / 1.4H`). В ручном режиме — на сколько часов вперёд модель предсказывает движение. |
128
+ | **Порог выгоды на вход (`modelMinEdge`)** | `2.5` *(авто)* | В режиме Авто управляется автоматически (`2.5×` издержек). В ручном режиме — во сколько раз ожидаемое движение должно превышать удвоенные издержки. |
129
+ | **Порог на выход (`modelExitRatio`)** | `0.95` *(авто)* | В режиме Авто управляется автоматически (`0.35` на первых двух полушагах, `0.95` по зрелости). В ручном режиме — доля от порога входа для удержания позиции. |
130
+
131
+ ### 6.2. Раздел «Издержки и риск»
132
+ | Параметр | По умолчанию | Что делает |
133
+ |---|---|---|
134
+ | **Комиссия брокера и биржи, % за сделку (`commissionPct`)** | `0.04%` | Комиссия за одну сторону сделки. ИИ-Стратегу менять это поле запрещено, чтобы исключить подгонку за счёт занижения издержек. |
135
+ | **Проскальзывание при исполнении, % (`slippagePct`)** | `0.01%` | Ожидаемые потери на спреде в стакане при исполнении заявки. |
136
+ | **Плата за заём акций (`modelShortFeePct`)** | `20%` год. | Ставка брокера за перенос и удержание коротких позиций (шортов), списывается пропорционально времени удержания сделки. |
137
+ | **Распределение суммы (`modelAllocMode`)** | `Поровну` (`equal`) | `equal` — равные базовые доли на слот (с учётом `Conviction Sizing` в Авто-режиме); `invvol` — спокойным бумагам выделяется до 1.8× больше, волатильным — до 0.4× меньше. |
138
+ | **Фильтр падающего рынка (`modelMarketFilter`)** | `Выключен` (`off`) | В режиме `ma` полностью запрещает любые покупки при среднесрочном падении индекса Мосбиржи (актуально для режима `Только покупки`). |
139
+ | **Блокировать сделки против важных свежих новостей (`newsFilter`)** | `Выкл` | В живой проверке и в брокерских заявках блокирует покупку бумаги на сильном негативе за последние 6 часов (`imp >= 0.6`, `tone <= -0.4`) и шорт на сильном позитиве. |
140
+
141
+ ### 6.3. Раздел «Автопилот и система»
142
+ | Параметр | По умолчанию | Что делает |
143
+ |---|---|---|
144
+ | **Лимит исследований автопилота (`autopilotBudget`)** | `8` | Сколько экспериментов подряд может провести ИИ-Стратег за одно поручение в режиме `⚡ Авто`. |
145
+ | **ИИ разбирает каждый торговый день (`paperDailyReview`)** | `Вкл` | По окончании торгового дня Стратег автоматически разбирает сделки виртуального счёта и пишет сводку в чат. |
146
+ | **Окно обучения (`modelTrainDays`)** | `90` дн. | На скольких последних торговых днях строятся эмбеддинги карты рынка и обучаются веса перед каждым месяцем прогноза. |
147
+ | **Период исследования (`modelHistoryDays`)** | `1000` дн. | Глубина исторической проверки в календарных днях (~2.4 года торгов). Последние 30% (`oosPct = 30`) выделяются в независимый контрольный период. |
148
+ | **Размерность карты рынка (`modelEmbedDim`)** | `11` | Число собственных векторов матрицы корреляций, формирующих координаты акций на карте рынка. |
149
+ | **Вес бизнес-профилей компаний (`modelTextWeight`)** | `0` | Смешивает поведенческую матрицу близости акций с матрицей сходства бизнеса из 20 фундаментальных признаков, оцененных ИИ. |
150
+
151
+ ---
152
+
153
+ ## 7. Жёсткие предохранители при работе с реальным брокером
154
+
155
+ При подключении реального счёта (**Т-Банк, БКС, Финам, Алор**) действуют аппаратные предохранители, которые **не может изменить или отключить ИИ-Стратег**:
156
+
157
+ 1. **Три уровня допуска:**
158
+ * `Только чтение` — безопасная синхронизация портфеля и просмотр расчётных заявок;
159
+ * `Подтверждение заявок` — расчёт пакета заявок в целых лотах Мосбиржи (`TQBR`) и отправка карточки в **Telegram (`@neuroalpha_trade_bot`) и MAX** с кнопками `✓ Исполнить` / `✕ Отклонить`;
160
+ * `Автомат` — автоматическое выставление лимитных заявок по закрытию свечи.
161
+ 2. **Лимит капитала на стратегию (`maxCapitalRub`):** Стратегия оперирует строго выделенной суммой (например, `100 000 ₽`), даже если на вашем брокерском счёте лежит больше средств.
162
+ 3. **Дневной стоп по просадке (`maxDailyDrawdownPct`):** Если оценка счёта за текущий день снизилась от утреннего баланса на заданный порог (по умолчанию `−3%`), счёт автоматически переходит в статус `СТОП` и блокирует отправку новых заявок до ручного сброса пользователем.
163
+ 4. **Только лимитные заявки с контролируемым отступом (`limitOffsetPct`):** Заявки никогда не отправляются «по рынку» в пустой стакан — цена всегда рассчитывается с защитным лимитным отступом (по умолчанию `0.1%`), округлённым строго по шагу цены (`MINSTEP`) конкретной бумаги Мосбиржи.
164
+ 5. **Защита краёв сессии (`skipEdgeMinutes`):** В первые и последние 10 минут основной торговой сессии (`09:50–10:10` и `18:35–18:55` МСК), когда в стакане расширены спреды, автоматическая отправка заявок блокируется.
165
+ 6. **Авто-поиск субсчетов Т-Инвестиций и защита начального портфеля (Переходный период `legacyMode`):**
166
+ * По кнопке **«🔍 Найти мои счета по токену»** система сама загружает список всех ваших открытых субсчетов в Т-Инвестициях с их названиями из мобильного приложения и балансом.
167
+ * Облигации (ОФЗ и корпоративные), фонды (`LQDT`, `TMOS` и др.) и акции вне словаря `MOEXBMI` не продаются и не затрагиваются стратегией никогда.
168
+ * Для существующих акций на счёте доступны 3 режима переходного периода:
169
+ * **«Изолированный карман» (`isolate`, по умолчанию):** при первом подключении (или по кнопке «Защитить текущие бумаги») система запоминает ваши старые позиции (`baselineQty`) и никогда их не продаёт, торгуя строго новыми лотами в пределах выделенного лимита `maxCapitalRub`.
170
+ * **«Плавный переход» (`smooth`):** старые акции не распродаются в кэш одномоментно, а замещаются постепенно (не более 2 бумаг за шаг, начиная с позиций в плюсе), только когда стратегии требуются средства под новый подтверждённый сигнал покупки или если по самой старой акции вышел сильный прогноз падения.
171
+ * **«Полное управление» (`takeover`):** для выделенного под робота субсчёта — все нецелевые акции из словаря стратегии сразу приводятся к модельному портфелю.
package/package.json CHANGED
@@ -1,15 +1,27 @@
1
1
  {
2
2
  "name": "neuroalpha",
3
- "version": "0.2.0",
3
+ "version": "0.3.13",
4
4
  "description": "НейроАльфа — ИИ-автопилот для рынка акций Мосбиржи: эмбеддинги акций, самообучение правил, коннекторы Т-Банк / БКС / Финам / Алор и боты Telegram / MAX",
5
+ "author": "Roman A. Perepelkin",
6
+ "license": "UNLICENSED",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/proman1968/trading.git"
10
+ },
11
+ "homepage": "https://github.com/proman1968/trading#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/proman1968/trading/issues"
14
+ },
5
15
  "type": "module",
6
16
  "main": "server/index.js",
7
17
  "bin": {
8
- "neuroalpha": "./bin/cli.js",
9
- "trading-consortium": "./bin/cli.js"
18
+ "neuroalpha": "bin/cli.js",
19
+ "trading-consortium": "bin/cli.js"
10
20
  },
11
21
  "files": [
22
+ "LICENSE",
12
23
  "bin/",
24
+ "deploy/",
13
25
  "server/",
14
26
  "public/",
15
27
  "config/",
@@ -35,8 +47,6 @@
35
47
  "node": ">=22.13"
36
48
  },
37
49
  "dependencies": {
38
- "@tensorflow/tfjs": "^4.22.0",
39
- "@tensorflow/tfjs-backend-wasm": "^4.22.0",
40
50
  "express": "^4.21.2",
41
51
  "ws": "^8.18.0"
42
52
  }