午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

海龜交易策略--量化交易經(jīng)典之作(附Python完整代碼)

 文公武夫 2024-07-04

一、引言

量化交易,作為金融市場(chǎng)的一種前沿交易方式,其核心在于利用數(shù)學(xué)模型和計(jì)算機(jī)技術(shù)對(duì)市場(chǎng)進(jìn)行深入分析,進(jìn)而執(zhí)行精準(zhǔn)的交易策略。在眾多量化交易策略中,海龜交易策略以其獨(dú)特的系統(tǒng)性和趨勢(shì)跟蹤能力,成為量化交易領(lǐng)域的經(jīng)典之作。

二、海龜交易策略概述

1. 起源與發(fā)展

海龜交易策略起源于20世紀(jì)80年代的美國,由著名交易員理查德·丹尼斯(Richard Dennis)提出。丹尼斯堅(jiān)信,優(yōu)秀的交易技能可以通過系統(tǒng)化培訓(xùn)獲得,而非僅僅依賴天賦。他通過培訓(xùn)一批“海龜”交易員,成功驗(yàn)證了這一理念,并將這套交易系統(tǒng)命名為“海龜交易系統(tǒng)”。

2. 核心原理

海龜交易策略以趨勢(shì)跟蹤為核心,致力于捕捉并利用市場(chǎng)中的中長期趨勢(shì)。該策略通過明確的入場(chǎng)、加倉、止損和止盈規(guī)則,實(shí)現(xiàn)了交易過程的系統(tǒng)化和機(jī)械化,為投資者提供了一種有效的交易方法。

三、海龜交易策略詳解

1. 建倉資金管理

海龜交易法將建倉資金按照一定比例劃分為若干個(gè)小部分,以實(shí)現(xiàn)資金的有效利用。每次建倉頭寸和加倉規(guī)模都與波動(dòng)量N(平均真實(shí)波動(dòng)振幅ATR)緊密相關(guān),確保在控制風(fēng)險(xiǎn)的同時(shí)追求最大收益。

2. 入市信號(hào)

海龜交易法采用理查德·唐奇安的通道突破系統(tǒng)作為入市信號(hào)。該系統(tǒng)包括兩個(gè)子系統(tǒng):系統(tǒng)一基于20日最高價(jià)或最低價(jià)突破,系統(tǒng)二基于55日價(jià)格突破。當(dāng)價(jià)格突破相應(yīng)系統(tǒng)的價(jià)格通道時(shí),即產(chǎn)生入市信號(hào)。

3. 加倉與止損

在捕捉到入市信號(hào)后,海龜交易法首先建立第一個(gè)交易單位的頭寸。當(dāng)市價(jià)繼續(xù)向盈利方向突破1/2N時(shí),策略將進(jìn)行加倉操作。止損位設(shè)為2N,每加倉一次,止損位提高1/2N,以確保在趨勢(shì)反轉(zhuǎn)時(shí)及時(shí)止損。

4. 止盈

海龜交易法的止盈規(guī)則根據(jù)交易周期的不同而有所差異。短期策略中,多頭頭寸在突破過去10日最低價(jià)處止盈離市,空頭頭寸在突破過去10日最高價(jià)處止盈離市。中長期策略中,止盈標(biāo)準(zhǔn)放寬至20日最低價(jià)和最高價(jià),以捕捉更大的市場(chǎng)趨勢(shì)。

四、策略實(shí)現(xiàn)與回測(cè)

1. 策略實(shí)現(xiàn)

在量化交易平臺(tái)上,海龜交易策略可以通過編寫策略代碼來實(shí)現(xiàn)。首先,需要獲取歷史數(shù)據(jù)并計(jì)算唐奇安通道和ATR。然后,根據(jù)價(jià)格突破通道的情況進(jìn)行開倉操作,并計(jì)算加倉和止損信號(hào)。

2. 回測(cè)結(jié)果

以DCE.i2012合約為例,通過設(shè)定初始資金、手續(xù)費(fèi)率和滑點(diǎn)比率等參數(shù)進(jìn)行回測(cè)。結(jié)果顯示,海龜交易策略在特定市場(chǎng)條件下表現(xiàn)出較好的盈利能力,但需注意市場(chǎng)環(huán)境、交易成本和參數(shù)選擇對(duì)策略有效性的影響。

3. 策略代碼(完整Python代碼)

