理解動態系統穩定性:淺談李亞普諾夫指數(Lyapunov exponent)

李亞普諾夫指數是一個在數學領域中,用於量化動態系統中相鄰軌跡隨時間的分離率。

Lyapunov 指數是用來描述動態系統穩定性的一個量化方式,也可以想像一段有順序性的數值或訊號波動的狀態。

它量化了在相空間中,兩條初始相近的軌跡隨時間的分離速率。

當啟始點在區域V內,而軌跡均維持在區域U內(在X0 附近),則系統在X0 處為李雅普諾夫穩定

Lyapunov 指數公式

若兩條軌跡的初始距離為 δZ0,則在時間 t 時,它們的距離可表示為:

其中 λ 為 Lyapunov 指數。

我們預期得到 λ 的值,λ 值可解釋系統對初始條件的敏感程度,也可以預示是否為混沌的狀態。

簡單判斷 Lyapunov 指數代表的意義

  • 正 Lyapunov 指數(+):表示系統不穩定,對初始條件敏感,可能導致混沌行為。
  • 負 Lyapunov 指數(-):表示系統穩定,隨時間趨向平衡狀態。
  • 零 Lyapunov 指數(0):表示系統可能處於邊界狀態或持平。

Lyapunov 指數的應用場景

  • 控制理論:用於設計穩定控制系統。
  • 氣候模型:評估氣候變化的敏感性和穩定性。
  • 生物學:分析生態系統的穩定性。
  • 金融市場:評估市場行為的穩定性和風險。

Lyapunov 指數在金融領域的應用(美股為例)

範例code都可以在我的colab上直接進行運算,金融領域的應用將會計算股票市場(美股)當中,三家有名的公司蘋果、輝達、特斯拉,一年當中(2023/10~2024/10),每日收盤價格的股價格序列,進行Lyapunov 指數的計算。

import numpy as np
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt

# 從 Yahoo Finance 獲取股票資料,設定一年內每日的收盤價格
def get_stock_data(ticker, period="1y", interval="1d"):
    stock_data = yf.download(ticker, period=period, interval=interval)
    return stock_data['Close']  # 使用收盤價作為價格序列

# 計算 Lyapunov 指數的函數
def calculate_lyapunov_exponent(series, eps):
    N = len(series)
    lyapunovs = []
    
    for i in range(N):
        for j in range(i + 1, N):
            if np.abs(series[i] - series[j]) < eps:
                for k in range(1, min(N - i, N - j)):
                    d0 = np.abs(series[i] - series[j])
                    dn = np.abs(series[i + k] - series[j + k])
                    if d0 > 0 and dn > 0:
                        lyapunovs.append(np.log(dn / d0))
    
    return np.mean(lyapunovs) if lyapunovs else None

# 獲取三家公司的股票代碼
tickers = ['AAPL', 'NVDA', 'TSLA'] # 蘋果、輝達、特斯拉 
colors = ['blue', 'green', 'red']  # 蘋果(藍色)、輝達(綠色)、特斯拉(紅色)
price_data = {}  # 用來儲存價格數據

# 存儲計算出的 Lyapunov 指數
lyapunov_exponents = []

# 獲取每個公司的價格資料並計算 Lyapunov 指數
for ticker in tickers:
    prices = get_stock_data(ticker)
    price_data[ticker] = prices  # 儲存價格資料
    eps = 0.1 * np.std(prices)  # 設定標準差作為 eps 的基準
    exponent = calculate_lyapunov_exponent(prices, eps)
    lyapunov_exponents.append(exponent)

# 視覺化 Lyapunov 指數的比較(直條圖)
plt.figure(figsize=(8, 6))
bars = plt.bar(tickers, lyapunov_exponents, color=colors)

# 在每個條形上顯示對應的數值
for bar in bars:
    yval = bar.get_height()
    plt.text(bar.get_x() + bar.get_width()/2, yval, round(yval, 3), ha='center', va='bottom')


plt.xlabel('Company')
plt.ylabel('Lyapunov Exponent')
plt.title('Comparison of Lyapunov Exponents between AAPL, NVDA, and TSLA')
plt.show()

# 視覺化每家公司收盤價的折線圖
plt.figure(figsize=(10, 6))

