新聞中心
這篇文章將為大家詳細(xì)講解有關(guān)Python中怎么實(shí)現(xiàn)一個(gè)菲阿里四價(jià)策略,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供嘉善網(wǎng)站建設(shè)、嘉善做網(wǎng)站、嘉善網(wǎng)站設(shè)計(jì)、嘉善網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、嘉善企業(yè)網(wǎng)站模板建站服務(wù),十載嘉善做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
菲阿里簡(jiǎn)介
菲阿里是一位日本的交易者,主要偏向于商品期貨日內(nèi)主觀交易。其大名遠(yuǎn)揚(yáng)是在2001年的羅賓斯(ROBBINS-TAICOM)期貨冠軍大賽中,以1098%的成績(jī)獲得冠軍。并且在之后的兩年里再以709%、1131%的成績(jī)奪冠。從成績(jī)就知道,菲阿里是一個(gè)非常優(yōu)秀的交易者。
幸運(yùn)的是,菲阿里在《1000%的男人》這本書中詳盡敘述了他的交易方法,菲阿里四價(jià)策略正是后人總結(jié)他的交易方法。雖然只是從外在形式加上自己的理解模仿了一部分,并不代表菲阿里全部交易精髓,但至少可以幫助我們?cè)跇?gòu)建策略時(shí)拓展思路。
策略邏輯
菲阿里四價(jià)策略是一種比較簡(jiǎn)單的趨勢(shì)性日內(nèi)交易策略,四價(jià)分別是指:昨天高點(diǎn)、昨天低點(diǎn)、昨日收盤價(jià)、今天開盤價(jià)。從書中的交易筆記來看,菲阿里不使用任何分析工具,而是大量應(yīng)用阻溢線的概念,也就是通常我們所說的阻力線和支撐線。
阻力線 = 昨日最高價(jià)
支撐線 = 昨日最低價(jià)
對(duì)于阻力線和支撐線的定義,他使用的是昨日最高價(jià)和昨日最低價(jià),可以視為昨天價(jià)格的波動(dòng)范圍,這也意味著多頭或空頭只有足夠的力量時(shí),才會(huì)有效突破阻力線和支撐線。并且一旦有突破這個(gè)波動(dòng)范圍,則說明價(jià)格背后的動(dòng)能較大,后續(xù)走勢(shì)可能會(huì)沿最小阻力線運(yùn)動(dòng)的概率較大。
多頭開倉:價(jià)格突破阻力線
空頭開倉:價(jià)格突破支撐線
如果開盤價(jià)處于阻力線和支撐線之間,當(dāng)價(jià)格向上突破阻力線就建立多頭,當(dāng)價(jià)格向下突破支撐線就建立空頭。如果一切順利,則一直持倉到收盤。這樣做的好處是,符合了充分非必要條件,即突破不一定上漲/下跌,但上漲/下跌一定會(huì)突破,也就是始終守在行情發(fā)生的必經(jīng)之路伺機(jī)而動(dòng),因?yàn)檩^大行情的上漲和下跌一旦出現(xiàn),勢(shì)必要突破阻力線和支撐線的。
當(dāng)然這也是出錯(cuò)率最高的方法,因?yàn)楹芏鄷r(shí)候價(jià)格只是暫時(shí)性的突破了關(guān)鍵位置,如果貿(mào)然開倉可能會(huì)面臨價(jià)格隨時(shí)反向運(yùn)動(dòng)的風(fēng)險(xiǎn)。這時(shí)就需要設(shè)置一些過濾條件,限制假突破造成的來回開平倉問題。另外在交易周期上也盡量避免波動(dòng)過于混亂的5分鐘周期以下K線。
但是開倉后,盈利了還好,如果遇到虧損,總不能從小虧損一直積累到大虧損,才在收盤時(shí)平倉吧,這樣顯然不合理。所以我們對(duì)于平倉有兩種處理方式:收盤平倉和止損平倉。如果K線上破高點(diǎn)或下破低點(diǎn)后又回到原來的區(qū)間內(nèi),就要考慮止損了。
多頭平倉:收盤前5分鐘或達(dá)到多頭止損線
空頭平倉:收盤前5分鐘或達(dá)到空頭止損線
實(shí)際上菲阿里在主觀交易中,還有很多交易方法,包括:開盤后先漲后跌,跌破開盤價(jià)做空,止損設(shè)在之前上漲的最高點(diǎn);開盤后先跌后漲,突破開盤價(jià)做多,止損設(shè)在之前下跌的最低點(diǎn)。動(dòng)手能力強(qiáng)的朋友可以在自己的策略中增改。
到這里你會(huì)發(fā)現(xiàn),對(duì)于一天的價(jià)格走勢(shì)來說,收盤價(jià)相對(duì)于開盤價(jià)的漲跌,其概率接近于50%。菲阿里的交易方法在勝率上就利于不敗之地,再加上行情順利的時(shí)候一直持倉到收盤,在行情不符合自己的預(yù)期時(shí)及時(shí)止損。形成了截?cái)嗵潛p,讓利潤奔跑的正向交易方式,這也是長(zhǎng)期交易下來積累利潤的原因。
策略編寫
第1步:編寫策略框架
# 策略主函數(shù) def onTick(): pass # 程序入口 def main(): while True: # 進(jìn)入無限循環(huán)模式 onTick() # 執(zhí)行策略主函數(shù) Sleep(1000) # 休眠1秒
定義一個(gè)main函數(shù)和一個(gè)onTick函數(shù),然后再main函數(shù)中,寫入while循環(huán),重復(fù)執(zhí)行onTick函數(shù)。
第2步:導(dǎo)入庫
import time # 用于轉(zhuǎn)換時(shí)間格式
因?yàn)槲覀冞@個(gè)是日內(nèi)策略,到時(shí)候需要判斷K線時(shí)間戳,如果有持倉,并且臨近收盤時(shí)平倉出局。那么我們就直接import time就可以了。
第3步:獲取基礎(chǔ)數(shù)據(jù)
bar_arr = _C(exchange.GetRecords, PERIOD_D1) # 獲取日線數(shù)組 if len(bar_arr) < 2: # 如果小于2根K線 return # 返回繼續(xù)等待數(shù)據(jù) yesterday_high = bar_arr[-2]['High'] # 昨日最高價(jià) yesterday_low = bar_arr[-2]['Low'] # 昨日最低價(jià) yesterday_close = bar_arr[-2]['Close'] # 昨日收盤價(jià) today_open = bar_arr[-1]['Open'] # 當(dāng)日開盤價(jià)
菲阿里四價(jià)需要用到四個(gè)數(shù)據(jù):昨日最高價(jià)、昨日最低價(jià)、昨日收盤價(jià)、當(dāng)日開盤價(jià)。因?yàn)檫@些都是日線級(jí)別的數(shù)據(jù),所以我們?cè)谑褂肎etRecords的時(shí)候,可以直接傳入PERIOD_D1參數(shù),表明我們要獲取的是日K,這樣無論你的策略加載的是哪個(gè)周期的數(shù)據(jù),它始終獲取的都是日線級(jí)別的數(shù)據(jù)。
另外,細(xì)心的朋友可能已經(jīng)發(fā)現(xiàn),為什么這一次在調(diào)用GetRecords的時(shí)候,代碼的寫法跟以前不一樣?這次我們使用的是發(fā)明者量化軟件內(nèi)置的重試函數(shù)_C()。使用這個(gè)函數(shù)的好處是,該函數(shù)會(huì)一直調(diào)用指定函數(shù)到成功返回,這樣可以避免直接使用GetRecords函數(shù)時(shí),沒有獲取到數(shù)據(jù)導(dǎo)致報(bào)錯(cuò)的情況。
第4步:處理時(shí)間和獲取最新價(jià)格
bar_arr = _C(exchange.GetRecords) # 獲取當(dāng)前設(shè)置周期K線數(shù)組 current_time = bar_arr[-1]['Time'] # 獲取當(dāng)前K線時(shí)間戳 time_local = time.localtime(current_time / 1000) # 處理時(shí)間戳 hour = int(time.strftime("%H", time_local)) # 格式化時(shí)間戳,并獲取小時(shí) minute = int(time.strftime("%M", time_local)) # 格式化時(shí)間戳,并獲取分鐘 current_close = bar_arr[-1]['Close'] # 獲取最新價(jià)格
既然是獲取當(dāng)前的時(shí)間,那么肯定是使用獲取當(dāng)前設(shè)置周期的K線數(shù)據(jù)更為合適,所以需要重新使用一次GetRecords,這次我們同樣也是使用_C()重試函數(shù),在不傳入?yún)?shù)的情況下,就是默認(rèn)獲取當(dāng)前設(shè)置周期的K線數(shù)組。另外,獲取最新價(jià)格的目的是,計(jì)算交易邏輯和下單。
第5步:處理時(shí)間
def trade_time(hour, minute): hour = str(hour) minute = str(minute) if len(minute) == 1: minute = "0">
之所以創(chuàng)建這個(gè)函數(shù),是因?yàn)槲覀冊(cè)陂_倉之前,需要判斷當(dāng)前時(shí)間,是否在我們規(guī)定的交易時(shí)間之內(nèi),以及有持倉的時(shí)候,當(dāng)前時(shí)間是否臨近收盤。在第4步中,我們已經(jīng)獲取到了當(dāng)前K線小時(shí)和分鐘,為了方便比較,我們采用小時(shí)加分鐘的方法,比如:如果K線時(shí)間是9:05,那么trade_time返回的結(jié)果就是905;如果K線時(shí)間是14:30,那么trade_time返回的結(jié)果就是1430等等。
第6步:獲取持倉
real_position = _C(exchange.GetPosition) # 獲取持倉數(shù)組 if len(real_position) > 0: # 如果持倉數(shù)組長(zhǎng)度大于0 real_position = real_position[0] if real_position['ContractType'] == 'rb888': # 如果持倉品種等于訂閱品種 if real_position['Type'] == 0 or real_position['Type'] == 2: # 如果是多單 mp = real_position['Amount'] # 賦值持倉為正數(shù) elif real_position['Type'] == 1 or real_position['Type'] == 3: mp = -real_position['Amount'] # 賦值持倉為負(fù)數(shù) else: mp = 0 # 賦值持倉為0
在之前的章節(jié)中,我們一直使用的是虛擬持倉,雖然編寫起來簡(jiǎn)單,但只能適用于理想環(huán)境下。為了更貼近實(shí)戰(zhàn),在之后的章節(jié)中,我們將使用真實(shí)的持倉數(shù)據(jù)。要獲取真實(shí)的持倉數(shù)據(jù),其實(shí)也沒那么難,直接使用發(fā)明者量化軟件的GetPosition方法,就可以獲取到當(dāng)前賬戶的所有持倉。
GetPosition返回的是一個(gè)包含字典的一維數(shù)組:
# 例子 [{'MarginLevel': 16, 'Amount': 1.0, 'FrozenAmount': 0.0, 'Price': 3540.0, 'Profit': -30.0, 'Margin': 2124.0, 'Type': 0, 'ContractType': 'rb888'}]
其中,Amount是持倉數(shù)量、Price是開倉價(jià)格、Profit是當(dāng)前利潤、Type是多空方向(根據(jù)發(fā)明者量化API的定義,Type的值是0或2是代表多頭,1或3代表空頭)、ContractType是合約代碼。而我們把多頭持倉規(guī)整為正數(shù),把空頭持倉規(guī)整為負(fù)數(shù)。
第7步:設(shè)置止損
# 設(shè)置多頭止損 if today_open / yesterday_high > 1.005: # 如果當(dāng)天開盤價(jià)大于昨天最高價(jià) long_stop_loss = yesterday_high # 設(shè)置多頭止損價(jià)為昨天最高價(jià) elif today_open / yesterday_high < 0.995: # 如果當(dāng)天開盤價(jià)小于昨天最高價(jià) long_stop_loss = today_open # 設(shè)置多頭止損價(jià)為當(dāng)天開盤價(jià) else: # 如果當(dāng)天開盤價(jià)接近于昨天最高價(jià) long_stop_loss = (yesterday_high + yesterday_low) / 2 # 設(shè)置多頭止損為昨天中間價(jià) # 設(shè)置空頭止損 if today_open / yesterday_low < 0.995: # 如果當(dāng)天開盤價(jià)小于昨天最低價(jià) short_stop_loss = yesterday_low # 設(shè)置空頭止損價(jià)為昨天最低價(jià) elif today_open / yesterday_low > 1.005: # 如果當(dāng)天開盤價(jià)大于昨天最低價(jià) short_stop_loss = today_open # 設(shè)置空頭止損價(jià)為當(dāng)天開盤價(jià) else: # 如果當(dāng)天開盤價(jià)接近于昨天最低價(jià) short_stop_loss = (yesterday_high + yesterday_low) / 2 # 設(shè)置多頭止損為昨天中間價(jià)
在大多數(shù)情況下,價(jià)格突破阻力線和支撐線,就把止損設(shè)置到當(dāng)前開盤價(jià)這個(gè)位置。但是這里面有個(gè)問題:如果當(dāng)天開盤價(jià)大于阻力線,而價(jià)格往下走;或者當(dāng)天開盤價(jià)小于支撐線,而價(jià)格往上走,會(huì)造成邏輯錯(cuò)誤,導(dǎo)致頻繁開平倉。
為了解決這個(gè)問題,我們需要根據(jù)當(dāng)天開盤與阻力線和支撐線的位置關(guān)系,分別設(shè)置不同的止損價(jià)格。如果當(dāng)天開盤價(jià)大于昨天最高價(jià)0.5%,那么就把多頭的止損設(shè)置在昨天的最高價(jià);如果當(dāng)天開盤價(jià)在阻力線和支撐線之間,那么多頭的止損價(jià)格還是當(dāng)天的開盤價(jià);如果當(dāng)天開盤價(jià)接近于昨天最高價(jià),那么就把多頭的止損設(shè)置在昨天的中間價(jià)。設(shè)置空頭的止損也是根據(jù)這個(gè)道理。
第8步:下單交易
if mp > 0: # 如果當(dāng)前持有多單 if current_close < long_stop_loss or trade_time(hour, minute) > 1450: # 如果當(dāng)前價(jià)格小于多頭止損線,或者超過規(guī)定的交易時(shí)間 exchange.SetDirection("closebuy") # 設(shè)置交易方向和類型 exchange.Sell(current_close - 1, 1) # 平多單 if mp < 0: # 如果當(dāng)前持有空單 if current_close > short_stop_loss or trade_time(hour, minute) > 1450: # 如果當(dāng)前價(jià)格大于空頭止損線,或者超過規(guī)定的交易時(shí)間 exchange.SetDirection("closesell") # 設(shè)置交易方向和類型 exchange.Buy(current_close + 1, 1) # 平空單 if mp == 0 and 930 < trade_time(hour, minute) < 1450: # 如果當(dāng)前無持倉,并且在規(guī)定的交易時(shí)間內(nèi) if current_close > yesterday_high: # 如果當(dāng)前價(jià)格大于昨天最高價(jià) exchange.SetDirection("buy") # 設(shè)置交易方向和類型 exchange.Buy(current_close + 1, 1) # 開多單 elif current_close < yesterday_low: # 如果價(jià)格小于昨天最低價(jià) exchange.SetDirection("sell") # 設(shè)置交易方向和類型 exchange.Sell(current_close - 1, 1) # 開空單
關(guān)于Python中怎么實(shí)現(xiàn)一個(gè)菲阿里四價(jià)策略就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
當(dāng)前名稱:Python中怎么實(shí)現(xiàn)一個(gè)菲阿里四價(jià)策略
本文來源:http://www.dlmjj.cn/article/jsppoo.html