亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747


用Python構(gòu)建阿隆策略

 

摘要

在技術(shù)分析中阿隆(Aroon)是一個很獨特的技術(shù)指標,“Aroon”一詞來自梵文,寓意為“黎明曙光”。它不像MA、macD、KDJ那樣廣為人所熟悉,它推出的時間更晚,直到1995年才被圖莎爾·錢德(Tushar Chande)發(fā)明出來,作者還發(fā)明了錢德動量擺動指標(CMO)和日內(nèi)動量指數(shù)(IMI)。如果說一個技術(shù)指標知道的人越多,使用的人也越多,那么其賺錢能力也越低,那么相對新穎的阿隆指標則恰恰相反,站在這個角度看這是一個不錯的選擇。

阿隆指標簡介

阿隆指標通過計算當前K線距離前最高價和最低價之間的K線數(shù)量,來幫助交易者預(yù)測價格走勢與趨勢區(qū)域的相對位置關(guān)系變化。它有兩部分組成,即:阿隆上線(AroonUp)和阿隆下線(AroonDown),這兩條線在0~100之間上下移動,雖然命名為上線和下線,但從圖表上看并不像BOLL指標那樣是真正意義上的上線和下線。如下圖就是阿隆指標:

用Python構(gòu)建阿隆策略

 

阿隆指標的計算方法

阿隆指標要求首先要設(shè)置一個時間周期參數(shù),就像設(shè)置均線周期參數(shù)一樣,在傳統(tǒng)行情軟件中,這個周期數(shù)是14,當然這個周期參數(shù)并不是固定的,你還可以設(shè)置為10或者50等等。為了方便理解,暫且把這個時間周期參數(shù)定義為:N。確定N之后,我們就可以計算出阿隆上線(AroonUp)和阿隆下線(AroonDown),具體的計算公式如下:

  • 阿隆上線= [ ( 設(shè)置的周期參數(shù) - 最高價后的周期數(shù) ) / 計算的周期數(shù) ] * 100
  • 阿隆下線= [ ( 設(shè)置的周期參數(shù) - 最低價后的周期數(shù) ) / 計算的周期數(shù) ] * 100

從這個公式中,我們就能大致看出,阿隆指標的思想。那就是:有多少個周期,價格在近期高 / 低點之下,輔助預(yù)測當前趨勢是否會延續(xù),同時衡量當前趨勢的強弱。如果我們把這個指標歸類的話,很明顯它是屬于趨勢跟蹤類型。但是與其他趨勢跟蹤型指標不同的是,它更重視時間而不是價格。

如何使用阿隆指標

阿隆上線(AroonUp)和阿隆下線(AroonDown)反映的是當前時間與之前最高價或最低價的遠近,如果時間越近值就越大,如果時間越遠值就越小。并且當兩條線發(fā)生交叉就預(yù)示著價格方向可能會發(fā)生改變,如果AroonUp在AroonDown之上說明價格處于上漲趨勢,未來價格可能會進一步上漲;如果AroonDown在AroonUp之上說明價格處于下跌趨勢,未來價格可能會進一步下跌。

同時我們還可以設(shè)置幾個固定的值,來精確入場時機。我們知道阿隆指標是一直在0~100之間上下運行,那么在市場處于上漲趨勢,也就是AroonUp在AroonDown之上時,當AroonUp大于50,說明市場上漲的趨勢已經(jīng)形成,未來價格可能會繼續(xù)上漲;當AroonUp下穿50時,說明價格上漲的動力正在減弱,未來價格可能會震蕩和下跌。

反之在市場處于下跌趨勢,也就是AroonDown在AroonUp之上時,當AroonDown大于50,說明市場下跌趨勢已經(jīng)形成,未來價格可能會繼續(xù)下跌;當AroonDown下穿50時,說明價格下跌的動力正在減弱,未來價格可能會震蕩和上漲。那么根據(jù)上面兩段理論,我們可以把買賣條件羅列為:

  • 當 AroonUp大于AroonDown,并且AroonUp大于50,多頭開倉;
  • 當 AroonUp小于AroonDown,或者AroonUp小于50,多頭平倉;
  • 當 AroonDown大于AroonUp,并且AroonDown大于50,空頭開倉;
  • 當 AroonDown小于AroonUp,或者AroonDown小于50,空頭平倉;

