python數字貨幣量化交易開發——建立回測系統(一)

心虛的時候要微笑發表於2020-12-09

前言

本部落格主要用於記錄個人在數字貨幣量化中的一些真實經歷,主要用到的語言是python,非程式設計師出身,任何交流或者合作邀約(包括但不限於代做演算法或者交易)可直接私信或在下方評論,我會認真回覆的。

之所以重新做這樣一個記錄,是因為近年有過主動和一些拍腦門的演算法交易經歷,結果並不理想,本次重新入場,決定做一個絕對理性的trader,一切以絕對盈利為目的,大量資料回測為根據,寫本部落格的目的之一也是監督自己。
_
_

Episode 1. 個人ohlvc資料儲存探索

其實目前國內有很多網站是支援回測的,但在經過簡單學習後,發現在使用一些回測平臺時,如FMZ會遇到一些奇奇怪怪的bug,比如設定好了近半年的回測,會卡在某一天進行不下去,和個人程式設計不同,線上debug困難重重,於是毅然決然地決定開發自己的回測系統。

於是就遇到了第一個問題,個人比較青睞的1min、5min為單位的歷史柱狀圖,目前交易所普遍能夠調取的柱狀圖數量在1000-3000條這樣一個上限,顯然用於回測是不夠的。

所以要做的第一件事當然是解決問題~
搜尋各類交易所無果,於是思路迴轉——從今天開始向交易所調資料 慢慢建立自己的價格資料庫。
以csv格式儲存,30天為資料上限:

import time
import ccxt
import pandas as pd

symbol_list=[
	'ETH/USDT',
	'BTC/USDT',
	]           #只做最大的兩個交易品種ETH&BTC
exchange_id = 'huobipro'
exchange_class = getattr(ccxt, exchange_id)
exchange = exchange_class({
    'timeout': 30000,
    'enableRateLimit': True,
})

for symbol in symbol_list:
	ohlcv_dict={}
	b=pd.read_csv('str(symbol[0:3])+'_30d.csv')
	ohlcv_dict=b.to_dict ('list')
	recent_ohlcv=exchange.fetch_ohlcv (symbol, '1m')
	for i in recent_ohlcv:
		i[0]= time.strftime('%Y%m%d_%H:%M:%S',time.localtime(int(i[0])/1000))
		ohlcv_dict[i[0]]=i
		del(ohlcv_dict[i[0]][0])
	records=len(ohlcv_dict)
	d30_dict =ohlcv_dict.copy()
	if records > 43200:       #對超出30天的多餘資料作刪減
		count=0
		for key in ohlcv_dict.keys():
			del d30_dict[key]
			count +=1
			if n>=records-43200:
				break
	save_ohlcv=pd.DataFrame(d30_dict)
	save_ohlcv.to_csv('str(symbol[0:3])+'_30d.csv',mode='w',index=None)
	print('save '+str(symbol)+' csv success!!!')
	time.sleep(1)
	print('--------------------------------')

而目前火幣我設定的fetch limit是它們交易所的調取上限2000條,粗略算了一下只要每天開啟一次併成功執行,資料庫就能自動更新並積累,之後要用的時候也是以時間為key的字典方式的儲存與呼叫。

到這裡為止,其實簡單的個人資料儲存就完成了,隨著時間的積累,在之後完成的回測邏輯的準確度也會上升,現在想想還挺美滋滋的,非常飄,隨即便開始著手回測邏輯的。

今天先更到這裡。

相關文章