本方法以數(shù)字貨幣為落地標(biāo)的,股市、基金以此類推。
任何資本市場(chǎng)都伴隨著震蕩和波動(dòng),類似于潮起潮落,潮起潮落后會(huì)留下能,而震蕩前后可以留下利潤(rùn),困難的地方在于什么時(shí)候是潮起,什么時(shí)候是潮落,真實(shí)的潮水分辨較為簡(jiǎn)單,能夠看到低點(diǎn)和高點(diǎn),但是低點(diǎn)和高點(diǎn)是相對(duì)與潮整體來(lái)說(shuō)的,或者說(shuō)整個(gè)潮水波浪面的中界面,如果高于這個(gè)中界面為潮起,低于這個(gè)中界面為潮落。對(duì)于數(shù)字貨幣來(lái)說(shuō),關(guān)鍵是在找到中界面。
潮向上動(dòng)時(shí)會(huì)升,潮向下動(dòng)時(shí)會(huì)降,我們需要在潮向上的時(shí)候買(mǎi),在潮向下的時(shí)候賣(mài)。具體的思路為:每個(gè)時(shí)間整點(diǎn)收集比特幣的價(jià)格,當(dāng)當(dāng)前價(jià)格超過(guò)前五個(gè)時(shí)間點(diǎn)的價(jià)格時(shí),我們認(rèn)為現(xiàn)在處于潮水向上涌階段,進(jìn)入上升通道,買(mǎi);當(dāng)當(dāng)前價(jià)格低于前五個(gè)時(shí)間點(diǎn)的價(jià)格時(shí),我們認(rèn)為現(xiàn)在處于潮水向下泄階段,進(jìn)入下降通道,賣(mài)。
接下來(lái)開(kāi)始代碼學(xué)習(xí)階段,是的,很枯燥,很無(wú)聊,我也是,但是要堅(jiān)持,不然就只能拿著方法吹牛,而不能拿著方法賺錢(qián)。
PARAMS = {
? ? ? ? ? ? ? ? ? ? ? ?"start_time": "2017-06-01 00:00:00", ? ? ? ? ?# 回測(cè)起始時(shí)間
? ? ? ? ? ? ? ? ? ? ? ?"end_time": "2017-07-01 00:00:00", ? ? ? ? ?# 回測(cè)結(jié)束時(shí)間
? ? ? ? ? ? ? ? ? ? ? ?"commission": 0.002, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 此處設(shè)置交易傭金
? ? ? ? ? ? ? ? ? ? ? "slippage": 0.001, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 此處設(shè)置交易滑點(diǎn)
? ? ? ? ? ? ? ? ? ? ? "account_initial": {"xxx_cny_cash": 10000,"xxx_cny_btc": 0}, ? ?#xxx平臺(tái)的賬戶初始情況,初始人民幣為10000,初始比特幣為0。
}
以上為定義部分,基本上就是進(jìn)行回測(cè)的起始時(shí)間、結(jié)束時(shí)間、交易傭金、滑點(diǎn)和賬戶初始情況,接下來(lái)我們需要對(duì)市場(chǎng)數(shù)據(jù)進(jìn)行讀取,具體程序如下所示:
def initialize(context): ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #定義初始函數(shù)
? ? ? ? ? ? ? ? ? ? context.frequency = "30m" ? ? ? ? ? ? ? ? ? ? ?# 以30分頻率進(jìn)行回測(cè)
? ? ? ? ? ? ? ? ? ? context.benchmark = "xxx_cny_btc" ? ? ?# 用于計(jì)算xxx平臺(tái)上的收益
? ? ? ? ? ? ? ? ? ? context.security = "xxx_cny_btc" ? ? ? ? ? ?# 策略指定xxx平臺(tái)上的的交易品種
接下來(lái)為策略的執(zhí)行函數(shù),最關(guān)鍵、最難也是最枯燥的部分。
def handle_data(context):
? ? ? ? ? ? ? hist = context.data.get_price(context.security, count=5, frequency=context.frequency) ? ? ? # context.data.get_price()為獲取最近歷史價(jià)格的函數(shù),context.security為獲取的對(duì)象,count為獲取的數(shù)量,frequency為數(shù)據(jù)調(diào)用的頻率。本句意思為獲取最近5個(gè)頻率周期的歷史數(shù)據(jù)
ma = hist["close"].rolling(window=5).mean()[-1] ? ? ? ? ? ? ? # 計(jì)算最近5個(gè)收盤(pán)價(jià)的均價(jià),這個(gè)函數(shù)可能比較難以理解,查閱半天也沒(méi)有得到一個(gè)比較好的答案,hist["close"]我猜是hist得到一個(gè)數(shù)字序列,close的意思是從頭讀到尾,rooling_mean是計(jì)算窗口的平均值,5代表五個(gè)窗口,也就是五個(gè)數(shù)字。[-1]不知道啥意思。
current_price = context.data.get_current_price(context.security) ?# 獲取當(dāng)前價(jià)格
if current_price > ma and context.account.xxx_cny_cash >= XXX_CNY_BTC_MIN_ORDER_CASH_AMOUNT: # 當(dāng)前價(jià)格大于均價(jià)時(shí),全倉(cāng)買(mǎi)入
context.order.buy(context.security, cash_amount=str(context.account.huobi_cny_cash))
elif current_price < ma and context.account.huobi_cny_btc >= XXX_CNY_BTC_MIN_ORDER_QUANTITY: # 當(dāng)前價(jià)格小于均價(jià)時(shí),全倉(cāng)賣(mài)出
context.order.sell(context.security, quantity=str(context.account.xxx_cny_btc))
而買(mǎi)賣(mài)的效果如何呢,具體如下圖所示:

由此可見(jiàn),量化很難學(xué),量化的效果也并不如我們想象中的那么顯著,但是好在較為穩(wěn)健,量化是一種較好的投資方法。