基于統(tǒng)計的交易策略簡易實現(xiàn)VNPY的示例分析

這篇文章將為大家詳細講解有關(guān)基于統(tǒng)計的交易策略簡易實現(xiàn)VNPY的示例分析,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團企業(yè)網(wǎng)站建設(shè)等服務(wù)項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了旬陽免費建站歡迎大家使用!

交易思維是基于歷史數(shù)據(jù)中,一組數(shù)據(jù)比如100天中,K線中最高點或者最低點相對于開始價位價差點差,再利用numpy的函數(shù)numpy.percentile(), 計算在比如95%機會,最高點或者最低點的點差數(shù)字。如果點差是5個點,就可以認為下一根K線也有95%概率有5個點受益。

嘗試在VNPY實現(xiàn)。

思路整理:

1.入場:如果最近N(30)個D分鐘k線,通過下面代碼計算,分析對于概率prb比如90%,如果存在一個點差大于TickValueLimit一個值TickValue,說明過去N個分鐘,有P的概率,bar開始下單,在bar中有最高點或者最低點獲得TickValue。那么在下個bar開始時候,買入。

2.出場,如果到達持有價格POSprice +/- TickValue, 則賣出;重新進行入場分析。如果這個bar中間沒到達目標價格,在bar結(jié)束時候分析是否還滿足入場條件,如果繼續(xù)滿足則持有,否則平倉,如果是反向,則反向開單。

3.止損,如果在持有時候,下跌到反向POSPrice +/- Multiple * TickValue 價格時候,平倉。Multiple 隨著時間增加逐漸減少。

示例代碼如下,最后很遺憾,回測效果非常不好。

from __future__ import division
from vnpy.trader.vtConstant import EMPTY_STRING, EMPTY_FLOAT, OFFSET_OPEN,OFFSET_CLOSE
from vnpy.trader.app.ctaStrategy.ctaTemplate import (CtaTemplate,
                                                     BarGenerator,
                                                     ArrayManager)
