Python告訴你,這樣買的股票才有靈魂

之前聽過一句話:要想賺大錢必須學會長線持倉,但如果要賺快錢就要學會日內交易。如今的量化交易范圍之廣令人驚嘆,各種交易策略層出不窮,其中最為流行的就是日內交易策略。
日內交易是一種快進快出的交易方式,由于可以控制隔夜風險的特點,得到了很多交易者的推崇和接受。為了幫助大家了解日內交易,豐富策略倉庫,本節我們將深入了解商品期貨中最為流行的日內策略之一日內高低點突破策略。

什么是日內交易

日內交易的目的是以更小的損失,來獲取當天市場微小的價格波動所帶來的利潤。它是指開倉和平倉在同一天內或同一交易時間段內完成的交易方式,開倉和平倉可以是單次,也可以是多次,只要是開平倉在同一個交易日前結束就行。理論上日內交易不承擔隔夜的跳空風險,相對來說是一種較完美的低風險交易策略,但實際上并非如此,雖然日內交易回避了跳空所帶來的風險,同時也錯失了跳空所帶來的利潤。但如果以正確的方式交易,通過配合不同的交易規則,日內交易往往也能產生豐厚的回報。

策略邏輯

我們知道判斷上漲趨勢最簡單的方法是,當前低點比前一個低點更高,當前高點也比前一個高點更高;同理下跌趨勢最簡單的方法是,當前低點比前一個低點更低,當前高點也比前一個高點更低。但如果僅僅以高低點的比較去判斷趨勢的漲跌,這未免太過簡陋,因為價格可能在一個點上來回跳動幾十次甚至上百次,從而導致交易過于頻繁。所以我們需要設定一個價格區間來過濾這些日常雜波,來對簡單的高低點突破策略進行完善。我們可以根據歷史行情所出現的最高價和最低價,組成一個包含上軌和下軌的通道。根據順勢交易的原則,當價格突破上軌時多頭開倉,當價格突破下軌時空頭開倉。多頭開倉:當前無持倉,時間是在開盤與收盤前10分鐘之間,并且價格大于上軌空頭開倉:當前無持倉,時間是在開盤與收盤前10分鐘之間,并且價格小于下軌多頭平倉:當前持多單,價格小于下軌,或者時間大于14:50空頭平倉:當前持空單,價格大于上軌,或者時間大于14:50有人統計過,大部分的窄幅止損都是無效的,小空間的止損會頻繁打臉,所以我們要做的就是設計一個寬幅止損:如果多頭開倉后,價格不升反跌,我們所要做的不是立即止損,而是等待觀望,直到價格跌破下軌才止損出局;空頭開倉后也是如此,當價格不跌反升,繼續等待價格是否會自我修正,直到跌破上軌才止損出局。

策略編寫

1. 導入time庫

import time

因為日內策略在編寫的時候,要判斷當前的時間來控制開平倉邏輯,這個策略在設計的時候是:只能在9點30分之14點50分之間開倉,14點50分之后全部平倉,其余的時間都過濾掉了。所以就需要引入time時間庫。2. 編寫策略框架

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

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

編寫策略就像蓋房子一樣,先把地基和框架搭建好,再往里面填充東西。我們這里用了兩個函數,一個是main主函數,另一個是onTick函數,程序會先從main函數執行代碼,在main函數中,我們用了一個無限循環模式,重復執行onTick函數。
3. 設置全局變量

mp = on_line = under_line = 0

在全局變量中,mp主要用于控制虛擬持倉,判斷持倉一般分為兩種,一種是真實的賬戶持倉,另一種就是虛擬持倉,還有一種是真實持倉和虛擬持倉聯合判斷。實盤時我們只使用真實持倉就足夠了,但這里為了簡化策略,作為演示使用虛擬持倉。on_line和under_line分別記錄上軌和下軌。
4. 處理時間

def can_time(hour, minute):
    hour = str(hour)
    minute = str(minute)
    if len(minute) == 1:
        minute = "0" + minute
    return int(hour + minute)

