2019年7月5日 星期五

tick data 轉換成 k Bar

轉換tick資料成 k bar,做個記錄
有筆 tick csv 資料如下
TX00Ticks.csv
Name,nPtr,nDate,nTimehms,nTimemillismicros,nBid,nAsk,nClose,nQty
TX00,119,20190624,150000,17000,10621.0,10623.0,10622.0,36
TX00,120,20190624,150000,38000,10621.0,10622.0,10621.0,2
TX00,121,20190624,150000,167000,10620.0,10622.0,10622.0,1
TX00,122,20190624,150000,199000,10620.0,10621.0,10620.0,1
TX00,123,20190624,150000,205000,10620.0,10621.0,10620.0,1
TX00,124,20190624,150000,304000,10620.0,10621.0,10620.0,1
TX00,125,20190624,150000,321000,10620.0,10621.0,10621.0,2

pandas
要對一排一排的 row 做處理的話,apply 要設定 axis=1

ref: pandas apply 的使用
http://jonathansoma.com/lede/foundations/classes/pandas%20columns%20and%20functions/apply-a-function-to-every-row-in-a-pandas-dataframe/

#斬大寫得更簡單!! https://ithelp.ithome.com.tw/articles/10223693



 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
import pandas as pd
from datetime import datetime

tick=pd.read_csv('TX00Ticks.csv')

#將三個column 的時間 轉成文字合併後,再用 datetime 轉成 datetime格式
def toDatetime(row):    
    t=str(row['nDate']) + ' ' + str(row['nTimehms']).zfill(6) + ' ' + str(row['nTimemillismicros'])
    return datetime.strptime(t, '%Y%m%d %H%M%S %f')

tick.index=tick.apply(toDatetime, axis=1)

tx1k=pd.DataFrame()
# 開 高 低 收 量
# T 是分鐘, 5分K就用 5T
tx1k['Open']=tick['nClose'].resample('T', label='right').first()
tx1k['High']=tick['nClose'].resample('T', label='right').max()
tx1k['Low']=tick['nClose'].resample('T', label='right').min()
tx1k['Close']=tick['nClose'].resample('T', label='right').last()
tx1k['Volume']=tick['nQty'].resample('T', label='right').sum()

2 則留言:

  1. 您好,我使用OnNotifyTicks取得及時tick值回傳
    我想要將每筆tick值在class Events中的def OnNotifyTicks使用字典格式記錄到list內
    如list.append(tick)
    雖然每次tick都會更新成最新的資訊
    不過存入list每筆資料都會被更新成最新的data,因此無法比較現在資料與前幾筆資料的數值
    list預期印出結果為tick1, tick2, tick3
    但實際上會變成tick3, tick3, tick3,有新的事件觸發list就會變成tick4,tick4,tick4,tick4
    資料都會全部被覆蓋成最新的tick
    想請問您是如何將即時報價tick存取出來的?
    P.S若使用OnNotifyHistoryTicks他僅會更新一次,因此可以正常存取所有tick值
    目前還是python新手,遇到此問題很苦惱,不知道哪裡理解有誤

    回覆刪除
  2. ㄟ都 這有些複雜... 看起來是你資料存入字典的list 的用法有誤,如果單純用list 的append 應該不會被覆蓋
    ticklist=[]
    def OnNotify():
    ticklist.append(tickdata)

    我目前策略其實沒有每分每秒需要使用到tick 資料耶,目前操作就是收集資料,等時間到做一次策略判讀,然後下單。

    你的需求有很多做法,我曾經嘗試過塞到 pandas 的 dataframe, 然後用時間當 index,就可以比對特定時間內的數值,這種電腦要好一點,不然跑起來有點慢。

    另一種就是用多用幾個 list 或 numpy array,來暫存前幾筆資料,這個比較輕巧,但要花點心思建立你的資料結構,

    有本書Python:期貨演算法交易實務121個關鍵技巧詳解,也有些處理資料的方法可以參考,可以去書店翻看看,但他是接自家報價系統,所以操作跟群益API有點差距




    回覆刪除