實戰之金融時間序列分析 Part 1
- 概述
- 平臺
- 獲取股票資料
- 需求
- 函式
- index_components - 獲取指數成分股串列
- get_price - 合約歷史資料
- 代碼
- 統計分析
- 需求
- 函式
- 代碼
- 序列變化情況計算
- 需求
- 函式
- pd.pct_change()
- pd.shift()
- 代碼
概述
時間序列分析 (time series analysis) 是量化投資中的一門基本技術. 時間序列是指在一定時間內按時間順序測量的某個變數的取值序列. 時間序列分析就是使用統計的手段對這個序列的過去進行分析. 以此對該變數的變化特征性建模, 并對未來進行預測.

平臺
我們將繼續使用 RiceQuant 的投資研究平臺進行分析.
網址:https://www.ricequant.com/quant/notebook
具體的平臺介紹可以參考: https://iamarookie.blog.csdn.net/article/details/114958524
沒有看過的同學可以自行翻一下專欄別的文章:
https://blog.csdn.net/weixin_46274168/category_10961128.html
獲取股票資料
需求
- 滬深300 (選10只)
- 分析區間 2019-01-01 到 2021-01-01
- 以時間為索引
- 繪制各個指標的走勢情況
函式
index_components - 獲取指數成分股串列
獲取每一指數的股票構成串列, 也支持指數的歷史構成查詢,
index_components(order_book_id, date=None, start_date, end_date, market='cn')
引數:
| 引數 | 型別 | 說明 |
|---|---|---|
| order_book_id | str | 指數代碼,傳入 order_book_id,例如’000001.XSHG’, |
| date | str, datetime.date, datetime.datetime, pandas Timestamp | 查詢日期,默認為最新記錄日期 |
| start_date | str, datetime.date, datetime.datetime, pandas Timestamp | 指定開始日期,不能和 date 同時指定 |
| end_date | str, datetime.date, datetime.datetime, pandas Timestamp | 指定結束日期, 需和 start_date 同時指定并且應當不小于開始日期 |
| market | str | 默認是中國市場(‘cn’),目前僅支持中國市場 |
回傳:
構成該指數股票的 order_book_id list
get_price - 合約歷史資料
獲取指定合約或合約串列的歷史行情(包含起止日期,日線或分鐘線),不能在’handle_bar’函式中進行呼叫,
get_price(order_book_ids, start_date, end_date=None, frequency='1d', fields=None, adjust_type='pre', skip_suspended=False,expect_df=False)
引數:
| 引數 | 型別 | 說明 |
|---|---|---|
| order_book_ids | str OR str list | 合約代碼,合約代碼,可傳入 order_book_id, order_book_id list |
| start_date | str, datetime.date, datetime.datetime, pandasTimestamp | 開始日期,用戶必須指定 |
| end_date | str, datetime.date, datetime.datetime, pandasTimestamp | 結束日期,默認為策略當前日期前一天 |
| frequency | str | 歷史資料的頻率, 現在支持日/分鐘級別的歷史資料,默認為’1d’,使用者可自由選取不同頻率,例如’5m’代表 5 分鐘線 |
| fields | str OR str list | 回傳欄位名稱 |
| adjust_type | str | 權息修復方案,前復權 - pre,后復權 - post,不復權 - none, |
| skip_suspended | bool | 是否跳過停牌資料,默認為 False,不跳過,用停牌前資料進行補齊,True 則為跳過停牌期,注意,當設定為 True 時,函式 order_book_id 只支持單個合約傳入 |
| expect_df | bool | 默認回傳原有的 Panel 資料結構,如果調為真,則回傳 pandas dataframe |
代碼
# 定義分析時間段
start_date = "2019-01-01" # 開始日期
end_date = "2021-01-01" # 結束日期
# 獲取滬深300股票
stock_list = index_components("000300.XSHG")
# 取前10個
stock_list = stock_list[:10] # 切片
print(stock_list) # 除錯輸出
# 獲取價格資料 (收盤價)
data = get_price(stock_list, start_date=start_date, end_date=end_date,fields="close")
print(data.head()) # 除錯輸出
# 繪制各個指標的走勢情況
data.plot(figsize=(10, 12), subplots=True) # 子圖
data.plot(figsize=(16, 12))
輸出結果:
data.plot(figsize=(16, 12))
['601390.XSHG', '002958.XSHE', '300142.XSHE', '601788.XSHG', '600999.XSHG', '002179.XSHE', '002508.XSHE', '600031.XSHG', '002032.XSHE', '002456.XSHE']
002179.XSHE 601390.XSHG 002508.XSHE 601788.XSHG 600031.XSHG \
date
2019-01-02 25.9121 6.5340 19.0277 8.6610 7.7510
2019-01-03 26.2175 6.5815 18.9417 8.8392 7.6355
2019-01-04 26.3474 6.6671 19.4771 9.6410 7.7703
2019-01-07 27.3860 6.6956 19.6684 9.5915 7.8377
2019-01-08 27.4013 6.7052 19.7066 9.5816 7.7991
600999.XSHG 002958.XSHE 002032.XSHE 300142.XSHE 002456.XSHE
date
2019-01-02 10.7152 NaN 50.1480 18.4021 9.1656
2019-01-03 10.8199 NaN 46.3313 17.8929 8.6963
2019-01-04 11.5364 NaN 48.2589 18.0527 8.8960
2019-01-07 11.3914 NaN 49.2035 18.6118 9.0158
2019-01-08 11.2787 NaN 49.1553 18.5819 9.0857


