比特幣定投日記第54天:EOS韭菜收割機原理

比特幣定投日記第54天:EOS韭菜收割機原理

昨天分享了一個別人的EOS套利方法,今天再來分享一個別人的『韭菜收割機』,更好玩。

小碼哥一直說,在botvs裡能挖到寶,不知道各位有沒有行動起來。

今天來讀一份別人的代碼,重點是分析原理,瞭解別人的思路。幣圈的機會很多,套利方法多種多樣,但萬變不離其宗,搞明白了本質的東西才是王道。

原文說明在:https://github.com/richox/okcoin-leeks-reaper

這是一個用Groovy寫的,在OKCoin比特幣交易平臺上的高頻交易機器人程序,從2016年6月策略基本定型,到2017年1月中旬,這個策略成功的把最初投入的6000塊錢刷到了250000。最後由於央行對比特幣實行高壓政策,各大平臺都停止了配資,並且開始徵收交易費,作者宣稱該策略實際上已經失效了,然後公開了代碼(小碼哥認為,同樣的思路應該還是有機會的)。

策略的分兩部分:

  1. 趨勢策略:在價格發生趨勢性的波動時,及時下單跟進,即俗話說的追漲殺跌

  1. 平衡策略:倉位偏離50%時,放出小單使倉位逐漸迴歸50%,防止趨勢末期的反轉造成回撤,即

    收益落袋,不吃魚尾

聽上去有些道理,接下來,我們一起讀代碼,看看到底是咋實現的。

botvs的老大Zero把策略移植成了js,可以直接回測,更方便,我們看這個版本。

https://www.botvs.com/strategy/34388

主函數,裡面就幹一件事情:LeeksReaper——"割韭菜"

function main() {

var reaper = LeeksReaper()

while (true) {

reaper.poll()

Sleep(TickInterval)

}

}

LeeksReaper對象有幾個方法,分別作用是:

updateTrades() //獲取最近的成交記錄

updateOrderBook() //更新當前的盤口(深度)數據

balanceAccount() //平衡,即上面說的,收益落袋,不吃魚尾

poll() //輪詢入口

然後我們再來看每個方法裡面都是怎麼實現的:

updateTrades() 裡面的實現比較簡單。

最近15條交易的價格,更新到數組self.prices裡:

if (self.prices.length == 0) {

while (trades.length == 0) {

trades = trades.concat(_C(exchange.GetTrades))

}

for (var i = 0; i < 15; i++) {

self.prices[i] = trades[trades.length - 1].Price

}

}

然後是交易量做了加權平滑,上次交易量權重70%,加上最近的交易量權重30%,這個權重不確定是怎麼定出來的,應該是經驗值。更新到self.vol裡:

self.vol = 0.7 * self.vol + 0.3 * _.reduce(trades, function(mem, trade) {

// Huobi not support trade.Id

if ((trade.Id > self.lastTradeId) || (trade.Id == 0 && trade.Time > self.lastTradeId)) {

self.lastTradeId = Math.max(trade.Id == 0 ? trade.Time : trade.Id, self.lastTradeId)

mem += trade.Amount

}

return mem

}, 0)

updateOrderBook() 裡面的邏輯也很簡單,就是把盤口數據在加到價格數組裡(後面用來判斷短期趨勢的),但是這幾個經驗參數都不確定來由,注:0.618是數學黃金分割。

self.bidPrice = orderBook.Bids[0].Price * 0.618 + orderBook.Asks[0].Price * 0.382 + 0.01

self.askPrice = orderBook.Bids[0].Price * 0.382 + orderBook.Asks[0].Price * 0.618 - 0.01

balanceAccount() 計算當前倉位,目標是50%,如果大於0.52,或小於0.48,就觸發平衡。下單也是網格下單,分3個價位的網格,每單交易0.01BTC,比如:

exchange.Buy(self.orderBook.Bids[0].Price + 0.00, 0.01)

exchange.Buy(self.orderBook.Bids[0].Price + 0.01, 0.01)

exchange.Buy(self.orderBook.Bids[0].Price + 0.02, 0.01)

下單完後,等BalanceTimeout的時間,取消所有未成交訂單,下次再平衡。這是通常的做法,不為當下過大的單向移動付出溢價,保證收益。小碼哥目前的自動定投也是用類似方式處理。

poll() 輪詢入口,這裡面是主要邏輯。

if (self.numTick > 2 && (

self.prices[self.prices.length-1] - _.max(self.prices.slice(-6, -1)) > burstPrice ||

self.prices[self.prices.length-1] - _.max(self.prices.slice(-6, -2)) > burstPrice && self.prices[self.prices.length-1] > self.prices[self.prices.length-2]

)) {

bull = true

tradeAmount = self.cny / self.bidPrice * 0.99

} else if (self.numTick > 2 && (

self.prices[self.prices.length-1] - _.min(self.prices.slice(-6, -1)) < -burstPrice ||

self.prices[self.prices.length-1] - _.min(self.prices.slice(-6, -2)) < -burstPrice && self.prices[self.prices.length-1] < self.prices[self.prices.length-2]

)) {

bear = true

tradeAmount = self.btc

}

這裡是割韭菜的重點,主要邏輯是根據近期的成交歷史,判斷當前是『牛』(bull)還是『熊』(bear),簡單的來說,就是判斷短期內的趨勢是『漲』還是『跌』,接下去就該『追漲殺跌』了。

所以,看明白策略的原理,就像昨天發的套利EOS的文章一樣,都是根據最近一段時間市場上交易的數據(趨勢、動能)來預測未來一段時間的漲跌,作為入市的依據。而韭菜收割機的退出策略更為謹慎,相當於用多次『香農網格』的平衡,完成退出,鎖定利潤。對於高頻策略來說,這是非常重要的,不是去搏一個大的勝利,而是滾雪球,用無數的小勝利加在一起,複利的效應是巨大的。

那麼分析完了原理,我們可以再反問一下,這樣的機會真的消失了嗎?交易所收取手續費,無非是大大抬高了高頻的成本。從理論上來說,對於一個數學期望為正的交易策略,賺錢的結論依然是成立的。只是代碼裡有非常多的經驗值參數,都是需要實踐中花費不少學費去摸索出來最優值(高頻策略的回測結果通常不具代表性,實盤很重要)。

這次的代碼解讀非常的粗略,因為小碼哥只想拋磚引玉。對於所有會寫代碼的技術同學,小碼哥強烈建議去讀botvs上別人共享出來的代碼,理解別人的思路,分析他們每行代碼背後想要解決的問題,或者遇到的坑。然後,我們可以一起討論,一起修改,一起躺賺比特幣。

比特幣定投日記第54天:EOS韭菜收割機原理


分享到:


相關文章: