backtrader日誌 日曆及resample

2022-10-09 21:03:19 字數 2944 閱讀 1068

本文摘自

日誌功能

可以通過下面的**在backtrader中新增日誌功能:

cerebro.addwriter(bt.writerfile, out = 'log.csv', csv = true)

1日誌資訊將被輸出到工作目錄下的log.csv檔案中,輸出內容包括:

種子資料(data feeds)

策略資料(lines和引數)

指標和觀察者(observer)資料(lines和引數)

分析資料(引數和分析結果資料)

交易日曆

交易日曆適用於以下場景:

由日線資料resample得到週線資料時,使用交易日曆可以準確識別每週的最後1根日線。

在策略的next()方法中列印一下內容

在輸出的每一行中,第乙個日期為策略所使用的日期,第二個日期為當前日線的日期,第三個日期為當前月線的日期。

其中,第3行1月4日為星期五,應該出現第一根週線資料,但是輸出結果中卻沒有週線資料。第8行1月11日為周五,從1月7日至1月11日的5根日線可以合成1根週線,後面的週線資料也應該更新為1月11日,但是輸出結果卻是1月4日。

產生以上結果的原因是,backtrader把2023年1月1日當作了交易日,只是沒有讀入資料。這樣1月1日至4日,再加上7日共計5根日線,就在1月7日合成了第一根週線;同樣1月8日至11日,再加上14日共計5根日線,在1月14日合成了第二根週線。這顯然不是想要的結果。

解決上述問題的方案是,通過繼承bt.tradingcalendar定義新的日曆,然後在日曆中設定節假日。如以下**所示,將2023年1月1日新增到holidays列表中,然後在cerebro新增該日曆:

class astockcalendar(bt.tradingcalendar):

params = dict(

holidays=[

datetime.date(2019, 1, 1),

],open=datetime.time(9, 30),

close=datetime.time(15, 0),

)cerebro.addcalendar(astockcalendar())

當使用交易日歷時可以看到,在1月4日(星期五)合成了第一根週線,在1月11日(星期五)合成了第二根週線,得到了正確的結果。

同樣,可以把2023年的其他節假日都新增到holidays列表中,來實現整年的週線資料的正確合成。

日內分時資料resample合成日線資料時,使用交易日曆處理提前**的情況。

美股在感恩節後的第一天,會在下午1點休市,這樣如果不做處理,使用分鐘資料合成日線資料時就會出問題,可以通過新增以下日曆來解決:

class customcalendar(bt.tradingcalendar):

params = dict(

holidays=[

datetime.date(2016, 1, 1),

datetime.date(2016, 1, 18),

datetime.date(2016, 2, 15),

datetime.date(2016, 3, 25),

datetime.date(2016, 5, 30),

datetime.date(2016, 7, 4),

datetime.date(2016, 9, 5),

datetime.date(2016, 11, 24),

datetime.date(2016, 12, 26),

],earlydays=[

(datetime.date(2016, 11, 25),

datetime.time(9, 30), datetime.time(13, ,0))

],open=datetime.time(9, 30),

close=datetime.time(16, 0),

)以2023年為例,日曆中設定了2023年的節假日,一般每日交易時間為9:30至16:00,11月25日的交易時間為9:30至13:00。

resample**

data = load_data(stk_code, fromdate, todate, '30')

cerebro.adddata(data, name = stk_code + '_30m')

cerebro.resampledata(data, name = stk_code + '_30to60m', timeframe = bt.timeframe.minutes, compression = 60)

data = load_data(stk_code, fromdate, todate, '60')

cerebro.adddata(data, name = stk_code + '_60m'

以載入2023年6月1日至4日平安銀行的資料為例,使用日誌功能將結果輸出至log.csv中,部分結果如下:

標黃的d、l、t列分別表示載入的30分鐘時間標籤資料、由30分鐘資料合成的60分鐘時間標籤資料、載入的60分鐘時間標籤資料。

對比d列和t列可以發現,在載入的60分鐘資料中,6月1日首個時間點(10:00)資料為空,在時間點10:30出現第乙個資料。在d列時間標籤變為11:00時,t列時間標籤仍為10:30。在d列時間標籤變為11:30時,t列時間標籤才變為11:30。這樣就保證了,在同時載入多個週期資料進行回測時,不會發生使用未來資料的情況。

對比d列和l列發現,resample結果未按預期得到10:30、11:30、14:00、15:00四個時段的60分鐘資料,而是得到10:00、11:00、12:00、14:00、15:00五個整點時間段的資料。筆者嘗試了調整函式resampledata()的bar2edge、rightedge、adjbartime、boundoff引數,也嘗試了使用交易日曆功能設定每日交易起止時間,均未能實現預期的resample結果。目前的解決方案是,在合成分鐘級資料時,不使用backtrader的resampledata()函式,而是先離線合成所需週期的資料,然後使用cerebro.adddata()載入合成的資料,再進行多週期策略的回測。

docker日誌 及 docker容器日誌

docker容器的日誌是預設存在本地的 var lib docker containers container id container id json.log 裡。可以用以下命令查log檔案的位置 docker inspect container id grep log 或 docker insp...

nginx日誌模組及日誌定時切割

ngx http log module 定義日誌格式,並且以指定的格式儲存。句法 access log path format buffer size gzip level flush time if condition access log off 預設 access log logs acces...

mysql刪除binlog日誌及日誌恢復資料的方法

基本上大家裝mysql,都會開啟binlog功能,開啟這個功能的好處是,日後方便恢復資料,而壞處是日誌檔案增長速度快,很快佔會佔滿磁碟空間,所以我們要定期或手工來刪除過大的日誌檔案。刪除日誌檔案的方法大概有如下幾中 一 設定日誌保留時長expire logs days自動刪除 檢視當前日誌儲存天數 ...