neuroalpha 0.0.0-stage → 0.2.0

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 (46) hide show
  1. package/README.md +164 -3
  2. package/bin/cli.js +69 -0
  3. package/config/strategy.json +33 -0
  4. package/docs//320/230/320/235/320/241/320/242/320/240/320/243/320/232/320/246/320/230/320/257.md +156 -0
  5. package/package.json +43 -6
  6. package/public/app.js +2410 -0
  7. package/public/index.html +337 -0
  8. package/public/landing.html +870 -0
  9. package/public/legal.html +90 -0
  10. package/public/styles.css +343 -0
  11. package/server/api/routes.js +333 -0
  12. package/server/auth/index.js +340 -0
  13. package/server/billing/yookassa.js +132 -0
  14. package/server/brokers/index.js +645 -0
  15. package/server/config.js +44 -0
  16. package/server/data/moex.js +165 -0
  17. package/server/db.js +420 -0
  18. package/server/hub.js +14 -0
  19. package/server/index.js +92 -0
  20. package/server/llm/client.js +187 -0
  21. package/server/llm/providers.js +355 -0
  22. package/server/model/dataset.js +352 -0
  23. package/server/model/forecast.js +121 -0
  24. package/server/model/gpu-worker.html +11 -0
  25. package/server/model/gpu-worker.js +60 -0
  26. package/server/model/linalg.js +142 -0
  27. package/server/model/live.js +486 -0
  28. package/server/model/metrics.js +134 -0
  29. package/server/model/models.js +459 -0
  30. package/server/model/profiles.js +166 -0
  31. package/server/model/research.js +880 -0
  32. package/server/model/tf-node.js +26 -0
  33. package/server/model/transformer-core.js +330 -0
  34. package/server/model/transformer-gpu.js +221 -0
  35. package/server/model/transformer-pool.js +200 -0
  36. package/server/model/transformer-worker.js +28 -0
  37. package/server/model/transformer.js +57 -0
  38. package/server/model/vocab.js +28 -0
  39. package/server/news/index.js +309 -0
  40. package/server/notify/index.js +168 -0
  41. package/server/params-meta.js +63 -0
  42. package/server/settings.js +79 -0
  43. package/server/strategist/analytics.js +150 -0
  44. package/server/strategist/index.js +484 -0
  45. package/server/strategist/tools.js +302 -0
  46. package/server/util.js +9 -0
