Прогноз сентимента

GET /forecasts/sentiment
GetSentimentForecast

Куда, вероятно, двинется сентимент актива в следующие 72 часа — диапазон исходов с их вероятностями. series даёт каждые 4 часа ожидаемое число бычьих, медвежьих и нейтральных постов и общее число постов на этом шаге, а также sentiment_signal в его конце, по шкале /sentiment. chance_higher_24h и chance_higher_72h дают вероятность того, что сигнал завершится выше current_sentiment_signal; их флаги _confident отмечают, когда эта вероятность явно склоняется в одну сторону.

Прогнозы обновляются в течение минуты после новых постов об активе и не реже, чем каждые 15 минут. refresh=true пересчитывает по последним данным примерно за 5 секунд; если это занимает больше 20, вы получаете последний прогноз с refreshed: false, за 5 кредитов. Активы без прогноза возвращают status: not_forecastable с reason; /forecasts/assets перечисляет активы, для которых прогноз есть.

Стоит 5 кредитов или 10 с refresh=true. Ответы not_forecastable бесплатны, до 30 в час на аккаунт; сверх этого эндпоинт возвращает 429, пока час не обнулится.

Оплата кошельком недоступна для этой операции; используйте аутентификацию аккаунта. Руководство по оплате x402.

Параметры

asset_id string QUERY обязательный

Asset ID из /assets или /search, например NVDA, GLD, SPX или bitcoin. Передавайте его вместе с возвращённым рядом с ним asset_class.

Example:NVDA

asset_class string QUERY обязательный

Класс актива, указанного в asset_id: equity (акции и ETF), commodity, index или crypto. Передавайте asset_class, который /assets или /search вернули вместе с asset_id.

Допустимые значения
equitycommodityindexcrypto

Example:equity

refresh boolean QUERY

true пересчитывает прогноз по последним данным: 10 кредитов, около 5 секунд. По умолчанию false.

Example:false

Пример cURL

curl --get \
  --url 'https://nebula-api.hiddensystems.ai/api/v1/public/forecasts/sentiment' \
  --data-urlencode 'asset_id=NVDA' \
  --data-urlencode 'asset_class=equity' \
  --header 'X-API-Key: YOUR_API_KEY'

Ответы

200 OK
400 Некорректный запрос
401 Не авторизован
402 Кредиты израсходованы; ответ содержит срок продления и баланс купленных кредитов
403 Доступ запрещён
404 Не найдено
405 Метод не поддерживается; поддерживаемые методы перечислены в заголовке Allow
429 Слишком много запросов
500 Внутренняя ошибка сервера
503 Сервис недоступен

Тип медиа application/json

as_of
string (date-time) обязательный

Начало прогноза в UTC: конец последних полных 15 минут, по которым он был рассчитан. Null, если актив никогда не оценивался.

chance_higher_24h
number (double) обязательный

Вероятность того, что сигнал сентимента будет выше current_sentiment_signal через 24 часа, от 0 до 1.

chance_higher_24h_confident
boolean обязательный

True, когда chance_higher_24h меньше 0.3 или больше 0.7: прогноз явно склоняется в одну сторону. Ближе к 0.5 трактуйте его как отсутствие чёткого направления.

chance_higher_72h
number (double) обязательный

Вероятность того, что сигнал сентимента будет выше current_sentiment_signal через 72 часа, от 0 до 1.

chance_higher_72h_confident
boolean обязательный

True, когда chance_higher_72h меньше 0.3 или больше 0.7: прогноз явно склоняется в одну сторону. Ближе к 0.5 трактуйте его как отсутствие чёткого направления.

current_sentiment_signal
number (double) обязательный

Сигнал сентимента на момент as_of по шкале /sentiment: бычьи посты минус медвежьи за последние 24 часа, причём недавние посты имеют больший вес. Здесь начинается каждая траектория, и относительно него измеряются вероятности. Он может немного отличаться от последней точки /sentiment, которая обновляется ежечасно.

horizon_hours
integer обязательный

На сколько часов вперёд строится прогноз: всегда 72.

reason
string обязательный

Почему актив нельзя спрогнозировать: too_little_history, stale_data или missing_price. Null, когда status равен ok.

Допустимые значения
too_little_historystale_datamissing_pricenull
refreshed
boolean обязательный

True, когда этот запрос перезапустил прогноз (refresh=true и повторный расчёт успел завершиться); false, когда это последний прогноз по расписанию.

sample_paths
array<array<number (double)>> обязательный

24 возможные траектории сигнала сентимента, каждая выровнена с series. Постройте их, чтобы показать разброс исходов.

series
array<object> обязательный

Прогноз каждые 4 часа от as_of: 18 шагов, от самого раннего к самому позднему.

series[].bearish_posts
object обязательный

Ожидаемое число медвежьих постов только за этот 4-часовой шаг, без ботов: как interval posts в /sentiment, а не его счётчики за последние 24 часа.

series[].bearish_posts.mean
number (double) обязательный

Ожидаемое число медвежьих постов на этом шаге.

series[].bearish_posts.p10
number (double) обязательный

10-й процентиль числа медвежьих постов на этом шаге.

series[].bearish_posts.p25
number (double) обязательный

25-й процентиль числа медвежьих постов на этом шаге.

series[].bearish_posts.p50
number (double) обязательный

50-й процентиль числа медвежьих постов на этом шаге.

series[].bearish_posts.p75
number (double) обязательный

75-й процентиль числа медвежьих постов на этом шаге.

series[].bearish_posts.p90
number (double) обязательный

90-й процентиль медвежьих постов на шаге.

series[].bullish_posts
object обязательный

Ожидаемое число бычьих постов именно на этом 4-часовом шаге, без ботов: как интервальные посты /sentiment, а не его скользящие 24-часовые счётчики.

series[].bullish_posts.mean
number (double) обязательный

Ожидаемое число бычьих постов на шаге.

series[].bullish_posts.p10
number (double) обязательный

10-й процентиль бычьих постов на шаге.

series[].bullish_posts.p25
number (double) обязательный

25-й процентиль бычьих постов на шаге.

series[].bullish_posts.p50
number (double) обязательный

50-й процентиль бычьих постов на шаге.

series[].bullish_posts.p75
number (double) обязательный

75-й процентиль бычьих постов на шаге.

series[].bullish_posts.p90
number (double) обязательный

90-й процентиль бычьих постов на шаге.

series[].neutral_posts
object обязательный

Ожидаемое число нейтральных постов именно на этом 4-часовом шаге, без ботов: как интервальные посты /sentiment, а не его скользящие 24-часовые счётчики.

series[].neutral_posts.mean
number (double) обязательный

Ожидаемое число нейтральных постов на шаге.

series[].neutral_posts.p10
number (double) обязательный

10-й процентиль нейтральных постов на шаге.

series[].neutral_posts.p25
number (double) обязательный

25-й процентиль нейтральных постов на шаге.

series[].neutral_posts.p50
number (double) обязательный

50-й процентиль нейтральных постов на шаге.

series[].neutral_posts.p75
number (double) обязательный

75-й процентиль нейтральных постов на шаге.

series[].neutral_posts.p90
number (double) обязательный

90-й процентиль нейтральных постов на шаге.

series[].sentiment_signal
object обязательный

Сигнал настроения на конец шага по шкале /sentiment: где, вероятно, окажется линия.

series[].sentiment_signal.mean
number (double) обязательный

Ожидаемый сигнал настроения на конец шага.

series[].sentiment_signal.p10
number (double) обязательный

10-й процентиль сигнала настроения на конец шага.

series[].sentiment_signal.p50
number (double) обязательный

50-й процентиль сигнала настроения на конец шага.

series[].sentiment_signal.p90
number (double) обязательный

90-й процентиль сигнала настроения на конец шага.

series[].sentiment_signal.quantiles
array<number (double)> обязательный

21 квантиль сигнала настроения на конец шага: 0-й, 5-й, 10-й, ... 100-й процентили, от наименьшего. Интерполируйте между ними, чтобы получить вероятность попадания в любой диапазон.

series[].timestamp
string (date-time) обязательный

Время UTC окончания шага: as_of плюс 4, 8, ... 72 часа.

series[].total_posts
object обязательный

Посты (бычьи, медвежьи и нейтральные вместе), ожидаемые именно на этом 4-часовом шаге, без ботов: как интервальные посты /sentiment, а не его скользящие 24-часовые счётчики. Их процентили относятся к самому итогу, поэтому они не являются суммой процентилей трёх видов.

series[].total_posts.mean
number (double) обязательный

Ожидаемое число постов (бычьих, медвежьих и нейтральных вместе) на шаге.

series[].total_posts.p10
number (double) обязательный

10-й процентиль постов (бычьих, медвежьих и нейтральных вместе) на шаге.

series[].total_posts.p25
number (double) обязательный

25-й процентиль постов (бычьих, медвежьих и нейтральных вместе) на шаге.

series[].total_posts.p50
number (double) обязательный

50-й процентиль постов (бычьих, медвежьих и нейтральных вместе) на шаге.

series[].total_posts.p75
number (double) обязательный

75-й процентиль постов (бычьих, медвежьих и нейтральных вместе) на шаге.

series[].total_posts.p90
number (double) обязательный

90-й процентиль постов (бычьих, медвежьих и нейтральных вместе) на шаге.

status
string обязательный

ok или not_forecastable, когда актив нельзя спрогнозировать (тогда поля сводки равны null, а series пуст; reason объясняет причину).

Допустимые значения
oknot_forecastable
turning
integer обязательный

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

Допустимые значения
-101null
{
  "as_of": "2026-09-14T09:15:00Z",
  "chance_higher_24h": 0.74,
  "chance_higher_24h_confident": true,
  "chance_higher_72h": 0.61,
  "chance_higher_72h_confident": false,
  "current_sentiment_signal": 128.6,
  "horizon_hours": 72,
  "reason": null,
  "refreshed": false,
  "sample_paths": [
    [
      133.2,
      141.7
    ],
    [
      126.4,
      118.9
    ]
  ],
  "series": [
    {
      "bearish_posts": {
        "mean": 18,
        "p10": 9.9,
        "p25": 13.5,
        "p50": 17.1,
        "p75": 21.6,
        "p90": 27.9
      },
      "bullish_posts": {
        "mean": 46,
        "p10": 25.3,
        "p25": 34.5,
        "p50": 43.7,
        "p75": 55.2,
        "p90": 71.3
      },
      "neutral_posts": {
        "mean": 29,
        "p10": 16,
        "p25": 21.8,
        "p50": 27.6,
        "p75": 34.8,
        "p90": 45
      },
      "sentiment_signal": {
        "mean": 131.4,
        "p10": 92.9,
        "p50": 129.6,
        "p90": 175.5,
        "quantiles": [
          21.6,
          70.2,
          92.9,
          104.8,
          113.1,
          119.4,
          124.2,
          127.6,
          130.5,
          132.7,
          134.5,
          136.4,
          138.7,
          141.3,
          144.9,
          149.2,
          155.1,
          163.8,
          179.4,
          202.6,
          287.3
        ]
      },
      "timestamp": "2026-09-14T13:15:00Z",
      "total_posts": {
        "mean": 93,
        "p10": 51.2,
        "p25": 69.8,
        "p50": 88.4,
        "p75": 111.6,
        "p90": 144.2
      }
    },
    {
      "bearish_posts": {
        "mean": 19,
        "p10": 10.5,
        "p25": 14.3,
        "p50": 18.1,
        "p75": 22.8,
        "p90": 29.5
      },
      "bullish_posts": {
        "mean": 50,
        "p10": 27.5,
        "p25": 37.5,
        "p50": 47.5,
        "p75": 60,
        "p90": 77.5
      },
      "neutral_posts": {
        "mean": 31,
        "p10": 17.1,
        "p25": 23.3,
        "p50": 29.5,
        "p75": 37.2,
        "p90": 48.1
      },
      "sentiment_signal": {
        "mean": 137.6,
        "p10": 99.1,
        "p50": 135.79999999999998,
        "p90": 181.7,
        "quantiles": [
          21.6,
          70.2,
          92.9,
          104.8,
          113.1,
          119.4,
          124.2,
          127.6,
          130.5,
          132.7,
          134.5,
          136.4,
          138.7,
          141.3,
          144.9,
          149.2,
          155.1,
          163.8,
          179.4,
          202.6,
          287.3
        ]
      },
      "timestamp": "2026-09-14T17:15:00Z",
      "total_posts": {
        "mean": 100,
        "p10": 55,
        "p25": 75,
        "p50": 95,
        "p75": 120,
        "p90": 155
      }
    }
  ],
  "status": "ok",
  "turning": 0
}