MATLAB 高級數據結構連載 2:金融時間序列Financial Time Series (Part B)
在上一篇文章中,我們介紹了 MATLAB 的金融時間序列:FINTS。它是處理諸如股票價格序列這一類金融時間序列的利器,它的主要優點是:
- 面向對象的數據結構,支持多種操作金融數據方法
- 可以把「字元串形式的時刻」和「浮點數形式的價格數據」存儲在同一個 FINTS 對象中
- 沒有重複的數據,數據內容一目了然
本篇將介紹金融時間序列 FINTS數據結構所支持的操作金融數據的方法,比如抽樣、計算移動平均值。
1. 數據合併 merge
merge 方法可以合併多個 FINTS 對象,這裡介紹兩個常用的。首先設 FTS1 和 FTS2 分別如下所示:
FTS1 = n desc: (none)n freq: Unknown (0)n dates: (3) open: (3)n 01-Jan-2016 [ 1]n 02-Jan-2016 [ 1]n 03-Jan-2016 [ 1]n nFTS2 = n desc: (none)n freq: Unknown (0)n dates: (2) close: (2)n 02-Jan-2016 [ 2]n 03-Jan-2016 [ 2]n
則 merge( FTS1, FTS2, DateSetMethod, Intersection ) 以 FTS1 和 FTS2 兩者時刻的交集為索引,合併兩個 FINTS 對象,示例如下:
>> merge( FTS1, FTS2, DateSetMethod, Intersection )nans = n desc: || n freq: Unknown (0)n dates: (2) close: (2) open: (2)n 02-Jan-2016 [ 2] [ 1]n 03-Jan-2016 [ 2] [ 1]n
而 merge( FTS1, FTS2, DateSetMethod, Union ) 則以兩個 FINTS 對象時刻的並集為索引來合併它們,示例如下:
>> merge( FTS1, FTS2, DateSetMethod, Union ) nans = n desc: || n freq: Unknown (0)n dates: (3) close: (3) open: (3)n 01-Jan-2016 [ NaN] [ 1]n 02-Jan-2016 [ 2] [ 1]n 03-Jan-2016 [ 2] [ 1]n
缺失值(01-Jan-2016 的 close)默認用 NaN 代替,如果不希望數據中包含 NaN,可以用 fillts 命令來替換之。
可以發現,merge 方法間接提供了一個按時刻對齊數據的方法——FTS1 所含的 close,和 FTS2 所含的 open,原本在時刻上並不一致(在 01-Jan-2016 這個時刻,open 有數據,close 沒有);merge 了以後,新產生的 FINTS 對象就將兩者按時刻對齊了。在 PartC 的案例中,我們將用 merge 來對齊「股票價格的分鐘數據」和「買賣股票的成交記錄」這兩組數據。
2. 數據抽樣
FINTS 既可以按指定的時間間隔(日、周、月等)抽樣,又可以按指定的數據個數間隔抽樣,以下分別介紹:
1. convertto
按指定時間段抽樣,例如:
>> newFTS = convertto( myFTS, daily)n
上述命令把儲存分鐘數據的 myFTS, 轉換成儲存日數據的新序列對象 newFTS,新序列抽取每天的最後一筆數據(收盤時的分鐘數據)作為其行數據:
>> newFTS = n desc: TODAILY: 50ETF 價格n freq: Daily (1)n dates:(4) times:(4) open:(4) high: (4) low:(4) close: (4)n 01-Mar-2016 15:00 [1.972] [1.972] [1.971] [1.971]n 02-Mar-2016 15:00 [2.049] [2.049] [2.049] [2.049]n 03-Mar-2016 15:00 [2.052] [2.053] [2.052] [2.053]n 04-Mar-2016 15:00 [2.122] [2.122] [ 2.122] [2.122]n
convertto 的第二個參數,還可以是:Weekly(按周)、Monthly(按月)、Quarterly(按季度)、Semiannual(按半年)、Annual(按年)。此外,FINTS 還擁有 to... 方法,它們與 convertto 異曲同工,例如,以下兩個命令得到的結果相同:
>> newFTS = todaily( myFTS )n>> newFTS = convertto( myFTS, daily)n
以上方法還有一個特點:可自動過濾掉節假日。
2. resamplets
對FINTS數據按照指定的時間間隔做抽樣。回顧原始數據 myFTS 的前幾行:
myFTS = n desc: 50ETF 價格n freq: Unknown (0)n dates:(967) times:(967) open:(967) high:(967) low:(967) close:(967)n 01-Mar-2016 09:25 [1.94] [1.94] [1.94] [ 1.94]n " 09:30 [ 1.94] [1.942] [1.932] [ 1.932]n " 09:31 [1.932] [1.932] [1.929] [ 1.931]n " 09:32 [1.931] [1.936] [1.931] [ 1.936]n " 09:33 [1.935] [1.942] [1.935] [ 1.942]n ...n
使用 resamplets( myFTS, 2 ),可以獲得從myFTS中每隔一行(步長為2)抽取得到的新序列:
>> resamplets( myFTS, 2 ) nans = n desc: RESAMPLES of 50ETF 價格n freq: Unknown (0)n dates:(484) times:(484) open:(484) high:(484) low:(484) close: (484)n 01-Mar-2016 09:25 [ 1.94] [ 1.94] [1.94] [ 1.94]n " 09:31 [1.932] [1.932] [1.929] [ 1.931]n " 09:33 [1.935] [1.942] [1.935] [ 1.942]n
3. 計算均值
FINTS提供了兩個計算均值相關的方法:
- peravg,計算一定周期內的均值
- tsmovavg,計算移動平均值。(需要R2016a版本或更新的的MATALB版本,tsmovavg才接收FINTS對象作為輸入)
以下分別介紹:
1. peravg
Periodic average 周期平均值,它有兩種用法:
peravg( tsobj, numperiod)
以 numperiod 行數據為周期,計算每個周期的平均值。它的返回值是struct(結構體)。回顧myFTS 的前四行:
myFTS(1:4) nans = n desc: 50ETF 價格n freq: Unknown (0)n dates:(4) times:(4) open:(4) high:(4) low:(4) close:(4)n 01-Mar-2016 09:25 [1.94] [1.94] [1.94] [1.94]n " 09:30 [1.94] [1.942] [ 1.932] [1.932]n " 09:31 [1.932] [1.932] [ 1.929] [1.931]n " 09:32 [1.931] [1.936] [ 1.931] [1.936]n
觀察如下計算得到的結果:
>> peravg( myFTS(1:4),2 ) nans = n open: [1.94 1.9315]n high: [1.941 1.934]n low: [1.936 1.93]n close: [1.936 1.9335]n
可以看到,ans.open 的兩個數據分別是 myFTS.open 的第 1-2 行、第 3-4 行的均值。
peravg( tsobj, daterange)
返回 daterange 這段時間內數據的平均值。
peravg的返回值也是一個結構體。在FINTS中,用 「::」(兩個冒號)來指定一段時間,以下命令可以獲得 3 月 1 日開盤前半小時 50ETF 各個欄位的均值:>> peravg( myFTS, 01-Mar-2016 09:30::01-Mar-2016 09:59 )nans =n open: 1.94286206896552n high: 1.94541379310345n low: 1.94113793103448n close: 1.94310344827586n
這給我們提供了一種以時間為索引求平均的簡便方法:我們不需要去定位某段時間的開始和結束時刻在序列的第幾行。
2. tsmovavg,
計算移動平均值,不多贅述,可選的移動平均種類有:
- 簡單(simple)移動平均
- 指數(exponential)移動平均
- 三角(triangular)移動平均
- 加權(weighted)移動平均
- 修正(modified)移動平均
4. 數據延遲/提前
1. lagts、leadts 數據延遲
newFTS = lagts( oldFTS, DelayStep) 把原序列(oldFTS)延遲 DelayStep 步數,以獲得新序列(newFTS). 回顧原始數據 myFTS 的前幾行:
myFTS = n desc: 50ETF 價格n freq: Unknown (0)n dates: (967) times: (967) open: (967) high: (967) low: (967) close: (967)n 01-Mar-2016 09:25 [ 1.94] [ 1.94] [1.94] [ 1.94]n " 09:30 [ 1.94] [1.942] [1.932] [ 1.932]n " 09:31 [1.932] [1.932] [1.929] [ 1.931]n " 09:32 [1.931] [1.936] [1.931] [ 1.936]n " 09:33 [1.935] [1.942] [1.935] [ 1.942]n ...n
延遲一步以後(DelatStep=1),獲得的新序列如下,可以看到,原序列 9:30 的數據,被延遲到了新序列的 9:31,其它時間也同樣延遲。
>> lagts( myFTS ) nans = n desc: LAGTS on 50ETF 價格n freq: Unknown (0)n dates: (967) times: (967) open: (967) high: (967) low: (967) close: (967)n 01-Mar-2016 09:25 [0] [0] [ 0] [ 0]n " 09:30 [ 1.94] [ 1.94] [1.94] [ 1.94]n " 09:31 [ 1.94] [1.942] [1.932] [ 1.932]n " 09:32 [1.932] [1.932] [1.929] [ 1.931]n " 09:33 [1.931] [1.936] [1.931] [ 1.936] n ...n
直觀來看,lagts獲取的序列,比原序列「慢」;與 lagts 異曲同工的,還有 leadts,用它獲取到的新序列,比原序列「快」。
5. 其它FINTS的方法:
- smoothts : 數據平滑,平滑的方法有:linear method、Exponential method、Gaussian Window method
- diff:求相鄰時間的差值。它不會影響到dates 和 times。
- fillts:按指定方式補全FINTS對象中缺失的數據。
- boxcox:boxcox變換。
- filter:按指定方法過濾數據。
6. 繪製 FINTS obj
FINTS 對象可以用 plot 命令或 chartfts 直接繪製。
使用 plot 命令時,無需指定 x 軸數據(時刻),只需指定需要繪製的 FINTS 對象。可以用 「.欄位名」 來指定繪製某一個欄位,例如:
>> plot( myFTS.open )n
如果不指定欄位名(open),則 matlab 默認繪製所有欄位:
>> plot( myFTS )n
>> chartfits( myFTS ) n
下一篇文章,我們將介紹一個使用 FINTS 計算賬戶動態權益的案例。
推薦閱讀:
※[MATLAB R2017a 搶鮮報道] : 自動駕駛工具箱(2)
※MATLAB 高級數據結構連載 1:金融時間序列Financial Time Series (Part A)
※[matDL框架開發直播:1]matDL概述和基本使用
※【Matlab基礎】04. 自定義函數
※理工科女生筆記本選購諮詢?
TAG:MATLAB |