統計分析
需求
- 資料中各項指標統計結果 (保留兩位小數)
- 使用 aggregate 方法將多種統計指標匯總
函式
aggregate:使用指定 axis 上的一個或多個操作聚合.
DataFrame.aggregate(func, axis=0, *args, **kwargs)
代碼
print(data.info())
print(data.describe().round(2))
# 除錯輸出平均數
print(data.mean())
# 匯總
print(data.aggregate([min, max, np.mean, np.std, np.median]))
輸出結果:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 487 entries, 2019-01-02 to 2020-12-31
Data columns (total 10 columns):
002179.XSHE 487 non-null float64
601390.XSHG 487 non-null float64
002508.XSHE 487 non-null float64
601788.XSHG 487 non-null float64
600031.XSHG 487 non-null float64
600999.XSHG 487 non-null float64
002958.XSHE 433 non-null float64
002032.XSHE 487 non-null float64
300142.XSHE 487 non-null float64
002456.XSHE 487 non-null float64
dtypes: float64(10)
memory usage: 41.9 KB
None
002179.XSHE 601390.XSHG 002508.XSHE 601788.XSHG 600031.XSHG \
count 487.00 487.00 487.00 487.00 487.00
mean 39.81 5.82 30.88 14.13 17.15
std 9.31 0.56 5.64 4.64 6.00
min 25.91 4.85 18.94 8.66 7.64
25% 33.68 5.43 26.29 11.11 12.71
50% 38.27 5.67 30.68 11.71 15.61
75% 42.85 6.16 33.98 17.40 20.17
max 78.29 7.27 43.99 29.99 34.98
600999.XSHG 002958.XSHE 002032.XSHE 300142.XSHE 002456.XSHE
count 487.00 433.00 487.00 487.00 487.00
mean 15.81 5.83 70.01 35.89 13.81
std 3.56 1.15 7.57 14.24 3.54
min 10.72 3.97 46.33 17.89 7.59
25% 13.52 5.14 66.64 27.18 11.15
50% 14.30 5.69 70.66 30.14 14.44
75% 19.94 6.26 74.21 43.49 16.06
max 24.42 9.91 85.70 91.76 23.32
002179.XSHE 39.805091
601390.XSHG 5.823683
002508.XSHE 30.882818
601788.XSHG 14.125659
600031.XSHG 17.147733
600999.XSHG 15.812086
002958.XSHE 5.828605
002032.XSHE 70.010184
300142.XSHE 35.894527
002456.XSHE 13.811878
dtype: float64
002179.XSHE 601390.XSHG 002508.XSHE 601788.XSHG 600031.XSHG \
min 25.912100 4.852000 18.941700 8.661000 7.635500
max 78.290000 7.266300 43.990000 29.987300 34.980000
mean 39.805091 5.823683 30.882818 14.125659 17.147733
std 9.306263 0.561201 5.644749 4.639231 6.002176
median 38.274500 5.667200 30.682500 11.713300 15.610100
600999.XSHG 002958.XSHE 002032.XSHE 300142.XSHE 002456.XSHE
min 10.715200 3.965400 46.331300 17.892900 7.588100
max 24.422700 9.909100 85.700000 91.764200 23.318700
mean 15.812086 5.828605 70.010184 35.894527 13.811878
std 3.556864 1.147390 7.565533 14.236502 3.538181
median 14.301800 5.690000 70.660000 30.138200 14.440000
序列變化情況計算
需求
- 計算每一天各項指標的差異值(后一天減去前一天結果)
- 計算pct_change:增長率也就是 (后一個值-前一個值)/前一個值)
- 計算平均計算pct_change指標
- 繪圖觀察哪個指標平均增長率最高
- 計算連續時間的增長率(其中需要計算今天價格和昨天價格的差異)
- 看看各個指標最初的1塊錢相當于現在的多少
函式
pd.pct_change()
表示當前元素與先前元素的相差百分比. 指定 periods=n, 表示當前元素與先前 n 個元素的相差百分比.
DataFrame.pct_change(periods=1, fill_method=‘pad’, limit=None, freq=None, **kwargs)
pd.shift()
pd.shift() : 列進行平移變換 (shift).
DataFrame.shift(periods=1, freq=None, axis=0)
代碼
# 1. 計算每一天的差異值 (后一天減去前一天結果)
print(data.diff().head())
# 2. 計算增長率
pct_change = data.pct_change()
print(pct_change.head().round(2))
# 3. 計算平均增長率
pct_change_mean = data.diff().mean()
print(pct_change_mean)
# 4. 繪圖觀察哪個指標平均增長率最高
data.pct_change().mean().plot(kind='bar',figsize=(10,6))
# 往后挪一位
data.shift(1).head()
# 5. 計算連續時間增長率
rets = np.log(data/data.shift(1))
print(rets.head().round(2))
# 6. 看看各個指標最初的1塊錢相當于現在的多少
rets.cumsum().apply(np.exp).plot(figsize = (16, 12))
輸出結果:
002179.XSHE 601390.XSHG 002508.XSHE 601788.XSHG 600031.XSHG \
date
2019-01-02 NaN NaN NaN NaN NaN
2019-01-03 0.3054 0.0475 -0.0860 0.1782 -0.1155
2019-01-04 0.1299 0.0856 0.5354 0.8018 0.1348
2019-01-07 1.0386 0.0285 0.1913 -0.0495 0.0674
2019-01-08 0.0153 0.0096 0.0382 -0.0099 -0.0386
600999.XSHG 002958.XSHE 002032.XSHE 300142.XSHE 002456.XSHE
date
2019-01-02 NaN NaN NaN NaN NaN
2019-01-03 0.1047 NaN -3.8167 -0.5092 -0.4693
2019-01-04 0.7165 NaN 1.9276 0.1598 0.1997
2019-01-07 -0.1450 NaN 0.9446 0.5591 0.1198
2019-01-08 -0.1127 NaN -0.0482 -0.0299 0.0699
002179.XSHE 601390.XSHG 002508.XSHE 601788.XSHG 600031.XSHG \
date
2019-01-02 NaN NaN NaN NaN NaN
2019-01-03 0.01 0.01 -0.00 0.02 -0.01
2019-01-04 0.00 0.01 0.03 0.09 0.02
2019-01-07 0.04 0.00 0.01 -0.01 0.01
2019-01-08 0.00 0.00 0.00 -0.00 -0.00
600999.XSHG 002958.XSHE 002032.XSHE 300142.XSHE 002456.XSHE
date
2019-01-02 NaN NaN NaN NaN NaN
2019-01-03 0.01 NaN -0.08 -0.03 -0.05
2019-01-04 0.07 NaN 0.04 0.01 0.02
2019-01-07 -0.01 NaN 0.02 0.03 0.01
2019-01-08 -0.01 NaN -0.00 -0.00 0.01
002179.XSHE 0.107773
601390.XSHG -0.002601
002508.XSHE 0.044758
601788.XSHG 0.020286
600031.XSHG 0.056027
600999.XSHG 0.025977
002958.XSHE -0.000729
002032.XSHE 0.057288
300142.XSHE 0.041477
002456.XSHE 0.008260
dtype: float64
002179.XSHE 601390.XSHG 002508.XSHE 601788.XSHG 600031.XSHG \
date
2019-01-02 NaN NaN NaN NaN NaN
2019-01-03 0.01 0.01 -0.00 0.02 -0.02
2019-01-04 0.00 0.01 0.03 0.09 0.02
2019-01-07 0.04 0.00 0.01 -0.01 0.01
2019-01-08 0.00 0.00 0.00 -0.00 -0.00
600999.XSHG 002958.XSHE 002032.XSHE 300142.XSHE 002456.XSHE
date
2019-01-02 NaN NaN NaN NaN NaN
2019-01-03 0.01 NaN -0.08 -0.03 -0.05
2019-01-04 0.06 NaN 0.04 0.01 0.02
2019-01-07 -0.01 NaN 0.02 0.03 0.01
2019-01-08 -0.01 NaN -0.00 -0.00 0.01


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274539.html
標籤:其他
