比特幣定投日記第54天:EOS韭菜收割機原理
昨天分享了一個別人的EOS套利方法,今天再來分享一個別人的『韭菜收割機』,更好玩。
小碼哥一直說,在botvs裡能挖到寶,不知道各位有沒有行動起來。
今天來讀一份別人的代碼,重點是分析原理,瞭解別人的思路。幣圈的機會很多,套利方法多種多樣,但萬變不離其宗,搞明白了本質的東西才是王道。
原文說明在:https://github.com/richox/okcoin-leeks-reaper
這是一個用Groovy寫的,在OKCoin比特幣交易平臺上的高頻交易機器人程序,從2016年6月策略基本定型,到2017年1月中旬,這個策略成功的把最初投入的6000塊錢刷到了250000。最後由於央行對比特幣實行高壓政策,各大平臺都停止了配資,並且開始徵收交易費,作者宣稱該策略實際上已經失效了,然後公開了代碼(小碼哥認為,同樣的思路應該還是有機會的)。
策略的分兩部分:
趨勢策略:在價格發生趨勢性的波動時,及時下單跟進,即俗話說的追漲殺跌。
平衡策略:倉位偏離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上別人共享出來的代碼,理解別人的思路,分析他們每行代碼背後想要解決的問題,或者遇到的坑。然後,我們可以一起討論,一起修改,一起躺賺比特幣。
閱讀更多 比特幣定投日記 的文章