_C(exchange.SetContractType, "MA888")  # 訂閱期貨品種
bar_arr = _C(exchange.GetRecords)  # 獲取K線列表
if len(bar_arr) < 10:
    return
time_new = bar_arr[-1]['Time']  # 獲取當根K線的時間戳
time_local_new = time.localtime(time_new / 1000)  # 處理時間戳
hour_new = int(time.strftime("%H", time_local_new))  # 獲取小時
minute_new = int(time.strftime("%M", time_local_new))# 獲取分鐘
day_new = int(time.strftime("%d", time_local_new))# 當前K線日期
time_previous = bar_arr[-2]['Time']  # 獲取上根K線的時間戳
previous = time.localtime(time_previous / 1000)  # 處理時間戳
day_previous = int(time.strftime("%d", previous))  # 上根K線日期

注意:處理時間一共用于兩個地方:一個是判斷當前時間是否在我們規定的交易時間內,如果當前是在這個時間之內,并且已經達到了開倉條件就開倉,如果不是在這個時間之內,并且當前有持倉就平掉所有持倉,達到收盤前平倉的目的。另一個是判斷當前K線是不是最新交易日的K線,因為我們的策略邏輯是每當新的一天K線出現時,就重置上下軌。通過對比兩個K線的時間戳來重置on_line和under_line的值,也就是說上下軌通道是在不斷變化的。
5. 計算高低點上下軌

global mp, on_line, under_line  # 引入全局變量
high = bar_arr[-2]['High']  # 獲取上根K線的最高價
low = bar_arr[-2]['Low']  # 獲取上根K線的最低價
if day_new != day_previous:  # 如果是最新一根K線
    on_line = high * up # 重置上軌
    under_line = low * down  # 重置下軌
can_trade = can_time(hour_new, minute_new)
if can_trade < 930:  # 如果不是在規定交易的時間內
    if high > on_line:  # 如果上根K線最高價大于上軌
        on_line = high * up  # 重置上軌
    if low < under_line:  # 如果上根K線最低價小于下軌
        under_line = low * down  # 重置上軌
if on_line - under_line < 10:  # 如果上軌與下軌的差小于10
    return

計算高低點上下軌的邏輯其實非常簡單:如果當前是第一根K線,那么on_line和under_line的值分別是最高價和最低價,如果當前K線是最新交易日的K線,就重置on_line和under_line的值為最高價和最低價;一旦在規定的交易時間內,on_line和under_line的值就固定不變了,除非在這個時間之外并且如果上根K線最高價大于on_line就重置為最新的最高價;如果上根K線最低價小于under_line就重置為最新的最低價。5. 下單交易在下單交易之前,我們先獲取當前最新價格,因為在下單時需要在函數中傳入下單價格。然后使用if語句,根據之前設計的交易邏輯,先是判斷當前的持倉狀態,然后再判斷當前時間狀態,以及最新價格與上下軌的相互位置關系,最后下單交易并重置虛擬持倉狀態。

close_new = bar_arr[-1]['Close']  # 獲取最新價格(賣價),用于開平倉
# 如果持多單,并且價格小于下軌或者非規定的交易時間
if mp > 0 and (close_new < under_line or can_trade > 1450):
    exchange.SetDirection("closebuy")  # 設置交易方向和類型
    exchange.Sell(close_new - 1, 1)  # 平多單
    mp = 0  # 設置虛擬持倉的值,即空倉
# 如果持空單,并且價格大于上軌或者非規定的交易時間
if mp < 0 and (close_new > on_line or can_trade > 1450):
    exchange.SetDirection("closesell")  # 設置交易方向和類型
    exchange.Buy(close_new, 1)  # 平空單
    mp = 0  # 設置虛擬持倉的值,即空倉
if mp == 0 and 930 < can_trade < 1450: # 如果當前無持倉且在交易時間內
    if close_new > on_line:  # 如果價格大于上軌
        exchange.SetDirection("buy")  # 設置交易方向和類型
        exchange.Buy(close_new, 1)  # 開多單
        mp = 1  # 設置虛擬持倉的值,即有多單
    elif close_new < under_line: # 如果價格小于下軌
        exchange.SetDirection("sell")  # 設置交易方向和類型
        exchange.Sell(close_new - 1, 1)  # 開空單
       mp = -1  # 設置虛擬持倉的值,即有空單`</pre>