# coding=utf-8from __future__ import print_function, absolute_import, unicode_literalsimport numpy as npimport pandas as pdfrom gm.api import *'''以短期為例:20日線第一步:獲取歷史數(shù)據(jù),計(jì)算唐奇安通道和ATR第二步:當(dāng)突破唐奇安通道時(shí),開倉。第三步:計(jì)算加倉和止損信號(hào)。'''def init(context): # 設(shè)置計(jì)算唐奇安通道的參數(shù) context.n = 20 # 設(shè)置合約標(biāo)的 context.symbol = 'DCE.i2012' # 設(shè)置交易最大資金比率 context.ratio = 0.8 # 訂閱數(shù)據(jù) subscribe(symbols=context.symbol, frequency='60s', count=2) # 獲取當(dāng)前時(shí)間 time = context.now.strftime('%H:%M:%S') # 如果策略執(zhí)行時(shí)間點(diǎn)是交易時(shí)間段,則直接執(zhí)行algo定義atr等參數(shù),以防直接進(jìn)入on_bar()導(dǎo)致atr等未定義 if '09:00:00' < time < '15:00:00' or '21:00:00' < time < '23:00:00': algo(context) # 如果是交易時(shí)間段,等到開盤時(shí)間確保進(jìn)入algo() schedule(schedule_func=algo, date_rule='1d', time_rule='09:00:00') schedule(schedule_func=algo, date_rule='1d', time_rule='21:00:00')def algo(context): # 計(jì)算通道的數(shù)據(jù):當(dāng)日最低、最高、上一交易日收盤 # 注:由于talib庫計(jì)算ATR的結(jié)果與公式求得的結(jié)果不符,所以這里利用公式計(jì)算ATR # 如果是回測(cè)模式,當(dāng)天的數(shù)據(jù)直接用history取到 if context.mode == 2: data = history_n(symbol=context.symbol, frequency='1d', count=context.n+1, end_time=context.now, fields='close,high,low,bob', df=True) # 計(jì)算ATR tr_list = [] for i in range(0, len(data)-1): tr = max((data['high'].iloc[i] - data['low'].iloc[i]), data['close'].shift(-1).iloc[i] - data['high'].iloc[i], data['close'].shift(-1).iloc[i] - data['low'].iloc[i]) tr_list.append(tr) context.atr = int(np.floor(np.mean(tr_list))) context.atr_half = int(np.floor(0.5 * context.atr)) # 計(jì)算唐奇安通道 context.don_open = np.max(data['high'].values[-context.n:]) context.don_close = np.min(data['low'].values[-context.n:]) # 如果是實(shí)時(shí)模式,當(dāng)天的數(shù)據(jù)需要用current取到 if context.mode == 1: data = history_n(symbol=context.symbol, frequency='1d', count=context.n, end_time=context.now, fields='close,high,low', df=True) # 計(jì)算ATR current_data = current(symbols=context.symbol) # 最新一個(gè)交易日的最高、最低 tr_list = [] for i in range(1, len(data)): tr = max((data['high'].iloc[i] - data['low'].iloc[i]), data['close'].shift(-1).iloc[i] - data['high'].iloc[i], data['close'].shift(-1).iloc[i] - data['low'].iloc[i]) tr_list.append(tr) # 把最新一期tr加入列表中 tr_new = max((current_data[0]['high'] - current_data[0]['low']), data['close'].iloc[-1] - current_data[0]['high'], data['close'].iloc[-1] - current_data[0]['low']) tr_list.append(tr_new) context.atr = int(np.floor(np.mean(tr_list))) context.atr_half = int(np.floor(0.5 * context.atr)) # 計(jì)算唐奇安通道 context.don_open = np.max(data['high'].values[-context.n:]) context.don_close = np.min(data['low'].values[-context.n:]) # 計(jì)算加倉點(diǎn)和止損點(diǎn) context.long_add_point = context.don_open + context.atr_half context.long_stop_loss = context.don_open - context.atr_half context.short_add_point = context.don_close - context.atr_half context.short_stop_loss = context.don_close + context.atr_halfdef on_bar(context, bars): # 提取數(shù)據(jù) symbol = bars[0]['symbol'] recent_data = context.data(symbol=context.symbol, frequency='60s', count=2, fields='close,high,low') close = recent_data['close'].values[-1] # 賬戶倉位情況 position_long = context.account().position(symbol=symbol, side=PositionSide_Long) position_short = context.account().position(symbol=symbol, side=PositionSide_Short) # 當(dāng)無持倉時(shí) if not position_long and not position_short: # 如果向上突破唐奇安通道,則開多 if close > context.don_open: order_volume(symbol=symbol, side=OrderSide_Buy, volume=context.atr, order_type=OrderType_Market, position_effect=PositionEffect_Open) print('開多倉atr') # 如果向下突破唐奇安通道,則開空 if close < context.don_close: order_volume(symbol=symbol, side=OrderSide_Sell, volume=context.atr, order_type=OrderType_Market, position_effect=PositionEffect_Open) print('開空倉atr') # 有持倉時(shí) # 持多倉,繼續(xù)突破(加倉) if position_long: # 當(dāng)突破1/2atr時(shí)加倉 if close > context.long_add_point: order_volume(symbol=symbol, volume=context.atr_half, side=OrderSide_Buy, order_type=OrderType_Market,position_effect=PositionEffect_Open) print('繼續(xù)加倉0.5atr') context.long_add_point += context.atr_half context.long_stop_loss += context.atr_half # 持多倉,止損位計(jì)算 if close < context.long_stop_loss: volume_hold = position_long['volume'] if volume_hold >= context.atr_half: order_volume(symbol=symbol, volume=context.atr_half, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Close) else: order_volume(symbol=symbol, volume=volume_hold, side=OrderSide_Sell, order_type=OrderType_Market,position_effect=PositionEffect_Close) print('平多倉0.5atr') context.long_add_point -= context.atr_half context.long_stop_loss -= context.atr_half # 持空倉,繼續(xù)突破(加倉) if position_short: # 當(dāng)?shù)萍觽}點(diǎn)時(shí)加倉 if close < context.short_add_point: order_volume(symbol = symbol, volume=context.atr_half, side=OrderSide_Sell, order_type=OrderType_Market, position_effect=PositionEffect_Open) print('繼續(xù)加倉0.5atr') context.short_add_point -= context.atr_half context.short_stop_loss -= context.atr_half # 持多倉,止損位計(jì)算 if close > context.short_stop_loss: volume_hold = position_short['volume'] if volume_hold >= context.atr_half: order_volume(symbol=symbol, volume=context.atr_half, side=OrderSide_Buy, order_type=OrderType_Market, position_effect=PositionEffect_Close) else: order_volume(symbol=symbol, volume=volume_hold, side=OrderSide_Buy, order_type=OrderType_Market,position_effect=PositionEffect_Close) print('平空倉0.5atr') context.short_add_point += context.atr_half context.short_stop_loss += context.atr_halfif __name__ == '__main__': ''' strategy_id策略ID,由系統(tǒng)生成 filename文件名,請(qǐng)與本文件名保持一致 mode實(shí)時(shí)模式:MODE_LIVE回測(cè)模式:MODE_BACKTEST token綁定計(jì)算機(jī)的ID,可在系統(tǒng)設(shè)置-密鑰管理中生成 backtest_start_time回測(cè)開始時(shí)間 backtest_end_time回測(cè)結(jié)束時(shí)間 backtest_adjust股票復(fù)權(quán)方式不復(fù)權(quán):ADJUST_NONE前復(fù)權(quán):ADJUST_PREV后復(fù)權(quán):ADJUST_POST backtest_initial_cash回測(cè)初始資金 backtest_commission_ratio回測(cè)傭金比例 backtest_slippage_ratio回測(cè)滑點(diǎn)比例 ''' run(strategy_id='strategy_id', filename='main.py', mode=MODE_BACKTEST, token='token', backtest_start_time='2020-02-15 09:15:00', backtest_end_time='2020-09-01 15:00:00', backtest_adjust=ADJUST_PREV, backtest_initial_cash=1000000, backtest_commission_ratio=0.0001, backtest_slippage_ratio=0.0001)

