溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中怎么實(shí)現(xiàn)一個(gè)菲阿里四價(jià)策略

發(fā)布時(shí)間:2021-07-10 14:46:48 來源:億速云 閱讀:251 作者:Leah 欄目:互聯(lián)網(wǎng)科技

這篇文章將為大家詳細(xì)講解有關(guān)Python中怎么實(shí)現(xiàn)一個(gè)菲阿里四價(jià)策略,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

菲阿里簡(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à)格突破支撐線

Python中怎么實(shí)現(xiàn)一個(gè)菲阿里四價(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á)到空頭止損線

Python中怎么實(shí)現(xiàn)一個(gè)菲阿里四價(jià)策略

實(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,讓利潤(rùn)奔跑的正向交易方式,這也是長(zhǎng)期交易下來積累利潤(rùn)的原因。

策略編寫

第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)前利潤(rùn)、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ò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI