国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

使用TA-Lib在vn.trader上開(kāi)發(fā)CTA交易策略

2019-11-10 21:06:37
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

TA-Lib簡(jiǎn)介 作為一套被業(yè)界廣泛應(yīng)用的開(kāi)源技術(shù)分析庫(kù)(包含技術(shù)指標(biāo)計(jì)算和K線(xiàn)模式識(shí)別等),TA-Lib自2001年發(fā)布以來(lái)已經(jīng)有了十多年的歷史。TA-Lib中一共包含大約125個(gè)技術(shù)指標(biāo)的計(jì)算函數(shù),同時(shí)提供了包括C/C++、java、Perl、Python等多種語(yǔ)言的API。

有什么用 簡(jiǎn)單來(lái)說(shuō)TA-Lib就是提供了一堆經(jīng)過(guò)長(zhǎng)期實(shí)踐檢驗(yàn)的技術(shù)指標(biāo)計(jì)算函數(shù)。基于現(xiàn)成的計(jì)算函數(shù),開(kāi)發(fā)新策略雛形、快速驗(yàn)證某個(gè)靈感的時(shí)間可以大幅縮短,否則想象一下每開(kāi)發(fā)個(gè)策略都要自己實(shí)現(xiàn)要用的技術(shù)指標(biāo),未免太浪費(fèi)時(shí)間。

但是除此以外,TA-Lib還可以有一些其他的用法,舉兩個(gè)例子。

百科全書(shū)

堅(jiān)持每天收盤(pán)后選一個(gè)自己沒(méi)用過(guò)的指標(biāo),輸入數(shù)據(jù),畫(huà)個(gè)圖、跑個(gè)回測(cè),開(kāi)發(fā)量化策略很很多其他的技術(shù)一樣都是熟能生巧。

另外,所有的技術(shù)指標(biāo)在被開(kāi)發(fā)出來(lái)的時(shí)候,背后都有一定的金融邏輯原理(行為金融學(xué))的支撐,生搬硬套固然不可取,但是放著前人經(jīng)驗(yàn)完全不看,整天憑自己的空想就弄個(gè)機(jī)器學(xué)習(xí)算法在數(shù)據(jù)上瞎折騰豈不是更浪費(fèi)時(shí)間?

Alpha庫(kù)

很大一部分CTA類(lèi)的策略可以總結(jié)為幾個(gè)簡(jiǎn)單的邏輯框架,比如趨勢(shì)策略通常可以分解成以下部分:趨勢(shì)信號(hào)(通常是基于某幾個(gè)參數(shù)計(jì)算出來(lái)的指標(biāo)值超過(guò)某個(gè)閾值)、信號(hào)過(guò)濾(和趨勢(shì)信號(hào)類(lèi)似)、出場(chǎng)方案(固定點(diǎn)數(shù)/百分比的止盈和止損,移動(dòng)止損)。

因此把邏輯框架的代碼搭好后,就可以通過(guò)機(jī)器學(xué)習(xí)算法來(lái)實(shí)現(xiàn)一種自動(dòng)的策略開(kāi)發(fā)方式:

從TA-Lib中選取兩個(gè)指標(biāo)分別作為趨勢(shì)信號(hào)和信號(hào)過(guò)濾,結(jié)合止損、止盈方案,生成一個(gè)策略;

基于某一組歷史數(shù)據(jù)(如股指的1分鐘行情),通過(guò)遺傳算法來(lái)對(duì)以上的參數(shù)進(jìn)行光與優(yōu)化;

兩個(gè)指標(biāo)的參數(shù)加起來(lái)通常不會(huì)超過(guò)10個(gè),再加上止盈、止損、移動(dòng)止損的參數(shù),總參數(shù)不會(huì)超過(guò)15個(gè),在一組高達(dá)十幾萬(wàn)個(gè)數(shù)據(jù)點(diǎn)的時(shí)間序列上進(jìn)行回測(cè),過(guò)度擬合的可能性不大;

現(xiàn)在云服務(wù)器價(jià)格也不貴,租一個(gè)核多一點(diǎn)的,把算法和數(shù)據(jù)丟上去7×24小時(shí)的跑,Alpha值達(dá)到一定標(biāo)準(zhǔn)的策略存下來(lái);

把上一步中保存下來(lái)的策略作為雛形,研究員再來(lái)進(jìn)行針對(duì)性的有效性驗(yàn)證和更精細(xì)化的策略改進(jìn),把策略開(kāi)發(fā)變成有的放矢,而不是盲人摸象。

這種策略開(kāi)發(fā)方式使用傳統(tǒng)的商業(yè)軟件(如TB、MC等)幾乎不可能實(shí)現(xiàn),而Python這類(lèi)開(kāi)源軟件就成為了最好的選擇,用戶(hù)可以自行決定幾乎所有的算法(指標(biāo)如何選擇、遺傳算法優(yōu)化參數(shù)時(shí)如何迭代等等)。

怎么安裝 盡管TA-Lib原生提供了基于SWIG封裝的Python API,但是由于性能和編譯不方便的原因,作者推薦Github上的一位開(kāi)發(fā)者mrjbq7基于Cython封裝的版本。

安裝過(guò)程:

在這里下載TA_Lib-0.4.9-cp27-none-win32.whl放到桌面上,也就是vn.py建議的運(yùn)行環(huán)境Anaconda 2.7 32位

在桌面上按住Shift點(diǎn)擊鼠標(biāo)右鍵后,選擇在此處打開(kāi)命令窗口打開(kāi)cmd

安裝wheel包,在cmd中運(yùn)行:

pip install wheel 安裝TA-Lib,在cmd中運(yùn)行:

pip install TA_Lib-0.4.9-cp27-none-win32.whl 打開(kāi)Python,運(yùn)行:

import talib 沒(méi)有報(bào)錯(cuò)則說(shuō)明安裝成功

一定要嘗試自己編譯的用戶(hù),可以根據(jù)該項(xiàng)目的網(wǎng)站上的教程來(lái)安裝。作者的兩臺(tái)電腦,一臺(tái)直接安裝成功,另一臺(tái)安裝了MinGW的電腦則報(bào)GCC編譯錯(cuò)誤(其實(shí)自己編譯沒(méi)有任何意義,感謝加州大學(xué)歐文分校打包的whl文件,省去了很多麻煩)。

linux下的安裝建議使用Anaconda的conda工具:

conda install -c quantopian ta-lib=0.4.9 具體可以參考這里:https://anaconda.org/Quantopian/ta-lib

DEMO 下面這個(gè)策略DEMO可以直接在vn.trader的CTA模塊中使用(回測(cè)、模擬交易),請(qǐng)不要用于實(shí)盤(pán)!

encoding: UTF-8

import talib as ta import numpy as np

from ctaBase import * from ctaTemplate import CtaTemplate

#

class TalibDoubleSmaDemo(CtaTemplate): “”“基于Talib模塊的雙指數(shù)均線(xiàn)策略Demo”“”

