Python量化交易實(shí)戰(zhàn)之使用Resample函數(shù)轉(zhuǎn)換“日K”數(shù)據(jù)
使用Resample函數(shù)轉(zhuǎn)換時(shí)間序列
一、什么是resample函數(shù)?
它是Python數(shù)據(jù)分析庫(kù)Pandas的方法函數(shù)。
它主要用于轉(zhuǎn)換時(shí)間序列的頻次??梢宰鲆恍┙y(tǒng)計(jì)匯總的工作。
什么叫轉(zhuǎn)換時(shí)間序列的頻次呢?
比如說股票的日k和周k,
假設(shè)我只能獲取到股票日K的數(shù)據(jù),比如說11月1號(hào)到11月5號(hào),那怎么樣將它轉(zhuǎn)換為以周為單位的K線呢?
日期 | 周期 | 開盤價(jià) | 收盤價(jià) | 最高價(jià) | 最低價(jià) |
---|---|---|---|---|---|
11月1號(hào) | 周一 | 1.11 | 1.11 | 1.11 | 1.12 |
11月2號(hào) | 周二 | 1.12 | 1.12 | 1.11 | 1.12 |
11月3號(hào) | 周三 | 1.13 | 1.13 | 1.11 | 1.12 |
11月4號(hào) | 周四 | 1.15 | 1.14 | 1.11 | 1.12 |
11月5號(hào) | 周五 | 1.14 | 1.15 | 1.11 | 1.12 |
首先我們要明確,周K的開盤、收盤、最高、最低是什么。每周的開盤價(jià)是當(dāng)周第一天的開盤價(jià),收盤價(jià)是當(dāng)周最后一天的收盤價(jià),它的最高價(jià)是這周最高的價(jià)格,最低價(jià)是本周所有最低價(jià)中最低的價(jià)格。所以你去看炒股平臺(tái),它的周k都是以周五的交易日為記錄的時(shí)間點(diǎn)位置。開盤、收盤、最高、最低是按照我剛剛講解的這個(gè)規(guī)則來計(jì)算的。至于月K、年K的選取規(guī)則也是一樣的。月K的周期是一個(gè)月,年K的周期是一年。
這個(gè)計(jì)算準(zhǔn)確性你也可以通過網(wǎng)上的數(shù)據(jù)進(jìn)行驗(yàn)證。這個(gè)計(jì)算規(guī)則,包括開盤、收盤、最高、最低的計(jì)算,收拾resample函數(shù)可以做到的事情。此外Resample還有個(gè)功能,就是做統(tǒng)計(jì)匯總,比如說我想計(jì)算一支股票總的周成交量,就可以使用Resample.sum函數(shù)去把周一到周五的成交量加起來。
為了方便大家記憶 ,你也可以把resample理解為Excel表格中的透視表功能。你可以按照日期做各種篩選和匯總統(tǒng)計(jì)的。最重要的是他可以按照日期。
二、實(shí)戰(zhàn)Resample函數(shù)
因?yàn)檫@2節(jié)課還是一些比較基礎(chǔ)的部分,所以還沒有做模塊化的內(nèi)容。
我們會(huì)在創(chuàng)建股票數(shù)據(jù)庫(kù)的時(shí)候 來做真正的模塊化的工作。到這里都是初級(jí)的腳本的形式。先提前說下。
1.日K 轉(zhuǎn)換為 周K
1.1函數(shù)文檔學(xué)習(xí)
谷歌搜索Pandas Resample
:第一個(gè)鏈接就是這個(gè)函數(shù)的官方文檔
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.resample.html
這里有介紹:Resample是屬于Pandas DataFrame下面的方法。這里有關(guān)于參數(shù)的解釋。
這里我們只對(duì)2個(gè)常用參數(shù)講解,一個(gè)是rule,另一個(gè)是closed。
- rule表示的是你放一個(gè)什么樣的周期性指標(biāo)在里面,用m代表Month,Y代表Year,w代表Week,
- closed代表你取哪一個(gè)分界線,舉例來說,比如說我把日k轉(zhuǎn)換為周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
這里首先創(chuàng)建了一個(gè)時(shí)間序列的DataFrame
,就是這個(gè)series
變量。你可以理解為它是一個(gè)只有一個(gè)字段的表格樣式。接著往下看:
>>>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()
就是匯總,也就是針對(duì)這一列數(shù)據(jù)進(jìn)行匯總。
也就是說,每3分鐘統(tǒng)計(jì)依次。注意到,這個(gè)時(shí)間序列匯總的時(shí)間取的值是3分鐘的第一分鐘。如果我想取時(shí)間周期的最后一分鐘,可以將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實(shí)戰(zhàn)
獲取日K真實(shí)的數(shù)據(jù):
#獲取日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號(hào)
到5月28號(hào)
的所有數(shù)據(jù)。為了更方便理解 我們?cè)偬砑右涣袛?shù)據(jù),就是當(dāng)前日期是星期幾
的列。
#獲取日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
代表周一,這里如何轉(zhuǎn)換為按“周”統(tǒng)計(jì)呢
#獲取周k import pandas as pd df_week = pd.DataFrame() df_week = df['open'].resample('W').first() print(df_week)
可以看到這里的2021-05-30
是一個(gè)禮拜的最后一天。它對(duì)應(yīng)的開盤價(jià)確實(shí)是這個(gè)數(shù)字。說明我們計(jì)算的周K數(shù)據(jù)是正確的。
收盤價(jià)就是每周收盤價(jià)
最后一天的數(shù)據(jù)。
最高價(jià)就是每周收盤價(jià)
的最大值。
最低價(jià)就是每周收盤價(jià)
的最小值。
#獲取周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)
對(duì)比數(shù)據(jù),close是最后一天的收盤價(jià)的數(shù)據(jù)。high是當(dāng)前周的每天的最高價(jià)的最高價(jià)。low是當(dāng)前周的每天的最低價(jià)的最低價(jià)。
我們通過不到10行代碼就能將日K
的數(shù)據(jù)轉(zhuǎn)換為周K
的數(shù)據(jù)。
2.匯總統(tǒng)計(jì)功能(統(tǒng)計(jì)月成交量、成交額)
匯總成交量和成交額
我想要把volume
(成交量)和money
(成交額)轉(zhuǎn)換為總成交量和總成交額
#獲取周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 轉(zhuǎn)換為 月K
假設(shè)我有一年的數(shù)據(jù),如果想轉(zhuǎn)換為月K應(yīng)該怎么轉(zhuǎn)?
只需要改2個(gè)地方:
- 添加
start_date
獲取到一整年的數(shù)據(jù) - 將
resample
的參數(shù)改為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量化交易實(shí)戰(zhàn)之使用Resample函數(shù)轉(zhuǎn)換“日K”數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于Python Resample函數(shù)轉(zhuǎn)換“日K”數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python編程產(chǎn)生非均勻隨機(jī)數(shù)的幾種方法代碼分享
這篇文章主要介紹了Python編程產(chǎn)生非均勻隨機(jī)數(shù)的幾種方法代碼分享,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12Python實(shí)現(xiàn)通過文件路徑獲取文件hash值的方法
這篇文章主要介紹了Python實(shí)現(xiàn)通過文件路徑獲取文件hash值的方法,結(jié)合實(shí)例形式分析了Python針對(duì)文件進(jìn)行hash運(yùn)算的實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04Python利用pyodbc庫(kù)將文件信息插入Access數(shù)據(jù)庫(kù)
在日常編程工作中,我們經(jīng)常需要處理文件和文件夾,所以本文將介紹如何使用Python編程語言和wxPython庫(kù)創(chuàng)建一個(gè)簡(jiǎn)單的文件瀏覽器界面,使用戶能夠選擇文件夾并將文件信息插入到Access數(shù)據(jù)庫(kù)中,需要的可以參考下2023-08-08Python實(shí)現(xiàn)定時(shí)任務(wù)的八種方案詳解
在日常工作中,我們常常會(huì)用到需要周期性執(zhí)行的任務(wù),我們可以用Python直接實(shí)現(xiàn)這一功能。本文整理的是常見的Python定時(shí)任務(wù)的八種實(shí)現(xiàn)方式,需要的朋友可以參考一下2022-02-02python使用遞歸實(shí)現(xiàn)斐波那契數(shù)列的示例詳解
這篇文章主要給大家介紹了python使用遞歸實(shí)現(xiàn)斐波那契數(shù)列的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起來學(xué)習(xí)吧2024-01-01使用pytorch加載并讀取COCO數(shù)據(jù)集的詳細(xì)操作
這篇文章主要介紹了使用pytorch加載并讀取COCO數(shù)據(jù)集,基礎(chǔ)知識(shí)包括元祖、字典、數(shù)組,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05