五、穩(wěn)健性分析

為了檢驗(yàn)海龜交易策略的穩(wěn)健性,我們進(jìn)行了多組回測(cè)并改變了策略標(biāo)的和計(jì)算唐奇安通道的參數(shù)n。結(jié)果顯示,不同標(biāo)的的收益結(jié)果呈現(xiàn)差異,其中大商所的鐵礦石表現(xiàn)較好。整體而言,海龜交易策略在使用上存在一定風(fēng)險(xiǎn),需要投資者根據(jù)市場(chǎng)環(huán)境進(jìn)行適當(dāng)調(diào)整和優(yōu)化。

設(shè)定初始資金100萬,手續(xù)費(fèi)率為0.01%,滑點(diǎn)比率為0.01%?;販y(cè)結(jié)果如下圖所示。

圖片

六、結(jié)論

海龜交易策略作為量化交易領(lǐng)域的經(jīng)典之作,以其系統(tǒng)化和趨勢(shì)跟蹤的特點(diǎn)為投資者提供了一種有效的交易方法。然而,該策略的有效性受市場(chǎng)環(huán)境、交易成本和參數(shù)選擇的影響。因此,投資者在使用海龜交易策略時(shí)應(yīng)充分了解其優(yōu)勢(shì)和局限,并結(jié)合自身情況和市場(chǎng)狀況進(jìn)行適當(dāng)?shù)恼{(diào)整和優(yōu)化。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多