基于阿隆指標構(gòu)建交易策略

理清交易邏輯后,我們就可以用代碼去實現(xiàn)了,依次打開:fmz.com > 登錄 > 控制中心 > 策略庫 > 新建策略 > 點擊右上角下拉菜單選擇Python語言,開始編寫策略,注意看下面代碼中的注釋。

第一步:編寫策略框架
我們知道在量化交易中,程序是不斷獲取數(shù)據(jù)、處理數(shù)據(jù)、下單交易這樣的循環(huán)過程,所以我們繼續(xù)使用之前講過的main函數(shù)和onTick函數(shù),其中在main函數(shù)中無限循環(huán)執(zhí)行onTick函數(shù)。如下:

# 策略主函數(shù)
def onTick():
 pass


# 程序入口
def main():
 while True: # 進入無限循環(huán)模式
 onTick() # 執(zhí)行策略主函數(shù)
 Sleep(1000) # 休眠1秒

第二步:導(dǎo)入庫
另外,在計算AROON時,需要用到talib庫,我們直接用import一行代碼導(dǎo)入。因為在使用talib計算時,必須先把數(shù)據(jù)處理成numpy.array類型,所以也到導(dǎo)入numpy庫。

import talib
import numpy as np

第三步:定義虛擬持倉變量
量化交易中判斷持倉分為兩種,一種是真實的賬戶持倉,另一種就是虛擬持倉,還有一種是真實持倉和虛擬持倉聯(lián)合判斷。實盤時我們只使用真實持倉就足夠了,但這里為了簡化策略,作為演示使用虛擬持倉。

mp = 0 # 用于控制虛擬持倉

使用虛擬持倉的原理很簡單,策略運行之初默認是空倉mp=0,當開多單后把虛擬持倉重置為mp=1,當開空單后把虛擬持倉重置為,mp=-1,當平多單或空單后把虛擬持倉重置為mp=0。這樣我們在判斷構(gòu)建邏輯獲取倉位時,只需要判斷mp的值就可以了。

第四步:計算阿隆指標
計算阿隆指標,首先要獲取基礎(chǔ)數(shù)據(jù),但前提是先要訂閱數(shù)據(jù),也就是訂閱具體的合約代碼,你可以訂閱指數(shù)或者主力連續(xù),甚至還可以訂閱具體交割月份的合約代碼。然后是獲取K線數(shù)組,K線數(shù)組是一個包含開高低收、成交量和時間的序列數(shù)據(jù),同時也是計算大部分指標的基礎(chǔ)數(shù)據(jù)。

在獲取K線數(shù)組之后,緊接著就需要判斷一下K線數(shù)組的長度,因為如果K線數(shù)組太短,不足以計算指標時就會出現(xiàn)異常。所以我們在這里使用if語句,判斷如果K線數(shù)組小于指標參數(shù)時,就直接返回。

在使用talib計算指標時,它所傳入的參數(shù)是numpy.array類型數(shù)據(jù),所以還要把K線數(shù)組中的必要數(shù)據(jù)提取出來,并轉(zhuǎn)換成numpy.array類型數(shù)據(jù)。這里我們自定義一個get_data函數(shù),先別必要的數(shù)據(jù)提取出來。

# 把K線數(shù)組轉(zhuǎn)換成最高價和最低價數(shù)組,用于轉(zhuǎn)換為numpy.array類型數(shù)據(jù)
def get_data(bars):
 arr = [[], []]
 for i in bars:
 arr[0].Append(i['High'])
 arr[1].append(i['Low'])
 return arr
 
 
exchange.SetContractType("ZC000") # 訂閱期貨品種
bars = exchange.GetRecords() # 獲取K線數(shù)組
if len(bars) < cycle_length + 1: # 如果K線數(shù)組的長度太小,所以直接返回
 return
