
Lyapunov 指數是用來描述動態系統穩定性的一個量化方式,也可以想像一段有順序性的數值或訊號波動的狀態。
它量化了在相空間中,兩條初始相近的軌跡隨時間的分離速率。

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 指數特徵,有效的估計動態系統(序列)的變化程度,作為估計動態序列變化的指標。