className = 'TalibDoubleSmaDemo'author = u'ideaplat'# 策略參數(shù)fastPeriod = 5 # 快速均線(xiàn)參數(shù)slowPeriod = 20 # 慢速均線(xiàn)參數(shù)initDays = 5 # 初始化數(shù)據(jù)所用的天數(shù)# 策略變量bar = NonebarMinute = EMPTY_STRINGcloseHistory = [] # 緩存K線(xiàn)收盤(pán)價(jià)的數(shù)組maxHistory = 50 # 最大緩存數(shù)量fastMa0 = EMPTY_FLOAT # 當(dāng)前最新的快速均線(xiàn)數(shù)值fastMa1 = EMPTY_FLOAT # 上一根的快速均線(xiàn)數(shù)值slowMa0 = EMPTY_FLOAT # 慢速均線(xiàn)數(shù)值slowMa1 = EMPTY_FLOAT# 參數(shù)列表,保存了參數(shù)的名稱(chēng)paramList = ['name', 'className', 'author', 'vtSymbol', 'fastPeriod', 'slowPeriod']# 變量列表,保存了變量的名稱(chēng)varList = ['inited', 'trading', 'pos', 'fastMa0', 'fastMa1', 'slowMa0', 'slowMa1']# ----------------------------------------------------------------------def __init__(self, ctaEngine, setting): """Constructor""" super(TalibDoubleSmaDemo, self).__init__(ctaEngine, setting)# ----------------------------------------------------------------------def onInit(self): """初始化策略(必須由用戶(hù)繼承實(shí)現(xiàn))""" self.writeCtaLog(u'雙SMA演示策略初始化') initData = self.loadBar(self.initDays) for bar in initData: self.onBar(bar) self.putEvent()# ----------------------------------------------------------------------def onStart(self): """啟動(dòng)策略(必須由用戶(hù)繼承實(shí)現(xiàn))""" self.writeCtaLog(u'雙SMA演示策略啟動(dòng)') self.putEvent()# ----------------------------------------------------------------------def onStop(self): """停止策略(必須由用戶(hù)繼承實(shí)現(xiàn))""" self.writeCtaLog(u'雙SMA演示策略停止') self.putEvent()# ----------------------------------------------------------------------def onTick(self, tick): """收到行情T(mén)ICK推送(必須由用戶(hù)繼承實(shí)現(xiàn))""" # 計(jì)算K線(xiàn) tickMinute = tick.datetime.minute if tickMinute != self.barMinute: if self.bar: self.onBar(self.bar) bar = CtaBarData() bar.vtSymbol = tick.vtSymbol bar.symbol = tick.symbol bar.exchange = tick.exchange bar.open = tick.lastPRice bar.high = tick.lastPrice bar.low = tick.lastPrice bar.close = tick.lastPrice bar.date = tick.date bar.time = tick.time bar.datetime = tick.datetime # K線(xiàn)的時(shí)間設(shè)為第一個(gè)Tick的時(shí)間 # 實(shí)盤(pán)中用不到的數(shù)據(jù)可以選擇不算,從而加快速度 # bar.volume = tick.volume # bar.openInterest = tick.openInterest self.bar = bar # 這種寫(xiě)法為了減少一層訪(fǎng)問(wèn),加快速度 self.barMinute = tickMinute # 更新當(dāng)前的分鐘 else: # 否則繼續(xù)累加新的K線(xiàn) bar = self.bar # 寫(xiě)法同樣為了加快速度 bar.high = max(bar.high, tick.lastPrice) bar.low = min(bar.low, tick.lastPrice) bar.close = tick.lastPrice# ----------------------------------------------------------------------def onBar(self, bar): """收到Bar推送(必須由用戶(hù)繼承實(shí)現(xiàn))""" # 把最新的收盤(pán)價(jià)緩存到列表中 self.closeHistory.append(bar.close) # 檢查列表長(zhǎng)度,如果超過(guò)緩存上限則移除最老的數(shù)據(jù) # 這樣是為了減少計(jì)算用的數(shù)據(jù)量,提高速度 if len(self.closeHistory) > self.maxHistory: self.closeHistory.pop(0) # 如果小于緩存上限,則說(shuō)明初始化數(shù)據(jù)尚未足夠,不進(jìn)行后續(xù)計(jì)算 else: return # 將緩存的收盤(pán)價(jià)數(shù)轉(zhuǎn)化為numpy數(shù)組后,傳入talib的函數(shù)SMA中計(jì)算 closeArray = np.array(self.closeHistory) fastSMA = ta.SMA(closeArray, self.fastPeriod) slowSMA = ta.SMA(closeArray, self.slowPeriod) # 讀取當(dāng)前K線(xiàn)和上一根K線(xiàn)的數(shù)值,用于判斷均線(xiàn)交叉 self.fastMa0 = fastSMA[-1] self.fastMa1 = fastSMA[-2] self.slowMa0 = slowSMA[-1] self.slowMa1 = slowSMA[-2] # 判斷買(mǎi)賣(mài) crossOver = self.fastMa0>self.slowMa0 and self.fastMa1<self.slowMa1 # 金叉上穿 crossBelow = self.fastMa0<self.slowMa0 and self.fastMa1>self.slowMa1 # 死叉下穿 # 金叉和死叉的條件是互斥 if crossOver: # 如果金叉時(shí)手頭沒(méi)有持倉(cāng),則直接做多 if self.pos == 0: self.buy(bar.close, 1) # 如果有空頭持倉(cāng),則先平空,再做多 elif self.pos < 0: self.cover(bar.close, 1) self.buy(bar.close, 1) # 死叉和金叉相反 elif crossBelow: if self.pos == 0: self.short(bar.close, 1) elif self.pos > 0: self.sell(bar.close, 1) self.short(bar.close, 1) # 發(fā)出狀態(tài)更新事件 self.putEvent()# ----------------------------------------------------------------------def onOrder(self, order): """收到委托變化推送(必須由用戶(hù)繼承實(shí)現(xiàn))""" # 對(duì)于無(wú)需做細(xì)粒度委托控制的策略,可以忽略onOrder pass# ----------------------------------------------------------------------def onTrade(self, trade): """收到成交推送(必須由用戶(hù)繼承實(shí)現(xiàn))""" # 對(duì)于無(wú)需做細(xì)粒度委托控制的策略,可以忽略onOrder pass

(感謝社區(qū)ideaplat用戶(hù)貢獻(xiàn)的代碼!作者做了一些小修改。)

將上面的代碼保存到一個(gè)talibDemo.py文件中后,參考vn.trader下ctaAlgo文件夾內(nèi)的ctaBacktesting.py運(yùn)行回測(cè),也可以通過(guò)ctaSetting.py進(jìn)行配置后,在vn.trader中進(jìn)行模擬交易。

從上面的DEMO中我們可以看到,talib中的技術(shù)指標(biāo)函數(shù)主要接受一個(gè)numpy數(shù)組作為原始數(shù)據(jù)及若干個(gè)指標(biāo)算法中的參數(shù)作為輸入,返回的數(shù)據(jù)也是一個(gè)numpy數(shù)組,使用起來(lái)非常方便。

注意緩存數(shù)據(jù)時(shí)使用的是Python列表而非numpy數(shù)組,主要原因是numpy數(shù)組的append方法本質(zhì)是結(jié)合原數(shù)組中的數(shù)據(jù)和新的數(shù)據(jù)生成一個(gè)新的數(shù)組對(duì)象,相對(duì)于列表的append開(kāi)銷(xiāo)要高很多。


發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 高唐县| 吴堡县| 通道| 岳普湖县| 黄山市| 苍南县| 财经| 麟游县| 阳江市| 辽阳县| 浪卡子县| 神池县| 宁海县| 丽水市| 泰州市| 应用必备| 义乌市| 文成县| 兴宁市| 扶沟县| 瑞金市| 阿巴嘎旗| 浮梁县| 通道| 望江县| 革吉县| 新野县| 静安区| 建水县| 垦利县| 镇康县| 克拉玛依市| 甘肃省| 德州市| 邵东县| 甘洛县| 揭西县| 舒兰市| 威宁| 枝江市| 巴彦淖尔市|