np_arr = np.array(get_data(bars)) # 把列表轉(zhuǎn)換為numpy.array類型數(shù)據(jù),用于計算AROON的值
aroon = talib.AROON(np_arr[0], np_arr[1], 20); # 計算阿隆指標
aroon_up = aroon[1][len(aroon[1]) - 2]; # 阿隆指標上線倒數(shù)第2根數(shù)據(jù)
aroon_down = aroon[0][len(aroon[0]) - 2]; # 阿隆指標下線倒數(shù)第2根數(shù)據(jù)

talib在計算阿隆指標時,需要三個參數(shù),依次是:最高價numpy.array類型數(shù)據(jù)、最低價numpy.array類型數(shù)據(jù)、時間周期。所以我們在自定義get_data函數(shù)中只需要把K線數(shù)組中的最高價和最低價提取出來就可以了,并把它們都轉(zhuǎn)換成numpy.array類型數(shù)據(jù)。

緊接著,就可以計算阿隆指標了,直接調(diào)用talib.AROON方法并傳入?yún)?shù)。計算后的阿隆指標是一個二維數(shù)組,所以我們分別把阿隆指標上線和下線分別提取出來,以便于判斷開平倉邏輯。

第五步:下單交易
在下單交易之前,我們要先獲取當前最新價格,因為在下單時需要在函數(shù)中傳入下單價格。還需要引入全局變量mp,主要用于控制虛擬倉位。

close0 = bars[len(bars) - 1].Close; # 獲取當根K線收盤價
global mp # 全局變量,用于控制虛擬倉位
if mp == 0 and aroon_up > aroon_down and aroon_up > 50: # 如果當前空倉,并且阿隆上線大于下線,并且阿隆上線大于50
 exchange.SetDirection("buy") # 設(shè)置交易方向和類型
 exchange.Buy(close0, 1) # 開多單
 mp = 1 # 設(shè)置虛擬持倉的值,即有多單
 
if mp == 0 and aroon_down > aroon_up and aroon_down > 50: # 如果當前空倉,并且阿隆下線大于上線,并且阿隆下線小于50
 exchange.SetDirection("sell") # 設(shè)置交易方向和類型
 exchange.Sell(close0 - 1, 1) # 開空單
 mp = -1 # 設(shè)置虛擬持倉的值,即有空單
 
if mp > 0 and (aroon_up < aroon_down or aroon_up < 50): # 如果當前持有多單,并且阿隆上線小于下線或者阿隆上線小于50
 exchange.SetDirection("closebuy") # 設(shè)置交易方向和類型
 exchange.Sell(close0 - 1, 1) # 平多單
 mp = 0 # 設(shè)置虛擬持倉的值,即空倉
 
if mp < 0 and (aroon_down < aroon_up or aroon_down < 50): # 如果當前持有空單,并且阿隆下線小于上線或者阿隆下線小于50
 exchange.SetDirection("closesell") # 設(shè)置交易方向和類型
 exchange.Buy(close0, 1) # 平空單
 mp = 0 # 設(shè)置虛擬持倉的值,即空倉

萬事俱備之后,就可以判斷策略邏輯并開平倉下單交易了。在判斷策略邏輯時肯定是使用if語句,先判斷mp的持倉狀態(tài),然后再判斷阿隆上線和下線的相互位置關(guān)系。需要注意的是在期貨交易下單之前,先指定交易的方向類型,即:開多、開空、平多、平空。調(diào)用exchange.SetDirection()函數(shù),分別傳入:“buy”、“sell”、“closebuy”、“closesell”。最后下單之后重置持倉狀態(tài)mp的值。

完整策略

