歡迎你們訂閱《Python實戰-構建基於股票的量化交易系統》小冊子,小冊子會陸續推出與小冊內容相關的專欄文章,對涉及到的知識點進行更全面的擴展介紹。本篇專欄爲小冊子內容的加推篇!!!bash
在小冊子中咱們主要針對於股票日線級別的行情數據,介紹了一些獲取和處理的方法,其實最原始的數據是交易明細數據,行情軟件的各類週期和統計的數據都是經過明細數據跨週期轉換而造成的,好比分鐘K線、小時K線、當日成交量、成交額、外盤、內盤等各類指標。 本節咱們主要介紹如何解讀和獲取股票交易明細數據,以及處理和轉換交易明細數據的方法。微信
此處咱們從免費行情軟件中截取了某股2020年1月23日的成交明細數據,咱們看到成交明細中有時間、價格、現量和筆數四列數據,以下圖所示:函數
因爲是免費行情軟件,此處「成交明細」數據是以3-6秒間隔去記錄的(不一樣軟件可能有差別),表示在這個時間撮合的多筆單子的總和,所以確切地說是「分時成交」數據,即依據時間段爲單位統計的結果,筆數這欄表示的是在這個週期內總共成交了幾筆。ui
這不一樣於「逐筆成交」的數據,「逐筆成交」數據記錄的是每一筆成交的明細,這個屬於行情軟件收費範疇的功能。好比像如下這樣的數據,如圖所示:spa
再來看下現量這欄,現量指的是當前分時的成交量,以手爲單位。其中有三種顏色,分別是紅色、綠色和白色。紅色表明主動買單,綠色表明主動賣單,這部分與「五檔買賣明細」相關,以下圖所示:3d
咱們知道交易所成交的規則爲「價格優先、時間優先」,掛單價比現價高就會優先成交,所以主動買單,指的是以委賣的價格成交,即以買賣檔位窗口中「賣一」及以上的價格成交。主動賣單跟主動買單恰好相反,以「買一」及如下的價格成交,掛的賣單價格比現價低就會優先成交。code
從內外盤能夠看出委買委賣的狀況,即外盤表明主動買盤的集合,內盤表明主動賣盤的集合。cdn
固然,白色也比較好理解了,即指的是主動買單和主動賣單相等的狀況。blog
此處咱們採用tushare庫get_tick_data()接口來獲取個股以往交易歷史的分筆數據明細。好比咱們獲取'002372'該股'2020-01-23'當天的歷史數據,以下所示:索引
# 獲取個股以往交易歷史的分筆數據明細
df_tick = ts.get_tick_data('002372',date='2020-01-23',src='tt')
print(df_tick[2000:2010])
""" time price change volume amount type 2000 13:37:16 12.39 -0.01 126 156114 賣盤 2001 13:37:19 12.38 -0.01 1 1238 賣盤 2002 13:37:25 12.38 0.00 39 48322 賣盤 2003 13:37:28 12.39 0.01 25 30953 買盤 2004 13:37:37 12.38 -0.01 2 2476 中性盤 2005 13:37:40 12.36 -0.02 14 17345 賣盤 2006 13:37:43 12.40 0.04 1 1240 買盤 2007 13:37:46 12.40 0.00 1 1240 買盤 2008 13:37:49 12.40 0.00 63 77978 買盤 2009 13:37:58 12.39 -0.01 1 1239 買盤 """
複製代碼
返回值中time時間、price成交價格、change價格變更、volume成交手、amount成交金額(元)、type買賣類型【買盤、賣盤、中性盤】。咱們驗證該數據與行情軟件的成交明細數據穩和。以下圖所示:
而後咱們採用小冊子《差別化分析經常使用股票交易數據接口》一節的方法將分筆數據的行索引轉換爲時間序列,轉換後數據以下所示:
""" price change volume amount type time 2020-02-01 13:37:16 12.39 -0.01 126 156114 賣盤 2020-02-01 13:37:19 12.38 -0.01 1 1238 賣盤 2020-02-01 13:37:25 12.38 0.00 39 48322 賣盤 2020-02-01 13:37:28 12.39 0.01 25 30953 買盤 2020-02-01 13:37:37 12.38 -0.01 2 2476 中性盤 2020-02-01 13:37:40 12.36 -0.02 14 17345 賣盤 2020-02-01 13:37:43 12.40 0.04 1 1240 買盤 2020-02-01 13:37:46 12.40 0.00 1 1240 買盤 2020-02-01 13:37:49 12.40 0.00 63 77978 買盤 2020-02-01 13:37:58 12.39 -0.01 1 1239 買盤 """
複製代碼
Pandas中提供了resample()方法對時間序列進行重採樣,此處將獲取到的tick數據合成一分鐘數據。關鍵代碼以下所示:
df_min_ohlc = df_tick.price.resample('1min', closed='left', label='left').ohlc()
""" open high low close time 2020-02-01 09:25:00 12.78 12.78 12.78 12.78 2020-02-01 09:26:00 NaN NaN NaN NaN 2020-02-01 09:27:00 NaN NaN NaN NaN 2020-02-01 09:28:00 NaN NaN NaN NaN 2020-02-01 09:29:00 NaN NaN NaN NaN 2020-02-01 09:30:00 12.76 12.76 12.61 12.66 2020-02-01 09:31:00 12.66 12.66 12.64 12.64 2020-02-01 09:32:00 12.64 12.64 12.59 12.59 2020-02-01 09:33:00 12.63 12.68 12.61 12.67 2020-02-01 09:34:00 12.68 12.70 12.68 12.69 """
複製代碼
然後咱們將df_min_ohlc數據進行清洗,最終獲得的數據以下所示:
""" open high low close time 2020-02-01 09:25:00 12.78 12.78 12.78 12.78 2020-02-01 09:30:00 12.76 12.76 12.61 12.66 2020-02-01 09:31:00 12.66 12.66 12.64 12.64 2020-02-01 09:32:00 12.64 12.64 12.59 12.59 2020-02-01 09:33:00 12.63 12.68 12.61 12.67 """
複製代碼
接下來就能夠用小冊子《股票數據可視化:自定義Matplotlib版股票行情界面》的代碼繪製1min K線圖,以下圖所示:
完整代碼可參考小冊子《加推篇!股票分時明細數據的處理與轉換》。
接下來咱們經過分時明細數據粗略地估計下該股流入和流出的資金狀況。
成交額的計算爲價格*成交量,不過get_tick_data()接口返回的數據已經包含了成交額數據,確實方便了很多。咱們把當天全部分時的成交額累計後獲得整一天的成交額爲9856.02萬,代碼以下所示:
# 當天的成交額
print(df_tick.amount.sum())
複製代碼
計算資金流入和流出可使用Pandas的groupby方法。咱們先大體瞭解下groupby的整個過程。groupby其實能夠分爲拆分、應用、合併三個過程。拆分指的是根據某個規則把數據集分組,應用指的是對每一組數據進行統計操做,好比取平均、求和或者是自定義函數,最後是合併過程,合併是把操做後的結果從新聚合起來,造成另外一個DataFrame數據或者Series數據。
計算資金流入和流出的代碼以下所示:
print(df_tick["amount"].groupby(df_tick["type"]).sum())
""" type 中性盤 2110576 買盤 36741662 賣盤 59707926 Name: amount, dtype: int64 """
複製代碼
對於主力資金的流入和流出的計算,主要是經過資金量的大小去篩選,由於成交一筆較大大成交量的單子是須要相應大小資金,每每認爲這筆成交是由機構或者大戶完成的,也就是所謂的主力。
所以咱們能夠設置主力交易成交額閾值便可,當天全部大於該閾值的買盤的總成交額,即爲主力資金流入,當天全部大於該閾值的賣盤的總成交額,即爲主力資金流出。代碼以下所示:
print(df_tick[df_tick["amount"]>threshold].amount.groupby(df_tick["type"]).sum())
""" type 中性盤 1119753 買盤 14042952 賣盤 33459052 Name: amount, dtype: int64 """
複製代碼
關於大單交易,這次再補充一點。get_sina_dd()接口可獲取大單交易數據,默認爲大於等於400手,也可經過vol參數指定返回具體成交量的交易數據,以下所示:
# 獲取大單交易數據,默認爲大於等於400手,數據來源於新浪財經。
data=ts.get_sina_dd('600797',date = '2019-08-08')
print(data.head(10))
""" code name time price volume preprice type 0 600797 浙大網新 15:00:00 8.01 253542 8.01 買盤 1 600797 浙大網新 14:56:18 8.01 45700 8.01 賣盤 2 600797 浙大網新 14:54:39 8.01 116400 8.01 買盤 3 600797 浙大網新 14:18:18 8.00 50000 8.00 買盤 4 600797 浙大網新 13:35:57 8.02 53100 8.01 賣盤 5 600797 浙大網新 13:33:57 8.03 42200 8.03 買盤 6 600797 浙大網新 13:25:18 8.01 64100 8.01 買盤 7 600797 浙大網新 13:25:15 8.01 41800 8.01 買盤 8 600797 浙大網新 13:22:57 8.04 135500 8.03 買盤 9 600797 浙大網新 13:22:00 8.01 44600 8.01 買盤 """
複製代碼
這裏要說明下,若是要更精確的統計流入流出的資金狀況,可採用分時逐筆成交數據去計算。
確切地說即便使用「逐筆成交」數據也只能做爲尋找主力行蹤的一項參考指標,這是由於「逐筆成交」是以實際成交對手盤中買賣雙方較小投注量爲單位統計的結果。這個咱們能夠做爲一個話題放在小冊子的話題討論中,歡迎你們多多參與討論!
另外,根據以往的經驗來看,咱們在成交明細裏面識別大單以及超級大單時,能夠留意具備規律性的單子,一般這些單子是用自動交易軟件批量下單的,把一個大單轉化大爲各類小單,只有大資金纔會去使用。看到這樣的單子,能夠做爲判斷有大資金進場的一個信號。
本小節咱們理解了行情軟件上分時明細數據的含義,以及掌握瞭如何處理和轉換這些數據的方法,這有助於咱們更靈活地去提取和挖掘咱們所需的行情信息。
更多的量化交易內容歡迎你們訂閱小冊閱讀!!同時也歡迎你們關注個人微信公衆號【元宵大師帶你用Python量化交易】瞭解更多Python量化交易相關內容