# 繪製三家公司收盤價的折線圖
for idx, ticker in enumerate(tickers):
    plt.plot(price_data[ticker], label=ticker, color=colors[idx])

plt.xlabel('Date')
plt.ylabel('Close Price')
plt.title('Closing Price Trends for AAPL, NVDA, and TSLA')
plt.legend()
plt.show()

從結果的直條圖觀察發現,特斯拉(TLSA)是這三家公司當中Lyapunov 指數最高的公司特斯拉 (2.487),其次是蘋果(AAPL) (2.283),最後則是輝達(NVDA) (1.724),可以發現Lyapunov 指數其實是在說明一段時間內股價的波動混沌程度,雖然三家的Lyapunov 指數都為正,但很明顯的特斯拉的價格有急速拉昇,同時也有大幅下降的狀態,才導致它的Lyapunov 指數為最高。

Lyapunov 指數在醫學領域的應用(心電圖為例)

範例code都可以在我的colab上直接進行運算,醫學領域的應用將是使用開源資料來生成心電圖訊號,並將一筆心電圖資料加上部份的噪聲來模擬心臟病的狀態,一同使用Lyapunov 指數來評估其混沌程度。

import numpy as np
import matplotlib.pyplot as plt
from scipy.misc import electrocardiogram

# 使用 scipy 的心電圖生成器來獲取心電圖資料
signal_healthy = electrocardiogram()[:1000]  # 取前 1000 個樣本,假設這是正常的心電圖信號

# 模擬心臟疾病患者的 ECG 信號,可以添加一些噪聲來模擬異常
noise = np.random.normal(0, 0.5, len(signal_healthy))  # 生成隨機噪聲
signal_disease = signal_healthy + noise  # 疾病患者的信號

def calculate_lyapunov_exponent(series, eps):
    N = len(series)
    lyapunovs = []
    
    for i in range(N):
        for j in range(i + 1, N):
            if np.abs(series[i] - series[j]) < eps:
                for k in range(1, min(N - i, N - j)):
                    d0 = np.abs(series[i] - series[j])
                    dn = np.abs(series[i + k] - series[j + k])
                    if d0 > 0 and dn > 0:
                        lyapunovs.append(np.log(dn / d0))
    
    return np.mean(lyapunovs) if lyapunovs else None

# 計算標準差作為 eps 的基準
eps_healthy = 0.1 * np.std(signal_healthy)
eps_disease = 0.1 * np.std(signal_disease)

# 計算 Lyapunov 指數
lyapunov_exponent_healthy = calculate_lyapunov_exponent(signal_healthy, eps_healthy)
lyapunov_exponent_disease = calculate_lyapunov_exponent(signal_disease, eps_disease)

print(f'Lyapunov Exponent for Healthy ECG: {lyapunov_exponent_healthy}')
print(f'Lyapunov Exponent for Disease ECG: {lyapunov_exponent_disease}')

# 視覺化心電圖信號(健康和疾病)
t = np.linspace(0, len(signal_healthy)/1000, len(signal_healthy))

# 繪製健康人的心電圖
plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.plot(t, signal_healthy, color='green')
plt.title(f'Healthy ECG (Lyapunov: {lyapunov_exponent_healthy:.4f})')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')

# 繪製心臟疾病患者的心電圖
plt.subplot(1, 2, 2)
plt.plot(t, signal_disease, color='red')
plt.title(f'Disease ECG (Lyapunov: {lyapunov_exponent_disease:.4f})')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')

# 顯示圖片
plt.tight_layout()
plt.show()

Lyapunov Exponent for Healthy ECG: 2.239213902971258
Lyapunov Exponent for Disease ECG: 2.9562266042713516

左邊綠色折線圖是正常健康人的心電圖,右邊紅色折線圖是加入噪聲模擬心臟疾病的心電圖,可以看出紅色部分有更複雜的毛邊,有更多的噪聲影響心電圖訊號狀態,所以其Lyapunov 指數也更高(2.9562)。

結論

Lyapunov 指數是一個強大的工具,用於分析動態系統(序列)的穩定狀態。

在金融和醫學等多個領域都有廣泛的應用,我們可以建構出Lyapunov 指數特徵,有效的估計動態系統(序列)的變化程度,作為估計動態序列變化的指標。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *