Python量化交易實戰之使用Resample函數轉換“日K”數據
使用Resample函數轉換時間序列
一、什麼是resample函數?
它是Python數據分析庫Pandas的方法函數。
它主要用於轉換時間序列的頻次。可以做一些統計匯總的工作。
什麼叫轉換時間序列的頻次呢?
比如說股票的日k和周k,
假設我隻能獲取到股票日K的數據,比如說11月1號到11月5號,那怎麼樣將它轉換為以周為單位的K線呢?
日期 | 周期 | 開盤價 | 收盤價 | 最高價 | 最低價 |
---|---|---|---|---|---|
11月1號 | 周一 | 1.11 | 1.11 | 1.11 | 1.12 |
11月2號 | 周二 | 1.12 | 1.12 | 1.11 | 1.12 |
11月3號 | 周三 | 1.13 | 1.13 | 1.11 | 1.12 |
11月4號 | 周四 | 1.15 | 1.14 | 1.11 | 1.12 |
11月5號 | 周五 | 1.14 | 1.15 | 1.11 | 1.12 |
首先我們要明確,周K的開盤、收盤、最高、最低是什麼。每周的開盤價是當周第一天的開盤價,收盤價是當周最後一天的收盤價,它的最高價是這周最高的價格,最低價是本周所有最低價中最低的價格。所以你去看炒股平臺,它的周k都是以周五的交易日為記錄的時間點位置。開盤、收盤、最高、最低是按照我剛剛講解的這個規則來計算的。至於月K、年K的選取規則也是一樣的。月K的周期是一個月,年K的周期是一年。
這個計算準確性你也可以通過網上的數據進行驗證。這個計算規則,包括開盤、收盤、最高、最低的計算,收拾resample函數可以做到的事情。此外Resample還有個功能,就是做統計匯總,比如說我想計算一支股票總的周成交量,就可以使用Resample.sum函數去把周一到周五的成交量加起來。
為瞭方便大傢記憶 ,你也可以把resample理解為Excel表格中的透視表功能。你可以按照日期做各種篩選和匯總統計的。最重要的是他可以按照日期。
二、實戰Resample函數
因為這2節課還是一些比較基礎的部分,所以還沒有做模塊化的內容。
我們會在創建股票數據庫的時候 來做真正的模塊化的工作。到這裡都是初級的腳本的形式。先提前說下。
1.日K 轉換為 周K
1.1函數文檔學習
谷歌搜索Pandas Resample
:第一個鏈接就是這個函數的官方文檔
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.resample.html
這裡有介紹:Resample是屬於Pandas DataFrame下面的方法。這裡有關於參數的解釋。
這裡我們隻對2個常用參數講解,一個是rule,另一個是closed。
- rule表示的是你放一個什麼樣的周期性指標在裡面,用m代表Month,Y代表Year,w代表Week,
- closed代表你取哪一個分界線,舉例來說,比如說我把日k轉換為周k,到底我是取周一為分界線還是周五為分界線呢?這就是通過closed來確定的。
這裡有它的例子:
>>>index = pd.date_range('1/1/2000', periods=9, freq='T') >>>series = pd.Series(range(9), index=index) >>>series 2000-01-01 00:00:00 0 2000-01-01 00:01:00 1 2000-01-01 00:02:00 2 2000-01-01 00:03:00 3 2000-01-01 00:04:00 4 2000-01-01 00:05:00 5 2000-01-01 00:06:00 6 2000-01-01 00:07:00 7 2000-01-01 00:08:00 8 Freq: T, dtype: int64
這裡首先創建瞭一個時間序列的DataFrame
,就是這個series
變量。你可以理解為它是一個隻有一個字段的表格樣式。接著往下看:
>>>series.resample('3T').sum() 2000-01-01 00:00:00 3 2000-01-01 00:03:00 12 2000-01-01 00:06:00 21 Freq: 3T, dtype: int64
這裡使用瞭Resample
方法,3T
就是3分鐘,T
表示分鐘。sum()
就是匯總,也就是針對這一列數據進行匯總。
也就是說,每3分鐘統計依次。註意到,這個時間序列匯總的時間取的值是3分鐘的第一分鐘。如果我想取時間周期的最後一分鐘,可以將label的值改為“right”:
>>>series.resample('3T', label='right').sum() 2000-01-01 00:03:00 3 2000-01-01 00:06:00 12 2000-01-01 00:09:00 21 Freq: 3T, dtype: int64
1.2實戰
獲取日K真實的數據:
#獲取日k df = get_price("000001.XSHG", end_date='2021-05-30 14:00:00',count=20, frequency='1d', fields=['open','close','high','low','volume','money']) print(df)
可以看到獲取到瞭4月28號
到5月28號
的所有數據。為瞭更方便理解 我們再添加一列數據,就是當前日期是星期幾
的列。
#獲取日k df = get_price("000001.XSHG", end_date='2021-05-30 14:00:00',count=20, frequency='1d', fields=['open','close','high','low','volume','money']) df['weekday']=df.index.weekday print(df)
這裡0
代表周一,這裡如何轉換為按“周”統計呢
#獲取周k import pandas as pd df_week = pd.DataFrame() df_week = df['open'].resample('W').first() print(df_week)
可以看到這裡的2021-05-30
是一個禮拜的最後一天。它對應的開盤價確實是這個數字。說明我們計算的周K數據是正確的。
收盤價就是每周收盤價
最後一天的數據。
最高價就是每周收盤價
的最大值。
最低價就是每周收盤價
的最小值。
#獲取周k import pandas as pd df_week = pd.DataFrame() df_week['open'] = df['open'].resample('W').first() df_week['close'] = df['close'].resample('W').last() df_week['high'] = df['high'].resample('W').max() df_week['low'] = df['low'].resample('W').min() print(df_week)
對比數據,close是最後一天的收盤價的數據。high是當前周的每天的最高價的最高價。low是當前周的每天的最低價的最低價。
我們通過不到10行代碼就能將日K
的數據轉換為周K
的數據。
2.匯總統計功能(統計月成交量、成交額)
匯總成交量和成交額
我想要把volume
(成交量)和money
(成交額)轉換為總成交量和總成交額
#獲取周k import pandas as pd df_week = pd.DataFrame() df_week['open'] = df['open'].resample('W').first() df_week['close'] = df['close'].resample('W').last() df_week['high'] = df['high'].resample('W').max() df_week['low'] = df['low'].resample('W').min() df_week['volume(sum)'] = df['volume'].resample('W').sum() df_week['money(sum)'] = df['money'].resample('W').sum() print(df_week)
3.日K 轉換為 月K
假設我有一年的數據,如果想轉換為月K應該怎麼轉?
隻需要改2個地方:
- 添加
start_date
獲取到一整年的數據 - 將
resample
的參數改為M即可,M代表Month
#獲取日k df = get_price("000001.XSHG", end_date='2021-05-30 14:00:00', start_date='2020-05-30', frequency='1d', fields=['open','close','high','low','volume','money']) df['weekday']=df.index.weekday print(df) #獲取周k import pandas as pd df_week = pd.DataFrame() df_week['open'] = df['open'].resample('M').first() df_week['close'] = df['close'].resample('M').last() df_week['high'] = df['high'].resample('M').max() df_week['low'] = df['low'].resample('M').min() print(df_week)
以上就是Python量化交易實戰之使用Resample函數轉換“日K”數據的詳細內容,更多關於Python Resample函數轉換“日K”數據的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Python Pandas高級教程之時間處理
- python數學建模之三大模型與十大常用算法詳情
- Python Pandas 中的數據結構詳解
- python Pandas時序數據處理
- Python pandas索引的設置和修改方法