VNPY 自帶跨時間週期交易策略MultiTimeframeStrategy 分析
之前寫了bollchannel布林線軌道策略,感覺自己也有收穫,趁熱打鐵,分析下另一個時間週期策略。
其實原理很簡單,就是15分鐘週期分析現在多頭還是空頭市場,再結合rsi指標,在5分鐘線K線級別下單。非常簡單,也很有效。
class MultiTimeframeStrategy(CtaTemplate):
"""跨時間週期交易策略"""
className = 'MultiTimeframeStrategy'
author = u'用Python的交易員'
# 策略引數
rsiSignal = 20 # RSI訊號閾值
rsiWindow = 14 # RSI視窗
fastWindow = 5 # 快速均線視窗
slowWindow = 20 # 慢速均線視窗
#這裡RSI指標,Relative Strength Index的縮寫, 一般r認為50是平衡市場,大於50傾向多頭,小於50空頭傾向;這裡20是一個閾#值,實際就是50+20 = 70 確立多頭,50-20 = 30 確認空頭。
#rsiWondow 是計算rsiValue的週期引數。
#fastWindow 和slowWindow都是計算均線的週期引數,其中fastWindow是計算5日,slowWindow是20日,如果fast 均價大於slow,一般認為向上趨勢,反之向下。
initDays = 10 # 初始化資料所用的天數
fixedSize = 1 # 每次交易的數量
#參考bollchannel文章
# 策略變數
rsiValue = 0 # RSI指標的數值
rsiLong = 0 # RSI買開閾值
rsiShort = 0 # RSI賣開閾值
fastMa = 0 # 5分鐘快速均線
slowMa = 0 # 5分鐘慢速均線
maTrend = 0 # 均線趨勢,多頭1,空頭-1
#參考bollchannel文章
# 引數列表,儲存了引數的名稱
paramList = ['name',
'className',
'author',
'vtSymbol',
'rsiSignal',
'rsiWindow',
'fastWindow',
'slowWindow']
#參考bollchannel文章
# 變數列表,儲存了變數的名稱
varList = ['inited',
'trading',
'pos',
'rsiValue',
'rsiLong',
'rsiShort',
'fastMa',
'slowMa',
'maTrend']
#參考bollchannel文章,其中maTrend是根據快慢均值的高低,如果fastMa > slowMa 為向上,maTrend > 0; 反之向下。
# 同步列表,儲存了需要儲存到資料庫的變數名稱
syncList = ['pos']
#參考bollchannel文章,這裡只同步倉位。
#----------------------------------------------------------------------
def __init__(self, ctaEngine, setting):
"""Constructor"""
super(MultiTimeframeStrategy, self).__init__(ctaEngine, setting)
self.rsiLong = 50 + self.rsiSignal
self.rsiShort = 50 - self.rsiSignal
#如上文,rsi 大於70為多頭,rsi小於30為空頭。
# 建立K線合成器物件
self.bg5 = BarGenerator(self.onBar, 5, self.on5MinBar)
self.am5 = ArrayManager()
self.bg15 = BarGenerator(self.onBar, 15, self.on15MinBar)
self.am15 = ArrayManager()
#實現兩個K線合成器和AM,來合成並計算5分鐘和15分鐘K線和對應指標。
#----------------------------------------------------------------------
def onInit(self):
"""初始化策略(必須由使用者繼承實現)"""
self.writeCtaLog(u'%s策略初始化' %self.name)
# 載入歷史資料,並採用回放計算的方式初始化策略數值
initData = self.loadBar(self.initDays)
for bar in initData:
self.onBar(bar)
self.putEvent()
#參考bollchannel文章
#----------------------------------------------------------------------
def onStart(self):
"""啟動策略(必須由使用者繼承實現)"""
self.writeCtaLog(u'%s策略啟動' %self.name)
self.putEvent()
#----------------------------------------------------------------------
def onStop(self):
"""停止策略(必須由使用者繼承實現)"""
self.writeCtaLog(u'%s策略停止' %self.name)
self.putEvent()
#參考bollchannel文章
#----------------------------------------------------------------------
def onTick(self, tick):
"""收到行情TICK推送(必須由使用者繼承實現)"""
# 只需要要在一個BarGenerator中合成1分鐘K線
self.bg5.updateTick(tick)
#參考bollchannel文章, 根據tick交易行情,合成1分鐘K線,並更新bg5中onBar。一般這個是針對實盤;通常歷史資料下載來都是不到tick級別,而且一分鐘k線;可能券商本身會有。這裡感覺應該吧bg15放在一起更合適吧。。。
#----------------------------------------------------------------------
def onBar(self, bar):
"""收到Bar推送(必須由使用者繼承實現)"""
# 基於15分鐘判斷趨勢過濾,因此先更新
self.bg15.updateBar(bar)
# 基於5分鐘判斷
self.bg5.updateBar(bar)
#參考bollchannel文章,當一分鐘K線到達後,湊夠時間,合成對應時間K線,包括15分鐘和5分鐘
#----------------------------------------------------------------------
def on5MinBar(self, bar):
"""5分鐘K線"""
self.cancelAll()
#參考bollchannel文章,清空未成交。
# 儲存K線資料
self.am5.updateBar(bar)
if not self.am5.inited:
return
#參考bollchannel文章,取得AM指標計算是否有100個bar的資料來計算。
# 如果15分鐘資料尚未初始化完畢,則直接返回
if not self.maTrend:
return
#15分鐘K線,計算快慢線fastMa,slowMa 和maTrend; 如果maTrend沒有值,說明15分鐘K線還沒有到100,所以推出函式。
# 計算指標數值
self.rsiValue = self.am5.rsi(self.rsiWindow)
#根據risWindos計算出5分鐘rsi現在值。
# 判斷是否要進行交易
# 當前無倉位
if self.pos == 0:
if self.maTrend > 0 and self.rsiValue >= self.rsiLong:
self.buy(bar.close+5, self.fixedSize)
elif self.maTrend < 0 and self.rsiValue <= self.rsiShort:
self.short(bar.close-5, self.fixedSize)
#如果空,maTrend 和rsiValue都是多頭,下多單,這個是市價單,其實價格沒有什麼意思,都會按照漲停發出。同理相反,如果都是空頭,下空單。
# 持有多頭倉位
elif self.pos > 0:
if self.maTrend < 0 or self.rsiValue < 50:
self.sell(bar.close-5, abs(self.pos))
# 持有空頭倉位
elif self.pos < 0:
if self.maTrend > 0 or self.rsiValue > 50:
self.cover(bar.close+5, abs(self.pos))
#如果有多頭倉位,但是空頭趨勢,平倉,反之持有空頭也是一樣。
# 發出狀態更新事件
self.putEvent()
#----------------------------------------------------------------------
def on15MinBar(self, bar):
"""15分鐘K線推送"""
self.am15.updateBar(bar)
if not self.am15.inited:
return
# 計算均線並判斷趨勢
self.fastMa = self.am15.sma(self.fastWindow)
self.slowMa = self.am15.sma(self.slowWindow)
if self.fastMa > self.slowMa:
self.maTrend = 1
else:
self.maTrend = -1
#這個不說了,計算快慢均線價格,和對應趨勢。
#----------------------------------------------------------------------
def onOrder(self, order):
"""收到委託變化推送(必須由使用者繼承實現)"""
pass
#----------------------------------------------------------------------
def onTrade(self, trade):
# 發出狀態更新事件
self.putEvent()
#----------------------------------------------------------------------
def onStopOrder(self, so):
"""停止單推送"""
pass
其實原理很簡單,就是15分鐘週期分析現在多頭還是空頭市場,再結合rsi指標,在5分鐘線K線級別下單。非常簡單,也很有效。
class MultiTimeframeStrategy(CtaTemplate):
"""跨時間週期交易策略"""
className = 'MultiTimeframeStrategy'
author = u'用Python的交易員'
# 策略引數
rsiSignal = 20 # RSI訊號閾值
rsiWindow = 14 # RSI視窗
fastWindow = 5 # 快速均線視窗
slowWindow = 20 # 慢速均線視窗
#這裡RSI指標,Relative Strength Index的縮寫, 一般r認為50是平衡市場,大於50傾向多頭,小於50空頭傾向;這裡20是一個閾#值,實際就是50+20 = 70 確立多頭,50-20 = 30 確認空頭。
#rsiWondow 是計算rsiValue的週期引數。
#fastWindow 和slowWindow都是計算均線的週期引數,其中fastWindow是計算5日,slowWindow是20日,如果fast 均價大於slow,一般認為向上趨勢,反之向下。
initDays = 10 # 初始化資料所用的天數
fixedSize = 1 # 每次交易的數量
#參考bollchannel文章
# 策略變數
rsiValue = 0 # RSI指標的數值
rsiLong = 0 # RSI買開閾值
rsiShort = 0 # RSI賣開閾值
fastMa = 0 # 5分鐘快速均線
slowMa = 0 # 5分鐘慢速均線
maTrend = 0 # 均線趨勢,多頭1,空頭-1
#參考bollchannel文章
# 引數列表,儲存了引數的名稱
paramList = ['name',
'className',
'author',
'vtSymbol',
'rsiSignal',
'rsiWindow',
'fastWindow',
'slowWindow']
#參考bollchannel文章
# 變數列表,儲存了變數的名稱
varList = ['inited',
'trading',
'pos',
'rsiValue',
'rsiLong',
'rsiShort',
'fastMa',
'slowMa',
'maTrend']
#參考bollchannel文章,其中maTrend是根據快慢均值的高低,如果fastMa > slowMa 為向上,maTrend > 0; 反之向下。
# 同步列表,儲存了需要儲存到資料庫的變數名稱
syncList = ['pos']
#參考bollchannel文章,這裡只同步倉位。
#----------------------------------------------------------------------
def __init__(self, ctaEngine, setting):
"""Constructor"""
super(MultiTimeframeStrategy, self).__init__(ctaEngine, setting)
self.rsiLong = 50 + self.rsiSignal
self.rsiShort = 50 - self.rsiSignal
#如上文,rsi 大於70為多頭,rsi小於30為空頭。
# 建立K線合成器物件
self.bg5 = BarGenerator(self.onBar, 5, self.on5MinBar)
self.am5 = ArrayManager()
self.bg15 = BarGenerator(self.onBar, 15, self.on15MinBar)
self.am15 = ArrayManager()
#實現兩個K線合成器和AM,來合成並計算5分鐘和15分鐘K線和對應指標。
#----------------------------------------------------------------------
def onInit(self):
"""初始化策略(必須由使用者繼承實現)"""
self.writeCtaLog(u'%s策略初始化' %self.name)
# 載入歷史資料,並採用回放計算的方式初始化策略數值
initData = self.loadBar(self.initDays)
for bar in initData:
self.onBar(bar)
self.putEvent()
#參考bollchannel文章
#----------------------------------------------------------------------
def onStart(self):
"""啟動策略(必須由使用者繼承實現)"""
self.writeCtaLog(u'%s策略啟動' %self.name)
self.putEvent()
#----------------------------------------------------------------------
def onStop(self):
"""停止策略(必須由使用者繼承實現)"""
self.writeCtaLog(u'%s策略停止' %self.name)
self.putEvent()
#參考bollchannel文章
#----------------------------------------------------------------------
def onTick(self, tick):
"""收到行情TICK推送(必須由使用者繼承實現)"""
# 只需要要在一個BarGenerator中合成1分鐘K線
self.bg5.updateTick(tick)
#參考bollchannel文章, 根據tick交易行情,合成1分鐘K線,並更新bg5中onBar。一般這個是針對實盤;通常歷史資料下載來都是不到tick級別,而且一分鐘k線;可能券商本身會有。這裡感覺應該吧bg15放在一起更合適吧。。。
#----------------------------------------------------------------------
def onBar(self, bar):
"""收到Bar推送(必須由使用者繼承實現)"""
# 基於15分鐘判斷趨勢過濾,因此先更新
self.bg15.updateBar(bar)
# 基於5分鐘判斷
self.bg5.updateBar(bar)
#參考bollchannel文章,當一分鐘K線到達後,湊夠時間,合成對應時間K線,包括15分鐘和5分鐘
#----------------------------------------------------------------------
def on5MinBar(self, bar):
"""5分鐘K線"""
self.cancelAll()
#參考bollchannel文章,清空未成交。
# 儲存K線資料
self.am5.updateBar(bar)
if not self.am5.inited:
return
#參考bollchannel文章,取得AM指標計算是否有100個bar的資料來計算。
# 如果15分鐘資料尚未初始化完畢,則直接返回
if not self.maTrend:
return
#15分鐘K線,計算快慢線fastMa,slowMa 和maTrend; 如果maTrend沒有值,說明15分鐘K線還沒有到100,所以推出函式。
# 計算指標數值
self.rsiValue = self.am5.rsi(self.rsiWindow)
#根據risWindos計算出5分鐘rsi現在值。
# 判斷是否要進行交易
# 當前無倉位
if self.pos == 0:
if self.maTrend > 0 and self.rsiValue >= self.rsiLong:
self.buy(bar.close+5, self.fixedSize)
elif self.maTrend < 0 and self.rsiValue <= self.rsiShort:
self.short(bar.close-5, self.fixedSize)
#如果空,maTrend 和rsiValue都是多頭,下多單,這個是市價單,其實價格沒有什麼意思,都會按照漲停發出。同理相反,如果都是空頭,下空單。
# 持有多頭倉位
elif self.pos > 0:
if self.maTrend < 0 or self.rsiValue < 50:
self.sell(bar.close-5, abs(self.pos))
# 持有空頭倉位
elif self.pos < 0:
if self.maTrend > 0 or self.rsiValue > 50:
self.cover(bar.close+5, abs(self.pos))
#如果有多頭倉位,但是空頭趨勢,平倉,反之持有空頭也是一樣。
# 發出狀態更新事件
self.putEvent()
#----------------------------------------------------------------------
def on15MinBar(self, bar):
"""15分鐘K線推送"""
self.am15.updateBar(bar)
if not self.am15.inited:
return
# 計算均線並判斷趨勢
self.fastMa = self.am15.sma(self.fastWindow)
self.slowMa = self.am15.sma(self.slowWindow)
if self.fastMa > self.slowMa:
self.maTrend = 1
else:
self.maTrend = -1
#這個不說了,計算快慢均線價格,和對應趨勢。
#----------------------------------------------------------------------
def onOrder(self, order):
"""收到委託變化推送(必須由使用者繼承實現)"""
pass
#----------------------------------------------------------------------
def onTrade(self, trade):
# 發出狀態更新事件
self.putEvent()
#----------------------------------------------------------------------
def onStopOrder(self, so):
"""停止單推送"""
pass
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-2156080/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VNPY 單品種期貨的網格交易策略的實現
- VNPY 交易所返回委託和交易狀態到策略的原始碼分析原始碼
- VNPY 基於SAR和肯特納的交易策略
- vnpy,BollChannel布林線軌道策略分析
- VNPY中 Tick級別準高頻交易簡單策略
- 【數量技術宅|量化投資策略系列分享】多週期共振交易策略
- 建立帶過期時間的map
- VNPY,從傳送交易指令到交易所的原始碼分析原始碼
- VNPY 一種基於統計的交易策略簡易實現
- 時鐘週期,機器週期,指令週期
- 在·VNPY中按照CTA策略例項記錄交易條目和損益
- VNPY2 中凌晨0點時間戳的處理問題,和夜盤資料時間戳分析時間戳
- Python學習需要多長時間?學習週期Python
- CGD:研究顯示2021年疫情期間女性帶娃時間增加173小時
- localstorage實現帶過期時間的快取功能快取
- 經典量化策略——做市商交易(期貨)
- 多級時序系統:機器週期,時鐘週期
- 利用VNPY回測引擎分析實盤交易,並用excel和pdf輸出分析結果Excel
- ElasticSearch生命週期管理-索引策略配置與操作Elasticsearch索引
- 品牌生命週期和產品生命週期之間的關係
- httpsession過期時間HTTPSession
- redis 過期時間Redis
- VNPY 價差交易模組的使用學習
- Flutter 中的生命週期分析Flutter
- 用Python預測「週期性時間序列」的正確姿勢Python
- Eureka的TimedSupervisorTask類(自動調節間隔的週期性任務)
- 利用Scikit-learn機器學習庫的特徵分類進行vnpy期貨量化交易機器學習特徵
- Elasticsearch Query DSL建立滾動索引(生命週期策略)Elasticsearch索引
- ELK日誌保留7天-索引生命週期策略索引
- btc交易策略
- 科技愛好者週刊(第 238 期):停止尋找的最佳時間
- 時間序列分析
- 探索 React 元件之間的生命週期React元件
- VNPY實盤交易中,出現發單成功但是沒有交易情況
- js獲取某時間的當天0點時間戳 與某時間的當週週一0點時間戳JS時間戳
- 量化策略交易系統開發,自動對沖搬磚交易平臺搭建
- 利用Scikit-learn機器學習庫的特徵分類進行vnpy期貨量化交易(程式碼)機器學習特徵
- [微控制器]時鐘週期