預測今天下午的天氣是很容易的,但是要想預測這個月內的天氣卻很難。日內交易不需要較長的持倉周期,所承受的市場波動風險較低,盡管這種交易方式不符合每個人的風格,但對于那些風險較為敏感的交易者來說,日內交易還是相當值得深入研究。

6. 完整策略代碼

下面是完整的策略代碼和注釋,你也可以在這個https://www.fmz.com/strategy/175316鏈接中,進入該策略主頁面,完整復制該策略代碼包括默認參數,并進行在線回測。

# 導入庫
import time

# 定義全局變量:虛擬持倉、上軌、下軌
mp = on_line = under_line = 0

# 處理時間函數
def can_time(hour, minute):
    hour = str(hour)
    minute = str(minute)
    if len(minute) == 1:
        minute = "0" + minute
    return int(hour + minute)

def onTick():
    _C(exchange.SetContractType, "MA888")  # 訂閱期貨品種
    bar_arr = _C(exchange.GetRecords)  # 獲取K線列表
    if len(bar_arr) < 10:
        return
    time_new = bar_arr[-1]['Time']  # 獲取當根K線的時間戳
    time_local_new = time.localtime(time_new / 1000)  # 處理時間戳
    hour_new = int(time.strftime("%H", time_local_new))  # 獲取小時
    minute_new = int(time.strftime("%M", time_local_new))# 獲取分鐘
    day_new = int(time.strftime("%d", time_local_new))# 當前K線日期
    time_previous = bar_arr[-2]['Time']  # 獲取上根K線的時間戳
    previous = time.localtime(time_previous / 1000)  # 處理時間戳
    day_previous = int(time.strftime("%d", previous))  # 上根K線日期
    global mp, on_line, under_line  # 引入全局變量
    high = bar_arr[-2]['High']  # 獲取上根K線的最高價
    low = bar_arr[-2]['Low']  # 獲取上根K線的最低價
    if day_new != day_previous:  # 如果是最新一根K線
        on_line = high * up # 重置上軌
        under_line = low * down  # 重置下軌
    can_trade = can_time(hour_new, minute_new)
    if can_trade < 930:  # 如果不是在規定交易的時間內
        if high > on_line:  # 如果上根K線最高價大于上軌
            on_line = high * up  # 重置上軌
        if low < under_line:  # 如果上根K線最低價小于下軌
            under_line = low * down  # 重置上軌
    if on_line - under_line < 10:  # 如果上軌與下軌的差小于10
        return
 close_new = bar_arr[-1]['Close']  # 獲取最新價格(賣價),用于開平倉
    # 如果持多單,并且價格小于下軌或者非規定的交易時間
    if mp > 0 and (close_new < under_line or can_trade > 1450):
        exchange.SetDirection("closebuy")  # 設置交易方向和類型
        exchange.Sell(close_new - 1, 1)  # 平多單
        mp = 0  # 設置虛擬持倉的值,即空倉
    # 如果持空單,并且價格大于上軌或者非規定的交易時間
    if mp < 0 and (close_new > on_line or can_trade > 1450):
        exchange.SetDirection("closesell")  # 設置交易方向和類型
        exchange.Buy(close_new, 1)  # 平空單
        mp = 0  # 設置虛擬持倉的值,即空倉
    if mp == 0 and 930 < can_trade < 1450: # 如果當前無持倉且在交易時間內
        if close_new > on_line:  # 如果價格大于上軌
            exchange.SetDirection("buy")  # 設置交易方向和類型
            exchange.Buy(close_new, 1)  # 開多單
            mp = 1  # 設置虛擬持倉的值,即有多單
        elif close_new < under_line: # 如果價格小于下軌
            exchange.SetDirection("sell")  # 設置交易方向和類型
            exchange.Sell(close_new - 1, 1)  # 開空單
            mp = -1  # 設置虛擬持倉的值,即有空單

def main():
    while True:
        onTick()
        Sleep(1000)`</pre>
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容