Предсказания цен с использованием постоянной Фейгенбаума

Теория предсказания по Фейгенбауму

Введение

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

Постоянная Фейгенбаума

Постоянная Фейгенбаума (δ) является числом, характеризующим скорость, с которой бифуркации удваиваются в логистическом отображении, что является классическим примером возникновения хаоса. Значение δ приблизительно равно 4.669. В контексте финансовых временных рядов, эта постоянная может использоваться для выявления периодичности и цикличности в данных.

Карта Пуанкаре

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

Применение постоянной Фейгенбаума для прогнозирования BTC-USD

Сбор данных

Для анализа и прогнозирования использовались данные о закрытых ценах биткоина (BTC-USD) с финансового ресурса Yahoo Finance (yfinance). Данные включают исторические цены за период с 1 января 2021 года по 25 мая 2024 года.

Вычисление волатильности

Волатильность представляет собой показатель изменчивости цены актива и вычисляется как стандартное отклонение цен за определенный период. В данном анализе используется скользящая волатильность с окном в 20 дней.

Нормализация волатильности

Для приведения данных волатильности к диапазону, используемому в прогнозах (0.01 - 0.05), применяется мин-макс нормализация.

Прогнозирование

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

Код и его объяснение

Импорт необходимых библиотек и загрузка данных

import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from scipy.signal import find_peaks

Загрузка исторических данных BTC-USD:

btc_data = yf.download('BTC-USD', start='2021-01-01', end='2024-05-25', interval='1d')
prices = btc_data['Close'].values

Вычисление индикатора волатильности

Использование скользящего окна для вычисления волатильности:

window_size = 20
volatility = np.std([prices[i:i+window_size] for i in range(len(prices) - window_size)], axis=1)
volatility = np.concatenate((np.full(window_size, np.nan), volatility))

Нормализация волатильности

Приведение волатильности к диапазону 0.01 - 0.05:

vol_min, vol_max = 0.01, 0.05
volatility_normalized = (volatility - np.nanmin(volatility)) / (np.nanmax(volatility) - np.nanmin(volatility)) * (vol_max - vol_min) + vol_min

Построение карты Пуанкаре

Отображение зависимостей между последовательными значениями цен:

plt.figure(figsize=(10, 6))
plt.plot(prices[:-1], prices[1:], 'o', markersize=2)
plt.xlabel('$P(t)$')
plt.ylabel('$P(t+1)$')
plt.title('Карта Пуанкаре для BTC-USD')
plt.show()

Вычисление постоянной Фейгенбаума

Определение пиков и вычисление отношения интервалов между ними:

peaks, _ = find_peaks(prices, height=0)
intervals = np.diff(peaks)
ratios = intervals[:-1] / intervals[1:]
feigenbaum_constant = np.mean(ratios)
print(f"Константа Фейгенбаума: {feigenbaum_constant:.4f}")

Генерация прогнозов

Функция для создания прогнозов с разной волатильностью:

def generate_forecast(prices, steps, volatility):
    forecast = [prices[-1]]
    for _ in range(steps):
        future_value = forecast[-1] * (1 + np.random.normal(0, volatility))
        forecast.append(future_value)
    return forecast[1:]

forecast_steps = 30
volatilities = [0.01, 0.02, 0.03, 0.04, 0.05]
forecasts = [generate_forecast(prices, forecast_steps, vol) for vol in volatilities]

Построение графиков

График исторических данных и прогнозов:

fig, axs = plt.subplots(2, 1, figsize=(12, 12), sharex=True)
axs[0].plot(range(len(prices)), prices, label='Исторические данные', color='black')
colors = ['blue', 'green', 'orange', 'red', 'purple']
labels = [f'Прогноз {i+1} (волатильность {vol})' for i, vol in enumerate(volatilities)]
for forecast, color, label in zip(forecasts, colors, labels):
    axs[0].plot(range(len(prices), len(prices) + len(forecast)), forecast, label=label, color=color)
axs[0].set_ylabel('Цена BTC-USD')
axs[0].set_title('Прогнозирование котировок BTC-USD с использованием постоянной Фейгенбаума')
axs[0].legend()

График волатильности с горизонтальными метками:

axs[1].plot(range(len(volatility_normalized)), volatility_normalized, label='Нормализованная волатильность', color='blue')
for vol in volatilities:
    axs[1].axhline(y=vol, linestyle='--', color='grey', alpha=0.5)
    axs[1].text(0, vol, f'Vol {vol:.2f}', color='black', verticalalignment='bottom')
axs[1].set_xlabel('Дни')
axs[1].set_ylabel('Волатильность (STD)')
axs[1].set_title('Скользящая нормализованная волатильность BTC-USD')
axs[1].legend()
plt.show()

График только с прогнозами:

plt.figure(figsize=(12, 6))
for forecast, color, label in zip(forecasts, colors, labels):
    plt.plot(range(1, forecast_steps + 1), forecast, label=label, color=color)
plt.xlabel('Дни')
plt.ylabel('Прогнозируемая цена BTC-USD')
plt.title('Прогнозирование котировок BTC-USD (только прогнозы)')
plt.legend()
plt.show()

Создание и вывод таблицы прогнозов

Создание DataFrame для прогнозов и вывод таблицы:

forecast_days = np.arange(1, forecast_steps + 1)
forecast_data = {
    'День': np.tile(forecast_days, len(volatilities)),
    'Волатильность': np.repeat(volatilities, forecast_steps),
    'Прогноз': np.concatenate(forecasts)
}

forecast_df = pd.DataFrame(forecast_data)
forecast_df_sorted = forecast_df.sort_values(by=['День', 'Волатильность'])
print(forecast_df_sorted)

Заключение

Использование постоянной Фейгенбаума для анализа и прогнозирования временных рядов финансовых данных, таких как котировки BTC-USD, демонстрирует потенциал применения нелинейной динамики и теории хаоса в экономике. Нормализация волатильности и использование карт Пуанкаре позволяют выявить скрытые закономерности, которые могут быть использованы для создания прогностических моделей. Такой подход может быть полезен для трейдеров и аналитиков, занимающихся прогнозированием цен на финансовых рынках.

Ссылка на код статьи

Last updated