import numpy as np
from datetime import datetime, time
########################################################################
class PercentileStrategy(CtaTemplate):
    """MACD策略Demo"""
    className = 'PercentileStrategy'
    author = u'BillyZhang'
    fixedSize = 1
    # 策略參數(shù)
    calWindow = 15
    percentile = 95
    tickValueLimit = 5
    Multiple = 0.8
    # 策略變量
    p = 0
    tickValue = 0
    tradeSign = 0
    tickValueHigh = 0
    tickValueLow = 0
    longStop = 0  # 多頭止損
    shortStop = 0  # 空頭止損
    margin = 0
    lowerLimit = 0
    upperLimit = 50000
    # 時間
    initDays = 0
    DAY_START = time(9, 10)  # 日盤啟動和停止時間
    DAY_END = time(14, 55)
    NIGHT_START = time(21, 10)  # 夜盤啟動和停止時間
    NIGHT_END = time(10, 55)
    # 參數(shù)列表,保存了參數(shù)的名稱
    paramList = ['name',
                 'className',
                 'author',
                 'vtSymbol',
                 'initDays',
                 'fixedSize',
                 'calWindow',
                 'percentile',
                 'tickValueLimit',
                 'Multiple'
                 ]
    # 變量列表,保存了變量的名稱
    varList = ['inited',
               'trading',
               'pos',
               'longStop',
               'shortStop',
               'posPrice',
               'lowerLimit',
               'p',
               'tickValue',
               'tradeSign',
               'tickValueHigh',
               'tickValueLow'
                ]
    # 同步列表,保存了需要保存到數(shù)據(jù)庫的變量名稱
    syncList = ['pos',
                'posPrice',
                'longStop',
                'shortStop'
                ]
    # ----------------------------------------------------------------------
    def __init__(self, ctaEngine, setting):
        """Constructor"""
        super(PercentileStrategy, self).__init__(ctaEngine, setting)
        self.am = ArrayManager(size = self.calWindow)
        # 注意策略類中的可變對象屬性(通常是list和dict等),在策略初始化時需要重新創(chuàng)建,
        # 否則會出現(xiàn)多個策略實例之間數(shù)據(jù)共享的情況,有可能導(dǎo)致潛在的策略邏輯錯誤風(fēng)險,
        # 策略類中的這些可變對象屬性可以選擇不寫,全都放在__init__下面,寫主要是為了閱讀
        # 策略時方便(更多是個編程習(xí)慣的選擇)
    # ----------------------------------------------------------------------
    def onInit(self):
        """初始化策略(必須由用戶繼承實現(xiàn))"""
        self.writeCtaLog(u'%s策略初始化' % self.name)
        initData = self.loadBar(self.initDays)
        for bar in initData:
            self.onBar(bar)
        self.putEvent()
    # ----------------------------------------------------------------------
    def onStart(self):
        """啟動策略(必須由用戶繼承實現(xiàn))"""
        if self.pos == 0:
            self.writeCtaLog(u'%s策略啟動' % self.name)
        # 當前無倉位,發(fā)送開倉委托
        # 持有多頭倉位
        self.putEvent()
    # ----------------------------------------------------------------------
    def onStop(self):
        """停止策略(必須由用戶繼承實現(xiàn))"""
        self.writeCtaLog(u'%s策略停止' % self.name)
        self.putEvent()
    # ----------------------------------------------------------------------
    def onTick(self, tick):
        """收到行情TICK推送(必須由用戶繼承實現(xiàn))"""
        if self.lowerLimit == 0 or self.upperLimit == 0:
            self.lowerLimit = tick.lowerLimit
            self.upperLimit = tick.upperLimit
        self.bg.updateTick(tick)
    # ----------------------------------------------------------------------
    def onBar(self, bar):
        """收到Bar推送(必須由用戶繼承實現(xiàn))"""
        #如果是當然最后5分鐘,略過
        am = self.am
        am.updateBar(bar)
        if not am.inited:
            return
        # currentTime = datetime.now().time()
        currentTime = time(9,20)
        #計算p,和tickValue
        MaxHigh = am.high / am.open
        MaxLow = am.low / am.open
        MaxClose = am.close / am.open
        lpHigh = np.percentile(MaxHigh, 100 - self.percentile)
        lpLow = np.percentile(MaxLow,  self.percentile)
        self.tickValueHigh = abs(bar.open - bar.open*lpHigh)
        self.tickValueLow = abs(bar.open - bar.open * lpLow)
        if self.tickValueHigh > self.tickValueLow and self.tickValueHigh > self.tickValueLimit:
            self.tradeSign = 1
        elif self.tickValueHigh < self.tickValueLow and self.tickValueLow > self.tickValueLimit:
            self.tradeSign = -1
        else:
            self.tradeSign = 0
        # 平當日倉位, 如果當前時間是結(jié)束前日盤15點28分鐘,或者夜盤10點58分鐘,如果有持倉,平倉。
        if ((currentTime >= self.DAY_START and currentTime <= self.DAY_END) or
            (currentTime >= self.NIGHT_START and currentTime <= self.NIGHT_END)):
            if self.pos == 0:
                if self.tradeSign == 0:
                    pass
                elif self.tradeSign == 1 and bar.close > self.lowerLimit:
                    self.buy(bar.close + 5,self.fixedSize,False)
                elif self.tradeSign == -1 and bar.close < self.upperLimit:
                    self.short(bar.close - 5,self.fixedSize,False)
            elif self.pos > 0:
                if self.tradeSign == 1 or self.tradeSign == 0:
                    pass
                elif self.tradeSign == -1:
                    self.sell(bar.close-5, abs(self.pos), False)
            elif self.pos < 0:
                if self.tradeSign == -1 or self.tradeSign == 0:
                    pass
                elif self.tradeSign ==1:
                    self.cover(bar.close+5, abs(self.pos), False)
        else:
            if self.pos > 0:
                self.sell(bar.close-5, abs(self.pos), False)
            elif self.pos < 0:
                self.cover(bar.close+5, abs(self.pos), False)
            elif self.pos == 0:
                return
    # ----------------------------------------------------------------------
    def onOrder(self, order):
        """收到委托變化推送(必須由用戶繼承實現(xiàn))"""
        # 對于無需做細粒度委托控制的策略,可以忽略onOrder
        pass
    # ----------------------------------------------------------------------
    def onTrade(self, trade):
        # 發(fā)出狀態(tài)更新事件
        """收到成交推送(必須由用戶繼承實現(xiàn))"""
        # 對于無需做細粒度委托控制的策略,可以忽略onOrder
        if trade.offset == OFFSET_OPEN:
            self.posPrice = trade.price
            if self.tradeSign == 1:
                self.sell(self.posPrice + self.tickValueHigh,abs(self.pos),False)
                self.sell(self.posPrice - self.Multiple*self.tickValueHigh, abs(self.pos), True)
            elif self.tradeSign == -1:
                self.cover(self.posPrice - self.tickValueLow, abs(self.pos), False)
                self.cover(self.posPrice + self.Multiple*self.tickValueLow, abs(self.pos),True)
        elif trade.offset == OFFSET_CLOSE:
            self.cancelAll()
            self.tradeSign = 0
            # 同步數(shù)據(jù)到數(shù)據(jù)庫
        self.saveSyncData()
    # ----------------------------------------------------------------------
    def onStopOrder(self, so):
        """停止單推送"""
        pass

關(guān)于基于統(tǒng)計的交易策略簡易實現(xiàn)VNPY的示例分析就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

新聞標題:基于統(tǒng)計的交易策略簡易實現(xiàn)VNPY的示例分析
當前鏈接:http://bm7419.com/article22/igodjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、動態(tài)網(wǎng)站做網(wǎng)站、服務(wù)器托管網(wǎng)站設(shè)計、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站