package/README.md CHANGED
@@ -1,3 +1,164 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
1
+ # Рынок как язык · MOEX
2
+
3
+ Исследование идеи: акции — «токены» со своими эмбеддингами (место на карте рынка по совместным движениям),
4
+ недавнее состояние ~100 акций индекса MOEXBMI — «контекст», модель предсказывает «следующее состояние» —
5
+ остаточное (без рынка) движение каждой акции на H часов вперёд. Над системой работает ИИ-исследователь «Стратег» (Qwen),
6
+ который ставит эксперименты, ведёт журнал гипотез и разбирает живую проверку. Только виртуальные деньги.
7
+
8
+ 📖 **[Инструкция пользователя](docs/ИНСТРУКЦИЯ.md)** (она же — кнопка «?» в программе).
9
+
10
+ ## Запуск
11
+
12
+ ```powershell
13
+ npm.cmd install
14
+ npm.cmd start
15
+ ```
16
+
17
+ Клиент: http://localhost:3000. Нужен Node.js ≥ 22.13 (встроенный `node:sqlite`). В VS Code — **F5**, браузер откроется сам.
18
+ В PowerShell используйте `npm.cmd` (`npm.ps1` блокируется политикой выполнения скриптов).
19
+ Зависимости: `express`, `ws`; `@tensorflow/tfjs` и `@tensorflow/tfjs-backend-wasm` — только для трансформера (загружаются лениво).
20
+
21
+ ## Как устроено
22
+
23
+ ```
24
+ MOEX ISS: ~100 акций MOEXBMI + IMOEX, свечи по 10 минут (будни) ──► SQLite-кэш ──► model/dataset.js (N×T, open/close, обороты)
25
+ dataset.js: при modelUseDividends (по умолчанию да) цены скорректированы на дивиденды — обратная корректировка по экс-датам
26
+ (полная доходность; экс-дата: T+1 с 31.07.2023, раньше T+2). Источник неточен (дубли, прогнозные строки, сдвиги дат), поэтому
27
+ дата сверяется с ночным разрывом цены (±2 дня, дивиденд ≥1%; мелкие — только в расчётный день, <0,5% не корректируются);
28
+ если подходящего падения нет, дивиденд пропускается. Версия обработки данных DATA_VERSION в research.js (старые прогоны не «дубликаты»). Дивиденды — data/moex.js: ISS, запасной источник — smart-lab, кэш в kv на сутки.
29
+ При modelUseMacro — макро-ряды: нефть Brent (склейка фьючерсов: каждый день — контракт с наибольшим оборотом,
30
+ стык без скачка цены), золото, юань, доллар, индекс гособлигаций (RGBI)
31
+ │
32
+ ├─ model/research.js — пошаговая проверка: окно обучения 120 дн. → прогноз месяц → сдвиг (~27 шагов за 2 года)
33
+ │ model/models.js:
34
+ │ ├─ бета к рынку и размах — по окну обучения; остаточные z-движения; признаки: цена и «денежный поток» × 3 масштаба;
35
+ │ │ цель — open(t+1)→open(t+1+H) без рынка (исполнение по цене открытия следующей свечи)
36
+ │ ├─ эмбеддинги: собственные векторы корреляций остаточных движений (Якоби), карта 2D + k-means;
37
+ │ │ при modelTextWeight > 0 близость смешивается с похожестью профилей компаний (model/profiles.js)
38
+ │ ├─ макро-головы (modelUseMacro): бета остатков акции к макро × z-движения макро × 3 масштаба
39
+ │ ├─ «своя инерция» (сводная регрессия по своим движениям)
40
+ │ ├─ «кто за кем ходит» (гребневая регрессия N×2N, λ по валидации)
41
+ │ └─ «внимание через карту»: 12 голов softmax(β·cos(e_i,e_j)) × признаки соседей + макро-головы
42
+ │ model/transformer.js — 4-я модель (modelUseTransformer или modelType = transformer): энкодер с вниманием
43
+ │ МЕЖДУ акциями — каждая акция «токен»; TensorFlow.js + WASM (ленивая загрузка); учится заново в каждом окне,
44
+ │ окна — параллельно в рабочих потоках или на видеокарте (см. «Трансформер: потоки и видеокарта»)
45
+ │ model/profiles.js — 20 устойчивых признаков бизнеса компании от ИИ (обновление раз в 30 дней; только факты
46
+ │ «вне времени» — без новостей и прогнозов, иначе ИИ «подсмотрит будущее»); «текстовая» карта: главные компоненты + k-means
47
+ │ портфель: modelAutoAdapt (по умолчанию вкл.) — самообучение правил торговли (авто-калибровка порога выхода под реальную
48
+ │ комиссию на скользящем окне + автоматический карантин систематически убыточных «акций-убийц»); modelDirection — только
49
+ │ покупки / покупки и продажи / нейтрально к рынку; плата за заём акций — modelShortFeePct; ручные настройки в Дополнительно:
50
+ │ modelExitRatio, modelMinHoldHours, modelAllocMode (поровну / обратно размаху акции), modelMarketFilter; устойчивость —
51
+ │ быстрые сдвиги входа в каждом прогоне + startStabilityCheck (5 сдвигов периода −8…+8 дней с прогрессом и отменой)
52
+ │ метрики: ранговая корреляция прогноза с фактом (ликвидные), доля недель с плюсом, портфель top-K с порогом
53
+ │ выгоды, с комиссиями и без, рынок; период настройки / контрольный (70/30)
54
+ ├─ model/forecast.js — прогноз по последней свече + вклад соседей + веса «обратно размаху» для расчёта долей
55
+ └─ model/live.js — виртуальные счета (до 5 параллельно): настройки замораживаются при запуске, счёт «из прогона»
56
+ сверяется с коридором истории; каждую свечу оценка, раз в H свечей прогноз и пересмотр портфеля;
57
+ newsFilter — не входить против важной свежей новости
58
+
59
+ Брокеры (brokers/index.js): Т-Банк (T-Invest API), Финам (Trade API), Алор (OpenAPI), БКС — REST-адаптеры портфеля и заявок;
60
+ справочник лотности и шага цены Мосбиржи (TQBR, кэш на сутки) — заявки в целых лотах с округлением лимитной цены;
61
+ 3 режима счёта: только чтение / подтверждение заявок / автомат (лимитные заявки); жёсткие предохранители: лимит суммы на
62
+ стратегию, дневной стоп по просадке, отступ лимитки, пропуск первых/последних 10 минут сессии. Токены — только в локальной SQLite.
63
+
64
+ Новости (news/index.js): RSS Интерфакса, РБК, Прайма, ТАСС + новости Мосбиржи → дешёвый фильтр по названиям компаний
65
+ и экономическим словам → разметка ИИ (каких акций касается, тон −1…+1, важность, суть); во время торгов опрос раз в 10 минут,
66
+ хранение 14 дней. Только для прогноза и живой проверки: истории новостей нет, и ИИ, знающий настоящее, исказил бы проверку
67
+ на истории. Инструмент Стратега — get_news.
68
+
69
+ Стратег (strategist/): цикл агента со стримингом (SSE) и вызовом функций; режимы обсуждение / с согласия / автопилот;
70
+ журнал гипотез — память; защита от подгонки (только период настройки, контрольный — final_check ≤ 3 раз, сравнение с базой).
71
+ ```
72
+
73
+ Ядро модели — чистый JavaScript без зависимостей (`model/linalg.js`: собственные векторы, Холецкий, Спирмен, k-средних).
74
+ Единственная «тяжёлая» зависимость — трансформер: TensorFlow.js с WASM-бэкендом, загружается только когда он включён.
75
+
76
+ ## Трансформер: потоки и видеокарта
77
+
78
+ Окна пошаговой проверки независимы, поэтому трансформер разных окон обучается одновременно (`transformerParallel`, по умолчанию
79
+ включено): главный поток строит окна и считает базовые модели, а в рабочие потоки (`worker_threads`) уходят только нужные
80
+ трансформеру массивы. Результат совпадает с последовательным обучением до последнего знака (те же сиды, тот же код).
81
+
82
+ - **Число потоков** — автоматически: ядер − 1 (`os.availableParallelism()`), не больше числа окон и не больше, чем помещается
83
+ в половину свободной памяти (≈250 МБ на поток + 3 × объём данных окна). Вручную — переменная `TRANSFORMER_THREADS`.
84
+ - **Видеокарта** (`transformerGpu`, экспериментально): без нативных сборок — TensorFlow.js с WebGL в безголовом браузере
85
+ на базе Chromium со своим временным профилем. Браузер ищется так: `BROWSER_PATH`, затем стандартные места Chrome / Edge /
86
+ Chromium / Brave (Windows: Program Files, Program Files (x86), LOCALAPPDATA; macOS: /Applications; Linux: PATH).
87
+ Служебная страница и WebSocket — на отдельном порту только для 127.0.0.1. Если браузера нет, WebGL недоступен
88
+ или отрисовка программная (SwiftShader, llvmpipe, Microsoft Basic Render…) — обучение идёт на процессоре.
89
+ Окна на видеокарте обучаются по очереди; браузер закрывается после исследования (для прогноза — после 10 минут простоя)
90
+ и при отмене; процессы завершаются по своему PID. Где шло обучение — в результатах исследования (`extra.transformer.device`).
91
+ На встроенной графике видеокарта обычно не быстрее процессора — выигрыш возможен на дискретной.
92
+ - Прогноз «сейчас» и живая проверка обучают трансформер в отдельном потоке (или на видеокарте), чтобы сервер не замирал.
93
+ - `transformerEpochs` и `transformerStride` — эпохи и шаг свечей при обучении (по умолчанию 8 и 6).
94
+
95
+ ## Структура
96
+
97
+ | Путь | Назначение |
98
+ |------|------------|
99
+ | `config/strategy.json` | Настройки по умолчанию |
100
+ | `server/model/` | Словарь, данные, модели, исследование, прогноз, живая проверка, метрики |
101
+ | `server/model/transformer-core.js` | Трансформер: обучение и прогноз — общий код для Node и браузера (tf передаётся параметром) |
102
+ | `server/model/transformer.js`, `tf-node.js` | Обёртка для главного потока, загрузка TensorFlow.js (WASM → процессор) |
103
+ | `server/model/transformer-pool.js`, `transformer-worker.js` | Пул рабочих потоков: окна трансформера обучаются одновременно |
104
+ | `server/model/transformer-gpu.js`, `gpu-worker.html/.js` | Обучение на видеокарте: WebGL в безголовом Chrome / Edge / Chromium / Brave |
105
+ | `server/model/profiles.js` | Описания компаний: 20 устойчивых признаков от ИИ, «текстовая» карта |
106
+ | `server/news/index.js` | Новости: сбор из RSS и с Мосбиржи, разметка ИИ, фильтр для живой проверки |
107
+ | `server/brokers/index.js` | Брокерские счета: Т-Банк, Финам, Алор, БКС; лоты и шаг цены Мосбиржи; предохранители |
108
+ | `server/strategist/` | Стратег: цикл агента, инструменты, аналитика |
109
+ | `server/llm/client.js` | Потоковый клиент модели (SSE, функции, таймаут по простою, отмена) |
110
+ | `server/llm/providers.js` | Реестр подключений и выбранная модель, GigaChat OAuth |
111
+ | `server/params-meta.js`, `server/settings.js` | Описание и хранение настроек |
112
+ | `server/data/moex.js` | Загрузка свечей и дивидендов MOEX ISS с кэшем (запасной источник дивидендов — smart-lab) |
113
+ | `public/` | Интерфейс без сборки (lightweight-charts, marked) |
114
+
115
+ ## LLM (выбор модели для Стратега)
116
+
117
+ Модель выбирается в шапке чата (список «Провайдер · модель»). Подключения настраиваются во вкладке «Настройки → Модели ИИ»:
118
+ добавление, редактирование (включая ключ и адрес), удаление, проверка («ответь одним словом»), список моделей с сервера.
119
+ Реестр, ключи и выбор хранятся в базе (`data/` — в git не попадают); с сервера ключи никогда не возвращаются.
120
+
121
+ Протоколы:
122
+ - **OpenAI-совместимый** — `https://…/v1/chat/completions` (потоковый ответ, размышления, инструменты).
123
+ - **GigaChat** — формат чата как у OpenAI, но вход по OAuth: «ключ авторизации» меняется на токен (живёт ~30 минут, обновляется сам), `scope` по умолчанию `GIGACHAT_API_PERS`.
124
+ - **Ollama** — `http://localhost:11434/v1/chat/completions`, ключ не нужен.
125
+ - **Anthropic** — без потока и без инструментов (только беседа).
126
+
127
+ Если у модели снят флажок «инструменты», Стратег только беседует (в чате доступен лишь режим «Только обсуждение»).
128
+
129
+ Проект самостоятелен и не зависит от соседних папок. Единственная отправная точка — переменные `LLM_*` в `.env`
130
+ (если заданы, при первом запуске создаётся подключение «Из .env»), дальше всё настраивается в интерфейсе.
131
+
132
+ Сертификат GigaChat (НУЦ Минцифры): Node его не знает. Путь к `russian_trusted_root_ca.pem` указывается
133
+ в поле «Сертификат» подключения или в переменной `GIGACHAT_CA_FILE` (действует только для запросов к GigaChat,
134
+ проверка TLS не отключается). Ключ авторизации можно также задать переменной `GIGACHAT_KEY`.
135
+
136
+ ## API
137
+
138
+ | Метод | Путь | Описание |
139
+ |-------|------|----------|
140
+ | GET | `/api/config` | Описание настроек, статус ИИ |
141
+ | GET/PUT | `/api/settings`; POST `/api/settings/reset` | Настройки |
142
+ | GET; DELETE | `/api/runs`, `/api/runs/:id`; PUT `/api/runs/:id/title` | Исследования, имена прогонов |
143
+ | POST | `/api/model/research`, `/api/model/:id/cancel`; POST `/api/runs/:id/stability` | Исследование, отмена, проверка устойчивости |
144
+ | GET | `/api/model/forecast` | Прогноз на ближайшие часы |
145
+ | GET; POST | `/api/profiles`, `/api/profiles/refresh` | Описания компаний и «текстовая» карта; принудительное обновление |
146
+ | GET | `/api/news` | Свежие размеченные новости |
147
+ | GET/POST/DELETE | `/api/live/status`, `/api/live/start`, `/api/live/stop`, `/api/live/:id` | Виртуальные счета (несколько параллельно) |
148
+ | GET/POST/PUT/DELETE | `/api/brokers[/:id]`; POST `…/:id/sync|prepare|execute|reject` | Брокерские счета, портфель, заявки |
149
+ | GET/POST | `/api/journal` | Журнал гипотез |
150
+ | GET/POST/PUT/DELETE | `/api/llm/providers[/:id]`, GET `/api/llm/providers/:id/remote-models` | Подключения к моделям ИИ |
151
+ | POST | `/api/llm/test`, `/api/llm/select` | Проверка подключения, выбор модели |
152
+ | GET/POST | `/api/chat`, `/chat/send`, `/chat/action`, `/chat/stop`, `/chat/mode`, `/chat/new` | Стратег |
153
+ | WS | `/ws` | События: ответы и размышления ИИ, прогресс, виртуальные счета, брокеры, новости, описания |
154
+
155
+ ## Ограничения
156
+
157
+ - Данные MOEX ISS без подписки приходят с задержкой; для часовых решений некритично.
158
+ - Контрольный период использовался при разработке (выбор порога выгоды), поэтому главная проверка — живая.
159
+ - Позиции на виртуальных счетах дробные (лоты не учитываются). В брокерских заявках лоты и шаг цены учитываются всегда.
160
+ - Брокерские адаптеры (Т-Банк, Финам, Алор, БКС) проверены на тестовом контуре не полностью: форматы ответов брокеров
161
+ меняются, при первой интеграции начните с режима «Только чтение» или песочницы.
162
+ - Исследование с трансформером медленное (~20 минут на год истории): нейросеть учится заново в каждом окне.
163
+ - Описания компаний и разметку новостей делает ИИ — они могут ошибаться. В описания сознательно попадают только
164
+ устойчивые факты (без событий и прогнозов), а новости не используются в проверках на истории — иначе ИИ «подсмотрит будущее».
package/bin/cli.js ADDED
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import fs from 'node:fs';
5
+ import { spawn } from 'node:child_process';
6
+ import { fileURLToPath } from 'node:url';
7
+
8
+ const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
9
+ const args = process.argv.slice(2);
10
+
11
+ let port = process.env.PORT || '3000';
12
+ let apiKey = process.env.NEUROALPHA_API_KEY || '';
13
+ let cloudUrl = process.env.CLOUD_URL || '';
14
+ let dataDir = process.env.NEUROALPHA_DATA_DIR || '';
15
+ let noBrowser = false;
16
+
17
+ for (let i = 0; i < args.length; i++) {
18
+ const a = args[i];
19
+ if (a === '--help' || a === '-h') {
20
+ console.log(`
21
+ ◈ НейроАльфа — ИИ-автопилот для рынка акций (Мосбиржа)
22
+
23
+ Запуск:
24
+ npx neuroalpha [опции]
25
+
26
+ Опции:
27
+ --key, -k <na_live_...> Активировать API-ключ подписки с сайта
28
+ --port, -p <число> Порт локального сервера (по умолчанию 3000)
29
+ --data, -d <путь> Папка для локальной базы данных и ключей
30
+ --cloud <url> Адрес облачного сервера лицензий
31
+ --no-browser Не открывать браузер автоматически
32
+ --help, -h Показать эту справку
33
+ `);
34
+ process.exit(0);
35
+ }
36
+ if ((a === '--key' || a === '-k') && args[i + 1]) { apiKey = args[++i]; continue; }
37
+ if (a.startsWith('--key=')) { apiKey = a.slice(6); continue; }
38
+ if ((a === '--port' || a === '-p') && args[i + 1]) { port = args[++i]; continue; }
39
+ if (a.startsWith('--port=')) { port = a.slice(7); continue; }
40
+ if ((a === '--data' || a === '-d') && args[i + 1]) { dataDir = args[++i]; continue; }
41
+ if (a.startsWith('--data=')) { dataDir = a.slice(7); continue; }
42
+ if (a === '--cloud' && args[i + 1]) { cloudUrl = args[++i]; continue; }
43
+ if (a.startsWith('--cloud=')) { cloudUrl = a.slice(8); continue; }
44
+ if (a === '--no-browser') { noBrowser = true; continue; }
45
+ }
46
+
47
+ // Если запуск идёт вне исходной папки разработки (например через npx), храним БД в ~/.neuroalpha
48
+ const localData = path.join(ROOT, 'data');
49
+ if (!dataDir) {
50
+ const isDevRepo = fs.existsSync(path.join(ROOT, '.git')) || fs.existsSync(path.join(localData, 'trading.db'));
51
+ dataDir = isDevRepo ? localData : path.join(os.homedir(), '.neuroalpha');
52
+ }
53
+
54
+ const env = {
55
+ ...process.env,
56
+ PORT: String(port),
57
+ NEUROALPHA_DATA_DIR: path.resolve(dataDir),
58
+ OPEN_BROWSER: noBrowser ? '0' : '1',
59
+ ...(apiKey ? { NEUROALPHA_API_KEY: apiKey } : {}),
60
+ ...(cloudUrl ? { CLOUD_URL: cloudUrl } : {}),
61
+ };
62
+
63
+ const child = spawn(
64
+ process.execPath,
65
+ ['--disable-warning=ExperimentalWarning', path.join(ROOT, 'server', 'index.js')],
66
+ { stdio: 'inherit', env }
67
+ );
68
+
69
+ child.on('exit', (code) => process.exit(code ?? 0));
@@ -0,0 +1,33 @@
1
+ {
2
+ "modelAutoAdapt": true,
3
+ "modelType": "attention",
4
+ "modelHorizon": 2,
5
+ "modelMinEdge": 2.5,
6
+ "modelExitRatio": 0.75,
7
+ "modelMinHoldHours": 0,
8
+ "modelTopK": 3,
9
+ "modelAllocMode": "equal",
10
+ "modelDirection": "longshort",
11
+ "modelMarketFilter": "off",
12
+ "modelShortFeePct": 20,
13
+ "modelTrainDays": 90,
14
+ "modelHistoryDays": 850,
15
+ "modelEmbedDim": 11,
16
+ "modelUseDividends": true,
17
+ "modelUseMacro": false,
18
+ "modelTextWeight": 0,
19
+ "modelUseTransformer": false,
20
+ "transformerEpochs": 8,
21
+ "transformerStride": 6,
22
+ "transformerParallel": true,
23
+ "transformerGpu": false,
24
+ "capital": 1000000,
25
+ "commissionPct": 0.04,
26
+ "slippagePct": 0.01,
27
+ "oosPct": 30,
28
+ "paperPollSec": 60,
29
+ "paperDailyReview": true,
30
+ "autopilotBudget": 8,
31
+ "newsEnabled": true,
32
+ "newsFilter": false
33
+ }
@@ -0,0 +1,156 @@
1
+ # Рынок как язык — как пользоваться
2
+
3
+ > Только виртуальные деньги. Программа проверяет идею и не является советом, куда вкладывать.
4
+
5
+ ## Идея
6
+
7
+ Языковая модель читает текст и предсказывает **следующее слово**. Здесь рынок читается так же:
8
+
9
+ | В языковой модели | На рынке |
10
+ |---|---|
11
+ | Слово | Акция (около 100 акций индекса широкого рынка МосБиржи) |
12
+ | Смысл слова | **Место акции на карте рынка**: рядом стоят акции, которые обычно движутся вместе |
13
+ | Предыдущий текст | Что происходило со всеми акциями за последние часы |
14
+ | Следующее слово | **Какие акции в ближайшие часы будут сильнее или слабее рынка** |
15
+
16
+ Когда в одну точку карты «падают» деньги, волна расходится к соседям, и отставший сосед может догнать.
17
+ Бывает и обратное: акция, резко ушедшая от соседей, возвращается. Модель учится различать эти случаи сама.
18
+
19
+ ## Экран
20
+
21
+ - **Слева — Стратег**, ИИ-исследователь и помощник. В нижней карточке ввода можно писать текстом или нажать **микрофон (`🎙`) для голосового ввода**, там же переключаются режим работы (`💬 Обсуждение`, `✋ С согласия`, `⚡ Автопилот`) и модель ИИ. Номера прогонов (`№234`) в ответах Стратега кликабельны и сразу открывают нужный прогон справа.
22
+ - **Справа — четыре вкладки в едином стиле OpenCode:** Эксперименты, Торговля, Карта и журнал, Настройки.
23
+ - Границу между панелями можно **перетащить мышью**, двойной щелчок возвращает исходную ширину.
24
+ - В правом верхнем углу: индикатор связи, переключатель **светлой и тёмной темы (`☀ / ☾`)** и кнопка **?** — эта справка.
25
+
26
+ ## Эксперименты
27
+
28
+ Кнопка **«Исследовать»** проверяет стратегию на двух годах истории честно, шаг за шагом: стратегия учится на прошлых месяцах,
29
+ прогнозирует следующий месяц, которого не видела, затем окно сдвигается. Занимает около минуты, первый раз — несколько минут на загрузку цен.
30
+ Цены акций скорректированы на дивиденды: падение цены в день отсечки не считается убытком, а сам дивиденд идёт в результат; даты отсечки сверяются с реальным падением цены.
31
+
32
+ После этого вы увидите:
33
+ - **выпадающий список прогонов во всю ширину** сверху и под ним строку действий с выбранным прогоном: **✎ Назвать**, **✓ Применить эти настройки (N)** (появляется только если настройки выбранного прогона отличаются от ваших текущих), **Проверить устойчивость**, **▶ В торговлю**, **💬 Разобрать**, **⇄ Сравнить**, **Удалить**;
34
+ - **вывод одной фразой:** зарабатывает ли стратегия, помогает ли карта рынка, какой порог выхода выбрало **самообучение правил** и какие убыточные бумаги оно автоматически отправило в карантин;
35
+ - **четыре числа:** итог стратегии после комиссий, рынок за то же время, число сделок, худшее падение счёта;
36
+ - строка **«Покупки · Продажи»** — вклад тех и других в итог (появляется, когда включены продажи);
37
+ - **блок устойчивости:** вердикт («Устойчиво» / «Средняя устойчивость» / «Сильно зависит от случая»), медиана и разброс итога по сдвигам входа. Кнопка **«Проверить устойчивость»** прогоняет 5 сдвигов периода (−8…+8 дней) и показывает, насколько итог зависит от случайного выбора момента;
38
+ - **график:** счёт стратегий против рынка;
39
+ - переключатель **Весь период / Настройки / Контрольный**. Главное — **контрольный** период: на нём настройки не подбирались;
40
+ - блок **«Сравнение стратегий и на что смотрит стратегия»:**
41
+ - три стратегии — от простейшей («своя инерция») до «внимания через карту»; с галочкой «Добавить трансформер (медленно)» — четвёртая, нейросеть с вниманием между акциями. Это медленно, хотя месяцы обучаются одновременно на нескольких ядрах (по желанию — на видеокарте, см. «Дополнительно»);
42
+ - «совпадение прогноза с фактом» (0,03 и выше на рынке уже ценно);
43
+ - итог с комиссиями и без: если без комиссий плюс, а с ними минус, значит сигнал есть, но его съедают издержки;
44
+ - «головы внимания»: зелёный — соседи тянут акцию за собой, красный — акция возвращается после перекоса; с галочкой «Учитывать нефть, валюту, облигации» добавляется полоса «Нефть, валюта, облигации» — насколько нефть, юань, доллар, золото и облигации тянут акции за собой;
45
+ - блок **«Сделки»**.
46
+
47
+ Кнопка **▶ В торговлю** запускает виртуальный счёт с замороженными настройками этого прогона. Кнопки **💬 Разобрать со Стратегом** и **⇄ Сравнить…** отправляют Стратегу запрос на разбор или сравнение прогонов. Прошлые прогоны выбираются в списке слева от кнопки, **«Удалить»** удаляет выбранный, **«⟲ Настройки прогона»** делает текущие настройки такими же, как в нём.
48
+
49
+ **Как читать результат.** Итог в рублях — самая шумная часть картины, особенно когда «Сколько акций держать» = 1:
50
+ одинаковые настройки с разницей всего в пару новых свечей давали от −21% до +38% — это случайность, а не свойство стратегии.
51
+ Надёжнее смотреть на «совпадение прогноза с фактом»: если оно устойчиво выше нуля, стратегия действительно видит рынок.
52
+ Перспективные находки проверяйте кнопкой «Проверить устойчивость» и при 3–5 акциях — несколько акций в портфеле гасят случайную удачу одной.
53
+
54
+ ## Торговля
55
+
56
+ - **Прогноз:** какие акции стратегия считает сильнее или слабее рынка в ближайшие часы и **под чьим влиянием**.
57
+ Пример: «TATNP +0,33%, под влиянием LKOH, TATN, ROSN». «Купить» — если ожидание окупает комиссии с запасом;
58
+ когда разрешены продажи (настройка «Направление торговли»), появляется и метка «продать». Значок ● рядом с акцией —
59
+ свежие новости о ней: зелёный — хорошие, красный — плохие, серый — нейтральные; наведение мыши показывает суть и источник.
60
+ - **Новости:** раз в 10 минут программа собирает новости и раскрытия компаний,
61
+ а ИИ определяет, каких акций они касаются и хорошие они или плохие. Новости помогают только в прогнозе и торговле,
62
+ в исследованиях на истории они не участвуют: старых новостей не существует, а ИИ знает сегодняшние и «подсмотрел бы ответ» — проверка стала бы нечестной.
63
+ - **Виртуальные счета:** можно держать несколько счетов одновременно (до 5). Каждый запускается либо кнопкой «+ Новый виртуальный счёт»
64
+ (с текущими настройками), либо кнопкой **▶ В торговлю** из удачного прогона — тогда настройки счёта **замораживаются**
65
+ (дальнейшие эксперименты их не сбивают). Счёт, запущенный из прогона, показывает **ориентир истории**: сколько стратегия
66
+ зарабатывала в среднем за прошедшее время по этому прогону и допустимый коридор; выход за нижнюю границу подсвечивается.
67
+ Покупка идёт по цене открытия следующей свечи; после каждого торгового дня Стратег пишет короткий разбор. Это **единственная по-настоящему честная проверка**:
68
+ стратегия торгует на данных, которых раньше не видела. Судить о результате можно через 1–3 месяца.
69
+ - **Брокерские счета (Т-Банк, Финам, Алор, БКС):** подключаются в **«Настройки → Брокерские счета»** по токену API.
70
+ Режимы: **«Только чтение»** (портфель и сверка), **«Подтверждение заявок»** (программа считает пакет лимитных заявок
71
+ в целых лотах Мосбиржи, вы нажимаете «Исполнить заявки») и **«Автомат»**. У каждого счёта — жёсткие предохранители:
72
+ лимит суммы на стратегию, дневной стоп по просадке и пропуск первых и последних 10 минут сессии.
73
+ Токены хранятся только в локальной базе на этом компьютере. Начинайте с режима «Только чтение» или песочницы брокера.
74
+
75
+ ## Карта и журнал
76
+
77
+ Каждая точка — акция. Близко — значит акции обычно движутся вместе, цвет — найденная группа.
78
+ Стратегия строит карту только по движениям цен, без справочника отраслей, и всё равно находит, например, нефтяников, электросети,
79
+ обычные и привилегированные акции одной компании. Ползунок показывает, как карта менялась по месяцам.
80
+ Последняя позиция «Сейчас» (после прогноза) раскрашивает точки прогнозом. Нажмите на акцию, чтобы увидеть соседей.
81
+
82
+ Переключатель **«По поведению / По описанию»** показывает две разные карты. «По поведению» — описанная выше.
83
+ «По описанию» — по тому, что за бизнес у компании: ИИ составляет описания компаний — 20 устойчивых признаков
84
+ (экспортёр, банк, стабильные дивиденды, зависимость от нефти или ставки…), и акции расставляются по сходству описаний.
85
+ В описания попадают только давние факты, без новостей и прогнозов — историю стратегии они не портят; обновляются описания
86
+ раз в 30 дней, кнопка «Составить описания компаний (ИИ)» создаёт их впервые. Настройка «Вес описаний компаний на карте»
87
+ решает, насколько описания примешиваются к основной карте, по которой работает сама стратегия.
88
+
89
+ Ниже карты — **журнал проверенных гипотез**: память Стратега. После каждого эксперимента он записывает, что проверял и что вышло.
90
+
91
+ ## Стратег
92
+
93
+ **Модель ИИ** выбирается списком в шапке чата; подключения (свои, GigaChat, Ollama и любые OpenAI-совместимые) добавляются и настраиваются в **«Настройки → Модели ИИ»**. Если модель не умеет пользоваться инструментами, Стратег только беседует.
94
+
95
+ **Режимы** (переключатель над чатом):
96
+ - **Только обсуждение** — анализирует и отвечает, ничего не запускает.
97
+ - **С моего согласия** — предлагает исследования и изменения настроек, вы нажимаете «Подтвердить» или «Отклонить».
98
+ - **Автопилот** — сам проводит серию исследований (до указанного числа) и присылает отчёт.
99
+
100
+ Что можно спросить:
101
+ - «Объясни идею простыми словами»;
102
+ - «Исследуй модель и объясни результат»;
103
+ - «Что модель ждёт в ближайшие часы?»;
104
+ - «Проверь, лучше ли горизонт 2 часа»;
105
+ - «Кто соседи у Сбербанка на карте?»;
106
+ - «Какие свежие новости по Сбербанку?»
107
+
108
+ **Журнал гипотез** — память Стратега. После каждого эксперимента он записывает, что проверял и что вышло,
109
+ и не повторяет уже проваленное. Неверную запись можно удалить.
110
+
111
+ **Защита от самообмана:** Стратег подбирает настройки только по периоду настройки, контрольный период открывает
112
+ не больше 3 раз за разговор и сравнивает только с исследованием на тех же настройках. Комиссии менять ему запрещено.
113
+
114
+ Блок «Размышления» над ответом — ход мысли модели, он свёрнут, нажмите, чтобы раскрыть. Модель часто думает по-английски, но отвечает по-русски.
115
+
116
+ ## Настройки
117
+
118
+ Настройки оформлены в едином стиле OpenCode с боковым меню и поиском. Чтобы не перегружать пользователя профессиональными ручками, в разделе **«Общие»** оставлены **всего 6 простых настроек**, а все тонкие параметры вынесены в **«Дополнительно»** (там же находится очистка истории экспериментов; значение по умолчанию `0` удаляет все завершённые прогоны).
119
+
120
+ | Настройка | Смысл |
121
+ |---|---|
122
+ | Самообучение правил торговли (Авто) | Включено по умолчанию: стратегия сама подбирает порог выхода под вашу комиссию (не пересиживает угасающие сделки) и автоматически ставит на карантин убыточные «акции-убийцы» |
123
+ | Горизонт прогноза | На сколько часов вперёд стратегия предсказывает и примерно столько держит акции. Можно дробно, с точностью до 10 минут (например, 1,5) |
124
+ | Порог выгоды на вход | Покупать (или продавать), только если ожидаемое движение больше стоимости сделки × порог. Без порога комиссии съедают весь доход |
125
+ | Порог на выход (доля от входа) | До какой доли порога входа может ослабнуть прогноз, прежде чем закрыть позицию (0,5 — ниже половины порога; 0 — держать, пока прогноз в нашу сторону) |
126
+ | Минимальное удержание, часов | Не закрывать позицию раньше этого времени при обычном ослаблении прогноза. Снижает число сделок и комиссий |
127
+ | Сколько акций держать | Сколько лучших по прогнозу акций держать одновременно (при продажах — и столько же на продажу) |
128
+ | Распределение суммы между акциями | «Поровну» — одинаково; «Обратно размаху акции» — спокойным бумагам больше, волатильным — меньше (снижает просадку) |
129
+ | Направление торговли | «Только покупки», «Покупки и продажи» (продажа без покупки — заработок на падении акции относительно рынка) или «Нейтрально к рынку» (сильные покупаем, слабые продаём на равные суммы — общий рост или падение рынка почти не влияет). При продажах сумма на одну акцию вдвое меньше |
130
+ | Фильтр падающего рынка | Не открывать новые покупки, когда индекс Мосбиржи одновременно ниже уровня 2 часов назад и уровня торгового дня назад |
131
+ | Плата за заём акций, % годовых | Сколько брокер берёт за заём акций для продажи без покупки. Начисляется за всё время, пока продажа открыта (20% годовых — около 0,05% за сутки) |
132
+ | Окно обучения | На скольких последних днях стратегия учится |
133
+ | Период исследования | Сколько истории проверять |
134
+ | Размер эмбеддинга | Сколько «скрытых свойств» описывают каждую акцию на карте |
135
+ | Учитывать нефть, валюту, облигации | Стратегия дополнительно смотрит на движение нефти Brent, юаня, доллара, золота и индекса гособлигаций: чувствительные к ним акции получают поправку к прогнозу |
136
+ | Вес описаний компаний на карте | 0 — карта строится только по поведению акций, 1 — только по описаниям бизнеса, которые заранее составляет ИИ; значения между — смесь того и другого |
137
+ | Какая стратегия торгует | Обычно «Внимание через карту»; возможен и «Трансформер» — нейросеть с вниманием между акциями |
138
+ | Добавить трансформер (медленно) | Добавляет в сравнение четвёртую стратегию — трансформер. Он учится заново в каждом окне, поэтому исследование заметно дольше (месяцы обучаются одновременно на нескольких ядрах) |
139
+ | Эпох обучения трансформера | Сколько раз трансформер проходит по данным окна обучения (по умолчанию 8). Больше — дольше; обучение само останавливается, если становится хуже |
140
+ | Обучать трансформер на видеокарте | Экспериментально: через встроенный в браузер Chrome / Edge движок. Если видеокарта недоступна, обучение идёт на процессоре. Результат может чуть отличаться в последних знаках |
141
+ | Учитывать новости в торговле | В виртуальной торговле не открывать сделку против важной свежей новости (сбор новостей идёт в фоне всегда) |
142
+
143
+ **Брокерские счета** (Т-Банк, Финам, Алор, БКС): добавляются по токену API с номером счёта/портфеля, режимом работы («Только чтение» / «Подтверждение заявок» / «Автомат») и предохранителями: лимит суммы на стратегию (₽), дневной стоп по просадке (%), защитный отступ лимитной заявки (%) и пропуск первых и последних 10 минут сессии. Можно привязать счёт к номеру удачного прогона — тогда заявки считаются по его замороженным настройкам. Токены хранятся только в локальной базе.
144
+
145
+ ## Запуск
146
+
147
+ - **VS Code:** откройте папку и нажмите **F5**, браузер откроется сам.
148
+ - **Консоль:** `npm.cmd start`, затем откройте http://localhost:3000.
149
+ - **На новом компьютере:** сначала один раз `npm.cmd install` и создайте файл `.env` по образцу `.env.example`.
150
+
151
+ ## Если что-то не так
152
+
153
+ - **Красная точка** — сервер не запущен. Запустите его, страница подключится сама.
154
+ - **«Порт 3000 занят»** — программа уже запущена в другом окне.
155
+ - **Стратег долго молчит** — раскройте «Размышления»: если текст прибавляется, модель думает. Остановить — кнопка **■**.
156
+ - **Жёлтая точка** — ИИ не подключён: не выбрана модель или нет ключа (**Настройки → Модели ИИ**). Исследования и прогноз работают, Стратег нет.
package/package.json CHANGED
@@ -1,6 +1,43 @@
1
- {
2
- "name": "neuroalpha",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
1
+ {
2
+ "name": "neuroalpha",
3
+ "version": "0.2.0",
4
+ "description": "НейроАльфа — ИИ-автопилот для рынка акций Мосбиржи: эмбеддинги акций, самообучение правил, коннекторы Т-Банк / БКС / Финам / Алор и боты Telegram / MAX",
5
+ "type": "module",
6
+ "main": "server/index.js",
7
+ "bin": {
8
+ "neuroalpha": "./bin/cli.js",
9
+ "trading-consortium": "./bin/cli.js"
10
+ },
11
+ "files": [
12
+ "bin/",
13
+ "server/",
14
+ "public/",
15
+ "config/",
16
+ "docs/"
17
+ ],
18
+ "scripts": {
19
+ "start": "node --disable-warning=ExperimentalWarning server/index.js",
20
+ "dev": "node --watch --disable-warning=ExperimentalWarning server/index.js",
21
+ "cli": "node bin/cli.js"
22
+ },
23
+ "keywords": [
24
+ "moex",
25
+ "trading",
26
+ "algotrading",
27
+ "ai",
28
+ "neuroalpha",
29
+ "tbank",
30
+ "finam",
31
+ "alor",
32
+ "bcs"
33
+ ],
34
+ "engines": {
35
+ "node": ">=22.13"
36
+ },
37
+ "dependencies": {
38
+ "@tensorflow/tfjs": "^4.22.0",
39
+ "@tensorflow/tfjs-backend-wasm": "^4.22.0",
40
+ "express": "^4.21.2",
41
+ "ws": "^8.18.0"
42
+ }
43
+ }