'''backtest
start: 2015-02-22 00:00:00
end: 2019-10-29 00:00:00
period: 1d
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''


import talib
import numpy as np


# 外部參數(shù)
# cycle_length = 100


# 定義全局變量
mp = 0 # 用于控制虛擬持倉


# 把K線數(shù)組轉(zhuǎn)換成最高價和最低價數(shù)組,用于轉(zhuǎn)換為numpy.array類型數(shù)據(jù)
def get_data(bars):
 arr = [[], []]
 for i in bars:
 arr[0].append(i['High'])
 arr[1].append(i['Low'])
 return arr


# 策略主函數(shù)
def onTick():
 exchange.SetContractType("ZC000") # 訂閱期貨品種
 bars = exchange.GetRecords() # 獲取K線數(shù)組
 if len(bars) < cycle_length + 1: # 如果K線數(shù)組的長度太小,所以直接返回
 return
 np_arr = np.array(get_data(bars)) # 把列表轉(zhuǎn)換為numpy.array類型數(shù)據(jù),用于計算AROON的值
 aroon = talib.AROON(np_arr[0], np_arr[1], 20); # 計算阿隆指標
 aroon_up = aroon[1][len(aroon[1]) - 2]; # 阿隆指標上線倒數(shù)第2根數(shù)據(jù)
 aroon_down = aroon[0][len(aroon[0]) - 2]; # 阿隆指標下線倒數(shù)第2根數(shù)據(jù)
 close0 = bars[len(bars) - 1].Close; # 獲取當根K線收盤價
 global mp # 全局變量,用于控制虛擬倉位
 if mp == 0 and aroon_up > aroon_down and aroon_up > 50: # 如果當前空倉,并且阿隆上線大于下線,并且阿隆上線大于50
 exchange.SetDirection("buy") # 設(shè)置交易方向和類型
 exchange.Buy(close0, 1) # 開多單
 mp = 1 # 設(shè)置虛擬持倉的值,即有多單
 
 if mp == 0 and aroon_down > aroon_up and aroon_down > 50: # 如果當前空倉,并且阿隆下線大于上線,并且阿隆下線小于50
 exchange.SetDirection("sell") # 設(shè)置交易方向和類型
 exchange.Sell(close0 - 1, 1) # 開空單
 mp = -1 # 設(shè)置虛擬持倉的值,即有空單
 
 if mp > 0 and (aroon_up < aroon_down or aroon_up < 50): # 如果當前持有多單,并且阿隆上線小于下線或者阿隆上線小于50
 exchange.SetDirection("closebuy") # 設(shè)置交易方向和類型
 exchange.Sell(close0 - 1, 1) # 平多單
 mp = 0 # 設(shè)置虛擬持倉的值,即空倉
 
 if mp < 0 and (aroon_down < aroon_up or aroon_down < 50): # 如果當前持有空單,并且阿隆下線小于上線或者阿隆下線小于50
 exchange.SetDirection("closesell") # 設(shè)置交易方向和類型
 exchange.Buy(close0, 1) # 平空單
 mp = 0 # 設(shè)置虛擬持倉的值,即空倉
 

# 程序入口
def main():
 while True: # 進入無限循環(huán)模式
 onTick() # 執(zhí)行策略主函數(shù)
 Sleep(1000) # 休眠1秒

完整策略源代碼已經(jīng)公開,可以直接 https://www.fmz.com/strategy/173417 復(fù)制,無需配置直接在線回測。

阿隆指標的優(yōu)缺點

優(yōu)點:阿隆指標可以判斷趨勢行情的狀態(tài),兼顧發(fā)現(xiàn)市場趨勢行情以及判斷價格轉(zhuǎn)向的能力,幫助交易者提高資金的使用率,這個優(yōu)勢震蕩行情中尤為重要。

缺點:阿隆指標只是趨勢跟蹤系列指標中的一種,同樣也有趨勢跟蹤指標的缺點。并且它只判斷指定時間最高價或最低價的周期數(shù),但有時候最高價或最低價在整個行情走勢中會有偶然性,這個偶然性會干擾阿隆指標本身,造成虛假信號。

總結(jié)

在策略中我們固定了一部分參數(shù),如:aroonUp或aroonDown大于小于50,造成策略的滯后性,很多情況下是行情上漲或下跌一段時間才開平倉買賣。這樣雖然提高了勝率,減少了最大回撤率,但也錯過了很多收益,這也印證了盈虧同源的道理。有興趣的朋友可以深入研究一下,并加以改進。

分享到:
標簽:策略
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定