這篇文章主要介紹了python怎么實(shí)現(xiàn)線性掛單流策略的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇python怎么實(shí)現(xiàn)線性掛單流策略文章都會(huì)有所收獲,下面我們一起來看看吧。
成都創(chuàng)新互聯(lián)公司主營宜陽網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App制作,宜陽h5微信小程序搭建,宜陽網(wǎng)站營銷推廣歡迎宜陽等地區(qū)企業(yè)咨詢
如何使用數(shù)據(jù)回放
數(shù)據(jù)回放功能可以不受交易所交易時(shí)間限制進(jìn)行訓(xùn)練,支持多種商品期貨和數(shù)字貨幣品種,行情可以手動(dòng)回放也可以自動(dòng)回放,也能自由設(shè)定歷史行情起止時(shí)間和回放速度。相對于其他軟件普遍采用K線數(shù)據(jù)回放方式,發(fā)明者量化采用Tick級別的數(shù)據(jù)回放方式,真實(shí)接近實(shí)盤交易的回測環(huán)境,重現(xiàn)盤口價(jià)量數(shù)據(jù),讓交易者身臨其境。
打開發(fā)明者量化的官網(wǎng)(fmz.com)注冊并登錄,然后點(diǎn)擊控制中心的數(shù)據(jù)探索,即可呈現(xiàn)數(shù)據(jù)回放功能頁面。其**有四個(gè)選項(xiàng)框和一個(gè)選擇按鈕,首先點(diǎn)擊選擇按鈕只顯示支持實(shí)盤回放的品種,其次在左上方選擇要回放的品種,然后在后面的兩個(gè)選項(xiàng)框中選擇數(shù)據(jù)的起止時(shí)間,接著選擇數(shù)據(jù)的時(shí)間周期為實(shí)盤回放,最后點(diǎn)擊最右邊的Go按鈕,即可開啟數(shù)據(jù)回放功能。
在數(shù)據(jù)標(biāo)簽下面一共分為三塊。左邊是交易歷史,這里按照時(shí)間順序展示了所有已經(jīng)成交的訂單。中間是買賣各20檔深度的盤口數(shù)據(jù)。右邊則是數(shù)據(jù)回放的控制區(qū)域,在這里可以選擇手動(dòng)和自動(dòng)數(shù)據(jù)回放方式,就像使用媒體播放器一樣簡單。
位置索引可以左右來回拖動(dòng)游標(biāo),可以快速的選擇數(shù)據(jù)回放的開始時(shí)間。
在最下方也可以通過右左移動(dòng)游標(biāo)控制數(shù)據(jù)的回放速度,以毫秒為時(shí)間單位,在數(shù)據(jù)回放時(shí)既能加速也能減速。
構(gòu)建策略邏輯
盡管影響價(jià)格漲跌的因素非常多,包括:全球經(jīng)濟(jì)環(huán)境、國家宏觀政策、相關(guān)產(chǎn)業(yè)政策、供需關(guān)系、國際事件、利率與匯率、通貨膨脹與緊縮、市場心理、未知因素等等,但最后盤面上的價(jià)格卻是多方與空方角逐后的結(jié)果。如果買的人多過賣的人,價(jià)格就會(huì)上漲;反之如果賣的人多過買的人,價(jià)格就會(huì)下跌。那么我們只需要分析價(jià)格,就可以做出一個(gè)交易策略。
通過發(fā)明者量化回放最近一個(gè)月幣安交易所的btc_usdt交易對,我們發(fā)現(xiàn)在行情大漲和大跌時(shí),Tick數(shù)據(jù)的訂單薄多空雙方的單量明顯不對稱。當(dāng)行情大漲時(shí)多頭的掛單量明顯大于空頭的掛單量;當(dāng)行情大跌時(shí)空頭的掛單量明顯小于多頭掛單量。那么我們是否可以根據(jù)訂單薄中的掛單量來預(yù)測短時(shí)間內(nèi)價(jià)格的漲跌呢?
答案是肯定的。
我們可以通過收集深度Tick數(shù)據(jù),計(jì)算多空雙方的掛單量并加以對比,如果多空綜合掛單量懸殊很大,就可能時(shí)潛在的買賣機(jī)會(huì)。比如當(dāng)多頭的掛單量是空頭掛單量的N倍時(shí),我們可以認(rèn)為市場上大部分人都看多,未來短時(shí)間內(nèi)價(jià)格上漲的概率就會(huì)增大;當(dāng)空頭的掛單量是多頭的N倍時(shí),我們可以認(rèn)為市場大部分人都看空,未來短時(shí)間內(nèi)價(jià)格下跌的概率就會(huì)增大。
編寫交易策略
按照以上策略邏輯,開始用代碼實(shí)現(xiàn)出來。依次打開:fmz.com網(wǎng)站 > 登錄 > 控制中心 > 策略庫 > 新建策略 > 點(diǎn)擊右上角下拉菜單選擇Python語言,開始編寫策略。本策略作為教學(xué)拋磚引玉,所以我盡量把策略寫的精簡一些,注意看下面代碼中的注釋。
第一步:編寫策略框架
# 策略主函數(shù) def onTick(): pass # 程序入口 def main(): while True: # 進(jìn)入無限循環(huán)模式 onTick() # 執(zhí)行策略主函數(shù) Sleep(1000) # 休眠1秒
我們編寫策略時(shí)應(yīng)該由大往小寫,就像蓋房子一樣,先蓋框架再蓋墻面。在這個(gè)框架中,我們使用了兩個(gè)函數(shù),分別是:main函數(shù)和onTick函數(shù)。其中main函數(shù)是程序的入口,也就是說程序會(huì)從這里執(zhí)行,然后進(jìn)入無限循環(huán)模式,重復(fù)執(zhí)行onTick函數(shù)。那么我們只需要把策略內(nèi)容寫到onTick函數(shù)中就可以了。
第二步:編寫全局變量
vol_ratio_arr = [] # 多空掛單比率數(shù)組 mp = 0 # 虛擬持倉
之所以定義vol_ratio_arr為全局變量,因?yàn)槲业牟呗孕枰占欢蜹ick數(shù)據(jù)的多空掛單比率,如果我們把vol_ratio_arr變量放到onTick函數(shù)中,隨著循環(huán)運(yùn)行顯然是不合理的,我們需要的是在循環(huán)模式中,當(dāng)達(dá)到某個(gè)條件時(shí)才改變變量的值,最合理的方法是把這個(gè)變量放到循環(huán)的外面。
持倉管理是非常有必要的,因?yàn)樗P(guān)系到買賣邏輯,一般情況下我們在現(xiàn)貨交易中,是通過獲取賬戶來計(jì)算持有的貨幣對。這里為了簡化代碼,直接定義一個(gè)全局虛擬持倉變量,來控制買賣邏輯。
第三步:計(jì)算當(dāng)前多空比率
depth = exchange.GetDepth() # 獲取深度數(shù)據(jù) asks = depth['Asks'] # 獲取賣價(jià)數(shù)組 bids = depth['Bids'] # 獲取買價(jià)數(shù)組 asks_vol = 0 # 所有賣價(jià)掛單 bids_vol = 0 # 所有買價(jià)掛單 for index, ask in enumerate(asks): # 遍歷賣價(jià)數(shù)組 # 線性計(jì)算所有賣價(jià)掛單 asks_vol = asks_vol + ask['Amount'] * (20 - index) for index, bid in enumerate(bids): # 遍歷買價(jià)數(shù)組 # 線性計(jì)算所有買價(jià)掛單 bids_vol = bids_vol + bid['Amount'] * (20 - index) bidask_ratio = bids_vol / asks_vol # 計(jì)算多空比率
眾所周知,數(shù)字貨幣通常是20檔的深度數(shù)據(jù),那么我們可以把多頭和空頭的掛單量累加起來就可以計(jì)算出多頭與空頭的比值,當(dāng)這個(gè)值大于1時(shí)說明看多的人大于看空的人,預(yù)示著未來短時(shí)間內(nèi)價(jià)格會(huì)上漲;當(dāng)這個(gè)值小于1時(shí)說明看空的人大于看多的人,預(yù)示著未來短時(shí)間內(nèi)價(jià)格會(huì)下跌。
但有一點(diǎn)是需要加以區(qū)分的,當(dāng)掛單距離盤口越近,就說明看多或看空的意愿更強(qiáng)烈,比如掛在一檔的買單肯定比掛在20檔的買單看多意愿更強(qiáng)烈。因此我們在累加掛單時(shí),需要用線性的方式把20檔的掛單分別給與不同的權(quán)重,這樣會(huì)更加合理。
第四步:線性計(jì)算一段時(shí)間內(nèi)的多空比率
global vol_ratio_arr, mp # 引入全局變量 vol_ratio_arr.insert(0, bidask_ratio) # 把多空比率放到全局變量數(shù)組里面 if len(vol_ratio_arr) > 20: # 如果數(shù)組超過指定長度 vol_ratio_arr.pop() # 刪除最舊的元素 all_ratio = 0 # 臨時(shí)變量,所有多空掛單比率 all_num = 0 # 臨時(shí)變量,所有線性乘數(shù) for index, vol_ratio in enumerate(vol_ratio_arr): # 變量全局變量數(shù)組 num = 20 - index # 線性乘數(shù) all_num = all_num + num # 線性乘數(shù)累加 all_ratio = all_ratio + vol_ratio * num # 所有多空掛單比率累加 ratio = all_ratio / all_num # 線性多空掛單比率
把多頭累加掛單除以空頭累加掛單就可以得到多空比值,但這僅僅時(shí)一個(gè)Tick的數(shù)據(jù),如果只用一個(gè)Tick數(shù)據(jù),來決定買賣交易可能不是一個(gè)明智選擇,因?yàn)樵谒蚕⑷f變的行情中,一個(gè)Tick數(shù)據(jù)是沒有說服力的。所以我們就需要收集一段固定的Tick數(shù)據(jù),最后再通過線性計(jì)算出一個(gè)公允的數(shù)值。
第五步:下單交易
last_ask_price = asks[0]['Price'] # 最新賣一價(jià),用于買入的價(jià)格 last_bid_price = bids[0]['Price'] # 最新買一價(jià),用于賣出的價(jià)格 if mp == 0 and ratio > buy_threshold: # 如果當(dāng)前無持幣,并且比率大于指定值 exchange.Buy(last_ask_price, 0.01) # 買入 mp = 1 # 設(shè)置虛擬持倉的值 if mp == 1 and ratio < sell_threshold: # 如果當(dāng)前持幣,并且比率小于指定值 exchange.Sell(last_bid_price, 0.01) # 賣出 mp = 0 # 重置虛擬持倉的值
因?yàn)樵谙聠螘r(shí)需要指定一個(gè)價(jià)格,所以我們在買入的時(shí)候,可以直接使用最新的賣一價(jià);在賣出的時(shí)候,可以直接使用最新的買一價(jià)。最后在下單交易完畢,重置設(shè)置虛擬持倉的值。
關(guān)于“python怎么實(shí)現(xiàn)線性掛單流策略”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“python怎么實(shí)現(xiàn)線性掛單流策略”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。