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.
- package/LICENSE +17 -0
- package/README.md +9 -3
- package/bin/cli.js +69 -69
- package/config/seed-run.json +1 -0
- package/config/strategy.json +4 -10
- package/deploy/install.sh +128 -0
- package/docs//320/224/320/225/320/237/320/233/320/236/320/231.md +103 -0
- 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
- 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
- package/package.json +15 -5
- package/public/admin.html +449 -0
- package/public/app.js +1182 -379
- package/public/index.html +87 -22
- package/public/landing.html +1217 -870
- package/public/legal.html +51 -8
- package/public/styles.css +71 -16
- package/server/api/routes.js +220 -35
- package/server/auth/index.js +633 -340
- package/server/billing/yookassa.js +1 -0
- package/server/brokers/index.js +1369 -645
- package/server/config.js +6 -4
- package/server/data/moex.js +1 -0
- package/server/db.js +69 -4
- package/server/hub.js +1 -0
- package/server/index.js +10 -2
- package/server/llm/client.js +1 -0
- package/server/llm/providers.js +50 -3
- package/server/model/dataset.js +362 -352
- package/server/model/forecast.js +202 -37
- package/server/model/linalg.js +1 -0
- package/server/model/live.js +476 -486
- package/server/model/metrics.js +1 -0
- package/server/model/models.js +31 -21
- package/server/model/profiles.js +1 -0
- package/server/model/research.js +128 -205
- package/server/model/vocab.js +1 -0
- package/server/news/index.js +1 -0
- package/server/notify/index.js +304 -168
- package/server/params-meta.js +22 -26
- package/server/settings.js +1 -0
- package/server/strategist/analytics.js +2 -1
- package/server/strategist/index.js +7 -7
- package/server/strategist/tools.js +2 -1
- package/server/util.js +1 -0
- package/server/model/gpu-worker.html +0 -11
- package/server/model/gpu-worker.js +0 -60
- package/server/model/tf-node.js +0 -26
- package/server/model/transformer-core.js +0 -330
- package/server/model/transformer-gpu.js +0 -221
- package/server/model/transformer-pool.js +0 -200
- package/server/model/transformer-worker.js +0 -28
- package/server/model/transformer.js +0 -57
package/public/index.html
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
<!-- Copyright (c) 2026 Roman A. Perepelkin. All rights reserved. Proprietary software. -->
|
|
1
2
|
<!doctype html>
|
|
2
3
|
<html lang="ru">
|
|
3
4
|
<head>
|
|
@@ -10,7 +11,10 @@
|
|
|
10
11
|
</head>
|
|
11
12
|
<body>
|
|
12
13
|
<header>
|
|
13
|
-
<div class="brand"
|
|
14
|
+
<div class="brand">
|
|
15
|
+
<button id="btn-chat-toggle" type="button" class="icon small" style="padding:3px 9px;border:1px solid var(--line);border-radius:6px;margin-right:4px" title="Показать или скрыть панель чата с ИИ-Стратегом">💬 Стратег</button>
|
|
16
|
+
<span class="logo">◈</span><b>НейроАльфа</b><span class="muted">· Рынок как язык · Мосбиржа</span>
|
|
17
|
+
</div>
|
|
14
18
|
<div class="hright">
|
|
15
19
|
<a href="/landing" class="icon small" style="text-decoration:none;padding:3px 9px;border:1px solid var(--line);border-radius:6px" title="Публичная витрина и тарифы">Витрина</a>
|
|
16
20
|
<button id="btn-user" type="button" class="icon small" style="padding:3px 9px" title="Профиль, подписка и боты Telegram / MAX">Профиль</button>
|
|
@@ -27,6 +31,7 @@
|
|
|
27
31
|
<span id="chat-status" class="muted small"></span>
|
|
28
32
|
<span class="grow"></span>
|
|
29
33
|
<button id="chat-new" class="icon small" title="Начать новый разговор (журнал гипотез сохранится)">+ Новый диалог</button>
|
|
34
|
+
<button id="chat-hide" class="icon small" title="Свернуть панель чата со Стратегом">◀</button>
|
|
30
35
|
</div>
|
|
31
36
|
<div class="feed-wrap">
|
|
32
37
|
<div id="feed" class="feed"></div>
|
|
@@ -79,10 +84,10 @@
|
|
|
79
84
|
</button>
|
|
80
85
|
</div>
|
|
81
86
|
</div>
|
|
82
|
-
<button id="chat-action" type="button" class="pbtn action-btn" title="Голосовой ввод (русский язык)">
|
|
87
|
+
<button id="chat-action" type="button" class="pbtn action-btn" data-icon="mic" title="Голосовой ввод (русский язык)">
|
|
83
88
|
<svg id="ico-mic" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="2" width="6" height="11" rx="3"/><path d="M5 10a7 7 0 0 0 14 0"/><line x1="12" y1="17" x2="12" y2="21"/><line x1="8" y1="21" x2="16" y2="21"/></svg>
|
|
84
|
-
<svg id="ico-send"
|
|
85
|
-
<svg id="ico-stop"
|
|
89
|
+
<svg id="ico-send" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><line x1="12" y1="19" x2="12" y2="5"/><polyline points="5 12 12 5 19 12"/></svg>
|
|
90
|
+
<svg id="ico-stop" width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><rect x="5" y="5" width="14" height="14" rx="2.5"/></svg>
|
|
86
91
|
</button>
|
|
87
92
|
<button id="chat-stop" type="button" class="pbtn stop" hidden title="Остановить ответ">■</button>
|
|
88
93
|
</div>
|
|
@@ -110,15 +115,13 @@
|
|
|
110
115
|
</div>
|
|
111
116
|
<div id="run-bar" class="run-bar" hidden>
|
|
112
117
|
<div class="run-bar-left">
|
|
118
|
+
<button id="btn-to-live" type="button" class="primary" title="Запустить виртуальный счёт с замороженными настройками этого эксперимента">▶ В торговлю</button>
|
|
119
|
+
<button id="btn-apply" type="button" hidden title="Скопировать настройки этого эксперимента в текущие настройки">✓ Применить настройки</button>
|
|
113
120
|
<button id="btn-rename-run" type="button" title="Дать эксперименту понятное имя">✎ Назвать</button>
|
|
114
|
-
<button id="btn-apply" type="button" hidden title="Скопировать настройки этого эксперимента в текущие настройки">✓ Применить эти настройки</button>
|
|
115
|
-
<button id="btn-stability" type="button" title="Проверить стратегию на 5 сдвигах периода (−8…+8 дней)">Проверить устойчивость</button>
|
|
116
|
-
<button id="btn-to-live" type="button" title="Запустить виртуальный счёт с замороженными настройками этого эксперимента">▶ В торговлю</button>
|
|
117
121
|
<button id="btn-showcase" type="button" hidden title="Показывать этот эксперимент на публичной витрине лендинга">☆ На витрину</button>
|
|
118
122
|
</div>
|
|
119
123
|
<div class="row-gap">
|
|
120
124
|
<button id="btn-ask-run" type="button" title="Попросить Стратега разобрать этот эксперимент">💬 Разобрать</button>
|
|
121
|
-
<button id="btn-cmp-run" type="button" title="Попросить Стратега сравнить этот эксперимент с другим">⇄ Сравнить</button>
|
|
122
125
|
<button id="btn-del" type="button" title="Удалить этот эксперимент из истории">Удалить</button>
|
|
123
126
|
</div>
|
|
124
127
|
</div>
|
|
@@ -131,7 +134,7 @@
|
|
|
131
134
|
<div id="stability" class="stab-box" hidden></div>
|
|
132
135
|
<div id="eq-chart" class="chart"></div>
|
|
133
136
|
<div class="legend" id="legend"></div>
|
|
134
|
-
<details id="periods-box" hidden>
|
|
137
|
+
<details id="periods-box" open hidden>
|
|
135
138
|
<summary>Доходность по месяцам и годам</summary>
|
|
136
139
|
<div class="seg" id="pmode" title="Что показывать в ячейках">
|
|
137
140
|
<button data-k="model" class="active">Стратегия</button><button data-k="market">Рынок</button><button data-k="diff">Разница</button>
|
|
@@ -164,7 +167,7 @@
|
|
|
164
167
|
</aside>
|
|
165
168
|
<div class="spane">
|
|
166
169
|
<section class="ssec" data-nsec="forecast">
|
|
167
|
-
<div class="stitle bar"><span id="fc-title">Прогноз на ближайшие часы</span><div class="row-gap"><button id="btn-ask-forecast" type="button" title="Попросить Стратега разобрать текущий прогноз">💬 Спросить Стратега</button
|
|
170
|
+
<div class="stitle bar"><span id="fc-title">Прогноз на ближайшие часы</span><div class="row-gap" style="align-items:center"><span id="fc-live-badge" class="tag ok" title="Прогноз автоматически пересчитывается каждые 45 секунд по живым котировкам Мосбиржи">● авто-радар</span><button id="btn-ask-forecast" type="button" title="Попросить Стратега разобрать текущий прогноз">💬 Спросить Стратега</button></div></div>
|
|
168
171
|
<div class="scard spadded">
|
|
169
172
|
<div id="forecast" class="muted">Стратегия обучится на последних месяцах и скажет, какие акции, по её мнению, будут сильнее или слабее рынка в ближайшие часы и под чьим влиянием.</div>
|
|
170
173
|
</div>
|
|
@@ -221,13 +224,12 @@
|
|
|
221
224
|
<div class="tab" id="tab-settings" hidden>
|
|
222
225
|
<div class="settings-wrap">
|
|
223
226
|
<aside class="snav">
|
|
224
|
-
<input id="s-search" type="search" placeholder="Поиск">
|
|
225
|
-
<button type="button" data-sec="g0" class="active"
|
|
226
|
-
<button type="button" data-sec="g1"
|
|
227
|
-
<button type="button" data-sec="g2"
|
|
228
|
-
<button type="button" data-sec="g3">Дополнительно</button>
|
|
227
|
+
<input id="s-search" type="search" placeholder="Поиск настроек…">
|
|
228
|
+
<button type="button" data-sec="g0" class="active">Стратегия и сигналы</button>
|
|
229
|
+
<button type="button" data-sec="g1">Издержки и риск</button>
|
|
230
|
+
<button type="button" data-sec="g2">Автопилот и система</button>
|
|
229
231
|
<div class="ssep"></div>
|
|
230
|
-
<button type="button" data-sec="cloud" id="snav-cloud"
|
|
232
|
+
<button type="button" data-sec="cloud" id="snav-cloud">Подписка и уведомления</button>
|
|
231
233
|
<button type="button" data-sec="brokers" id="snav-brokers">Брокерские счета</button>
|
|
232
234
|
<button type="button" data-sec="llm">Модели ИИ</button>
|
|
233
235
|
<button type="button" data-sec="hist" id="snav-hist">История изменений</button>
|
|
@@ -237,7 +239,7 @@
|
|
|
237
239
|
<div class="spane">
|
|
238
240
|
<form id="params"></form>
|
|
239
241
|
<section class="ssec" data-sec="cloud" id="cloud-box" hidden>
|
|
240
|
-
<div class="stitle"
|
|
242
|
+
<div class="stitle">Подписка, лицензия и уведомления (Telegram / MAX)</div>
|
|
241
243
|
<div class="scard spadded" id="cloud-pane"></div>
|
|
242
244
|
</section>
|
|
243
245
|
<section class="ssec" data-sec="brokers" id="brokers-box" hidden>
|
|
@@ -258,8 +260,15 @@
|
|
|
258
260
|
<option value="bcs">БКС Мир инвестиций</option>
|
|
259
261
|
</select>
|
|
260
262
|
</label>
|
|
261
|
-
<label><span
|
|
262
|
-
<label
|
|
263
|
+
<label><span id="broker-token-lbl">Токен API</span><input name="token" type="text" class="secret-input" autocomplete="off" spellcheck="false" data-lpignore="true" data-1p-ignore="true" placeholder="Токен доступа к API брокера (t.…)"></label>
|
|
264
|
+
<label>
|
|
265
|
+
<span>Номер субсчёта / портфеля</span>
|
|
266
|
+
<div class="row-gap" style="width:100%">
|
|
267
|
+
<input name="accountId" autocomplete="off" placeholder="ID счёта (или нажмите кнопку справа →)" style="flex:1">
|
|
268
|
+
<button type="button" id="btn-broker-discover" style="white-space:nowrap">🔍 Найти мои счета по токену</button>
|
|
269
|
+
</div>
|
|
270
|
+
</label>
|
|
271
|
+
<div id="broker-discovered" hidden style="display:grid;gap:6px;padding:8px 10px;border:1px solid var(--border);border-radius:8px;background:var(--bg2)"></div>
|
|
263
272
|
<label><span>Режим работы счёта</span>
|
|
264
273
|
<select name="mode">
|
|
265
274
|
<option value="readonly">Только чтение (портфель и сверка)</option>
|
|
@@ -267,7 +276,18 @@
|
|
|
267
276
|
<option value="auto">Автомат (лимитные заявки)</option>
|
|
268
277
|
</select>
|
|
269
278
|
</label>
|
|
270
|
-
<label><span
|
|
279
|
+
<label><span>Начальный портфель на счёте (переходный период)</span>
|
|
280
|
+
<select name="legacyMode">
|
|
281
|
+
<option value="isolate" selected>Изолированный карман — не трогать старые бумаги (рекомендуется)</option>
|
|
282
|
+
<option value="smooth">Плавный переход — продавать старые акции только под новые покупки или при угрозе обвала</option>
|
|
283
|
+
<option value="takeover">Полное управление — сразу продать нецелевые акции под стратегию</option>
|
|
284
|
+
</select>
|
|
285
|
+
</label>
|
|
286
|
+
<label><span>Эксперимент для настроек</span>
|
|
287
|
+
<select name="baseRunId" id="broker-run-select">
|
|
288
|
+
<option value="">Текущие настройки</option>
|
|
289
|
+
</select>
|
|
290
|
+
</label>
|
|
271
291
|
<label><span>Лимит суммы на стратегию, ₽ (предохранитель)</span><input name="maxCapitalRub" type="number" min="10000" step="10000" value="100000"></label>
|
|
272
292
|
<label><span>Дневной стоп по просадке, % (предохранитель)</span><input name="maxDailyDrawdownPct" type="number" min="0.5" max="50" step="0.5" value="3"></label>
|
|
273
293
|
<label><span>Защитный отступ лимитной заявки, %</span><input name="limitOffsetPct" type="number" min="0" max="2" step="0.05" value="0.1"></label>
|
|
@@ -301,7 +321,7 @@
|
|
|
301
321
|
</select>
|
|
302
322
|
</label>
|
|
303
323
|
<label><span>Адрес</span><input name="baseUrl" placeholder="https://…/v1/chat/completions"></label>
|
|
304
|
-
<label data-for="key"><span id="llm-key-label">Ключ</span><input name="apiKey" type="
|
|
324
|
+
<label data-for="key"><span id="llm-key-label">Ключ</span><input name="apiKey" type="text" class="secret-input" autocomplete="off" spellcheck="false" data-lpignore="true" data-1p-ignore="true"></label>
|
|
305
325
|
<label data-for="scope" hidden><span>Область доступа (scope)</span><input name="scope" placeholder="GIGACHAT_API_PERS"></label>
|
|
306
326
|
<label data-for="cert" hidden><span>Сертификат НУЦ Минцифры (путь к .pem, для GigaChat)</span><input name="caFile" placeholder="путь к russian_trusted_root_ca.pem"></label>
|
|
307
327
|
<label data-for="model"><span>Модель (идентификатор на сервере)</span><input name="model" placeholder="например, qwen/Qwen3-8B"></label>
|
|
@@ -327,10 +347,55 @@
|
|
|
327
347
|
|
|
328
348
|
<div id="help" class="modal" hidden>
|
|
329
349
|
<div class="modal-box">
|
|
330
|
-
<div class="modal-head"
|
|
350
|
+
<div class="modal-head">
|
|
351
|
+
<div class="row-gap" style="align-items:center">
|
|
352
|
+
<b>Справка и документация</b>
|
|
353
|
+
<div class="seg" id="help-tabs" style="margin:0">
|
|
354
|
+
<button type="button" data-hdoc="ИНСТРУКЦИЯ.md" class="active">Как пользоваться</button>
|
|
355
|
+
<button type="button" data-hdoc="МЕХАНИКА_И_ПАРАМЕТРЫ.md">Механика и параметры</button>
|
|
356
|
+
</div>
|
|
357
|
+
</div>
|
|
358
|
+
<button id="help-close" class="icon">✕</button>
|
|
359
|
+
</div>
|
|
331
360
|
<div id="help-body" class="md">Загрузка…</div>
|
|
332
361
|
</div>
|
|
333
362
|
</div>
|
|
363
|
+
|
|
364
|
+
<!-- Модальное окно подписания Договора-оферты и Декларации о рисках -->
|
|
365
|
+
<div id="offer-modal" class="modal" hidden>
|
|
366
|
+
<div class="modal-box" style="max-width:680px">
|
|
367
|
+
<div class="modal-head">
|
|
368
|
+
<b>Договор публичной оферты и Декларация о рисках</b>
|
|
369
|
+
<button id="offer-close" class="icon">✕</button>
|
|
370
|
+
</div>
|
|
371
|
+
<div class="md" style="max-height:300px;overflow-y:auto;padding:12px 16px;border-bottom:1px solid var(--line);font-size:13px;line-height:1.55">
|
|
372
|
+
<p style="margin-top:0"><b>1. Предмет договора:</b> Настоящая Публичная оферта регулирует предоставление доступа к облачной аналитической платформе «НейроАльфа» (PaaS/SaaS) согласно выбранному тарифному плану («Старт», «Инвестор», «Профи», «VIP»).</p>
|
|
373
|
+
<p><b>2. Правовой статус (отсутствие ИИР и ДУ):</b> Сервис является исключительно программно-техническим средством (калькулятором статистических закономерностей). Исполнитель <b>не осуществляет инвестиционное консультирование</b>, не даёт индивидуальных инвестиционных рекомендаций (ФЗ № 39-ФЗ) и не осуществляет доверительное управление. Все сделки совершаются Пользователем самостоятельно на его личном брокерском счёте.</p>
|
|
374
|
+
<p><b>3. Параметры тарифов и предельные уровни доходности:</b>
|
|
375
|
+
<br>• <b>«Старт» (0 ₽)</b> — тестирование стратегий в Экспериментах и 1 виртуальный счёт без реальной торговли;
|
|
376
|
+
<br>• <b>«Инвестор» (3 900 ₽/мес)</b> — до 2 брокерских счетов, лимит до 1 000 000 ₽ на каждом счёте, торговля только от покупки («Только в рост (без шорта)»), предельный целевой темп доходности стратегии до 50% годовых;
|
|
377
|
+
<br>• <b>«Профи» (9 900 ₽/мес)</b> — до 5 брокерских счетов, лимит до 10 000 000 ₽ на каждом счёте, торговля в рост и в падение (с шортами), предельный целевой темп доходности стратегии до 100% годовых;
|
|
378
|
+
<br>• <b>«VIP» (по согласованию)</b> — без ограничений по числу счетов, сумме капитала и потолку годовой доходности (включая полушаговое сопровождение <code>H/2</code> и динамическую концентрацию слота <code>Conviction Sizing</code>).
|
|
379
|
+
</p>
|
|
380
|
+
<p><b>4. Запрет автоследования и ретрансляции сигналов:</b> Пользователю строго запрещается подключать к платформе счета, участвующие в сервисах автоследования или копирования сделок (как в роли ведущего/автора стратегии, так и в роли подписчика), а также передавать или перепродавать сигналы третьим лицам. При обнаружении признаков автоследования счёт автоматически блокируется.</p>
|
|
381
|
+
<p style="margin-bottom:0"><b>5. Декларация о рисках:</b> Торговля ценными бумагами сопряжена с риском потери части или всего инвестированного капитала. Результаты на исторических данных не гарантируют доходности в будущем. Полный текст документа: <a href="/legal" target="_blank" style="color:var(--accent)">открыть /legal →</a></p>
|
|
382
|
+
</div>
|
|
383
|
+
<div style="padding:14px 18px;display:grid;gap:10px;font-size:13px">
|
|
384
|
+
<label style="display:flex;gap:10px;align-items:flex-start;cursor:pointer">
|
|
385
|
+
<input type="checkbox" id="term-offer-chk1" style="width:16px;height:16px;margin-top:2px;flex:none">
|
|
386
|
+
<span>Я прочитал(а) и безоговорочно принимаю условия <a href="/legal#offer" target="_blank" style="color:var(--accent)">Договора публичной оферты</a> и <a href="/legal#privacy" target="_blank" style="color:var(--accent)">Политики обработки персональных данных</a>.</span>
|
|
387
|
+
</label>
|
|
388
|
+
<label style="display:flex;gap:10px;align-items:flex-start;cursor:pointer">
|
|
389
|
+
<input type="checkbox" id="term-offer-chk2" style="width:16px;height:16px;margin-top:2px;flex:none">
|
|
390
|
+
<span>Я ознакомлен(а) с <a href="/legal#risks" target="_blank" style="color:var(--accent)">Декларацией о рисках</a>, понимаю, что сервис не является индивидуальной инвестиционной рекомендацией, и обязуюсь <b>не использовать автоследование</b> на подключаемых счетах.</span>
|
|
391
|
+
</label>
|
|
392
|
+
<div class="row-gap" style="justify-content:flex-end;margin-top:4px">
|
|
393
|
+
<button type="button" id="term-offer-decline">Отказ (Отмена)</button>
|
|
394
|
+
<button type="button" class="primary" id="term-offer-accept" disabled>Подписать оферту и продолжить →</button>
|
|
395
|
+
</div>
|
|
396
|
+
</div>
|
|
397
|
+
</div>
|
|
398
|
+
</div>
|
|
334
399
|
<div id="toast"></div>
|
|
335
400
|
<script src="app.js" type="module"></script>
|
|
336
401
|
</body>
|