信號處理
scipy.signal模塊中包含濾波函數和B樣條插值(B-spline interpolation)函數。
樣條插值使用稱為樣條的多項式進行插值。插值過程將分段多項式連接起來
擬合數據。B樣條是樣條的一種類型。
SciPy中以一組數值來定義信號。我們以detrend函數作為濾波器的一個例子。該函數可以
對信號進行線性擬合,然後從原始輸入數據中去除這個線性趨勢。
檢測 QQQ 股價的線性趨勢
相比於去除數據樣本的趨勢,我們通常更關心的是趨勢本身。在去除趨勢的操作之後,我們
仍然很容易獲取該趨勢。我們將對QQQ一年以來的股價數據進行這些處理分析。
(1) 編寫代碼獲取QQQ的收盤價和對應的日期數據。
today = date.today()
start = (today.year - 1, today.month, today.day)
quotes = quotes_historical_yahoo("QQQ", start, today)
quotes = np.array(quotes)
dates = quotes.T[0]
qqq = quotes.T[4]
(2) 去除信號中的線性趨勢。
y = signal.detrend(qqq)
(3) 創建月定位器和日定位器。
alldays = DayLocator()
months = MonthLocator ()
(4) 創建一個日期格式化器以格式化x軸上的日期。該格式化器將創建一個字符串,包含簡寫
的月份和年份。
month_formatter = DateFormatter("%b %Y")
(5) 創建圖像和子圖。
fig = plt.figure()
ax = fig.add_subplot(111)
(6) 繪製股價數據以及將去除趨勢後的信號從原始數據中減去所得到的潛在趨勢。
plt.plot(dates, qqq, 'o', dates, qqq - y, '-')
(7) 設置定位器和格式化器。
ax.xaxis.set_minor_locator(alldays)
ax.xaxis.set_major_locator(months)
ax.xaxis.set_major_formatter(month_formatter)
(8) 將x軸上的標籤格式化為日期。
fig.autofmt_xdate()
plt.show()
我們繪製了QQQ的收盤價數據以及對應的趨勢線。示例代碼見trend.py文件。
from matplotlib.finance import quotes_historical_yahoo
from datetime import date
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
from matplotlib.dates import DateFormatter
from matplotlib.dates import DayLocator
from matplotlib.dates import MonthLocator
today = date.today()
start = (today.year - 1, today.month, today.day)
quotes = quotes_historical_yahoo("QQQ", start, today)
quotes = np.array(quotes)
dates = quotes.T[0]
qqq = quotes.T[4]
y = signal.detrend(qqq)
alldays = DayLocator()
months = MonthLocator()
month_formatter = DateFormatter("%b %Y")
fig = plt.figure()
ax = fig.add_subplot(111)
plt.plot(dates, qqq, 'o', dates, qqq - y, '-')
ax.xaxis.set_minor_locator(alldays)
ax.xaxis.set_major_locator(months)
ax.xaxis.set_major_formatter(month_formatter)
fig.autofmt_xdate()
plt.show()
傅里葉分析
現實世界中的信號往往具有周期性。傅里葉變換(Fourier transform)是處理這些信號的常
用工具。傅里葉變換是一種從時域到頻域的變換,也就是將週期信號線性分解為不同頻率的正弦
和餘弦函數。
傅里葉變換的函數可以在scipy.fftpack模塊中找到(NumPy也有自己的傅里葉工具包,
即numpy.fft)。這個模塊包含快速傅里葉變換、微分算子和擬微分算子以及一些輔助函數。
MATLAB用戶會很高興,因為scipy.fftpack模塊中的很多函數與MATLAB對應的函數同名,
且功能也很相近。
對去除趨勢後的信號進行濾波處理
在10.8節我們學習瞭如何去除信號中的趨勢。去除趨勢後的信號可能有周期性的分量,我們
將其顯現出來。一些步驟已在前面的“動手實踐”教程中出現過,如下載數據和設置Matplotlib
對象。這些步驟將被略去。
(1) 應用傅里葉變換,得到信號的頻譜。
amps = np.abs(fftpack.fftshift(fftpack.rfft(y)))
(2) 濾除噪聲。如果某一頻率分量的大小低於最強分量的10%,則將其濾除。
amps[amps < 0.1 * amps.max()] = 0
(3) 將濾波後的信號變換回時域,並和去除趨勢後的信號一起繪製出來。
plt.plot(dates, y, 'o', label="detrended")
plt.plot(dates,-fftpack.irfft(fftpack.ifftshift(amps)), label="filtered")
(4) 將x軸上的標籤格式化為日期,並添加一個特大號的圖例。
fig.autofmt_xdate()
plt.legend(prop={'size':'x-large'})
(5) 添加第二個子圖,繪製濾波後的頻譜。
ax2 = fig.add_subplot(212)
N = len(qqq)
plt.plot(np.linspace(-N/2, N/2, N), amps, label="transformed")
(6) 顯示圖像和圖例。
plt.legend(prop={'size':'x-large'})
plt.show()
\u0007
閱讀更多 自嗨編程土法量投 的文章