01 引言趨勢跟蹤策略旨在根據(jù)市場趨勢的方向來進行交易,即如果市場處于上升趨勢,那么投資者應該買入,并且保持這種頭寸直到趨勢結束。同樣地,如果市場處于下降趨勢,投資者應該賣空,并且保持這種頭寸直到趨勢結束。這種策略基于市場趨勢的延續(xù)性原則,即市場趨勢通常會在一段時間內(nèi)持續(xù)。常用的工具包括k線、壓力和支撐、趨勢線,均線,交易模式等。趨勢跟蹤也可以稱為右手交易策略。其交易理念基于至少五個基本假設:第一,市場價格包含所有當前信息;第二,價格波動按照一定的趨勢運行;第三,可以現(xiàn)實地清晰判斷市場走勢;第四,趨勢能走多遠,無法預料;第五,市場趨勢可以跟蹤交易,最終利。 趨勢跟蹤策略包括以下幾種交易策略: - 均線策略:根據(jù)價格在一定期間內(nèi)的均值來判斷市場趨勢,具體使用的指標包括雙均線,多重均線, MACD指標等。
- 動量策略:動量策略是通過股票的價格和交易量的變化來判斷股票的趨勢方向。例如,當股票價格和交易量都在上漲時,可以認為股票處于上升趨勢中,買入股票;當股票價格和交易量都在下跌時,可以認為股票處于下降趨勢中,賣出股票。其核心邏輯主要是利用市場信息的不對稱性。有的人對股票的利好消息反應快,有的人對利好消息反應慢,導致了股票連續(xù)上漲的慣性。常用的指標有漲跌天數(shù)等。
- 價格通道策略:根據(jù)股票價格波動的上下限來判斷市場趨勢,通常使用布林帶或移動平均線通道指標,如唐奇安通道和布林帶策略。
下面基于 qstock 包對這些交易策略進行簡單的量化回測,關于qstock的安裝和使用介紹參見推文:【手把手教你】使用qstock進行量化回測 02 均線策略雙均線策略 Moving Average 移動平均線反應了某一段時間內(nèi)的平均價格,雙均線交叉系統(tǒng)利用兩根不同周期的移動平均線的交叉作為趨勢確認形成的信號,這通常是指一根較小周期的均線上穿或者下穿較長周期均線形成多頭或者空頭趨勢的信號。其原理是認為較短周期的移動均線較能反應近期的行情方向,當其上穿或者下穿較長周期的移動均價線時,會有很大可能形成該方向的趨勢。 import pandas as pdimport numpy as npimport qstock as qs
def ma_trend_follow(code='中國平安',sma=20,lma=60,benchmark='hs300',start='20100101',end='20230317'): df=qs.data_feed(code,index=benchmark,start=start,end=end) df['sma']=df.close.rolling(sma).mean() df['lma']=df.close.rolling(lma).mean() #短期均線大于長期均線發(fā)出買入信號設置為1 df.loc[(df['sma']>df['lma']), 'signal'] = 1 #當短期均線跌破長期均線發(fā)出賣出信號設置為0 df.loc[(df['sma']<=df['lma']), 'signal'] = 0 #當倉位為1時,買入或持倉,當倉位為0時,賣出或空倉,計算資金凈值 df['position']=df['signal'].shift(1) df['position'].fillna(method='ffill',inplace=True) df['capital_ret']=df.rets.values*df['position'] #計算策略累計收益率 df['capital_line']=(df.capital_ret+1.0).cumprod() return df
qs.start_backtest(ma_trend_follow())
將“中國平安”換成“曉程科技”,同時把參數(shù)改成短期均線7日,長期均線14日,回測結果如下所示。 qs.start_backtest(ma_trend_follow('曉程科技',sma=7,lma=14)) MACD交易策略 MACD Strategy MACD交易策略是一種趨勢跟蹤策略,它通過計算股票價格的長期移動平均線和短期移動平均線之間的差異來發(fā)現(xiàn)市場趨勢的變化。MACD由快速移動平均線(EMA12)和慢速移動平均線(EMA26)之間的差異以及它們的移動平均線(信號線EMA9)組成。 當MACD的快速線(12日EMA)向上穿過慢速線(26日EMA),產(chǎn)生所謂的“金叉”,通常被視為買入信號;相反,當快速線向下穿過慢速線時產(chǎn)生“死叉”,通常被視為賣出信號。 def macd_trend_follow(code='中國平安',benchmark='hs300',start='20100101',end='20230317'): df=qs.data_feed(code,index=benchmark,start=start,end=end) df['EMA12'] = df['close'].ewm(span=12, adjust=False).mean() df['EMA26'] = df['close'].ewm(span=26, adjust=False).mean() df['MACD'] = df['EMA12'] - df['EMA26'] df['Signal'] = df['MACD'].ewm(span=9, adjust=False).mean() # 計算金叉和死叉信號 df['position'] = 0 df.loc[df['MACD'] > df['Signal'], 'position'] = 1 # 金叉買入 df.loc[df['MACD'] < df['Signal'], 'position'] = 0 # 死叉賣出 df['position'] = df['position'].shift(1).fillna(0) # 將信號序列向前移動一位,防止未來數(shù)據(jù)干擾 #df['position'].fillna(method='ffill',inplace=True) df['capital_ret']=df.rets.values*df['position'] #計算策略累計收益率 df['capital_line']=(df.capital_ret+1.0).cumprod() return df
qs.start_backtest(macd_trend_follow())
03 動量交易策略動量交易策略是一種趨勢跟蹤策略,它認為市場上漲或下跌的趨勢會持續(xù)一段時間,因此通過觀察過去一段時間內(nèi)資產(chǎn)價格的走勢來預測未來的價格變動,并根據(jù)預測結果進行交易。 def mom_trend_follow(code='中國平安',benchmark='hs300',n=30,start='20100101',end='20230317'): df=qs.data_feed(code,index=benchmark,start=start,end=end) # 計算收益率 df['returns'] = df['close'].pct_change() # 計算動量指標 df['momentum'] = df['returns'].rolling(n).mean() # 計算交易信號 df['position'] = df['momentum'].apply(lambda x: 1 if x > 0 else 0) df['position'] = df['position'].shift(1).fillna(0) # 將信號序列向前移動一位,防止未來數(shù)據(jù)干擾 #df['position'].fillna(method='ffill',inplace=True) df['capital_ret']=df.rets.values*df['position'] #計算策略累計收益率 df['capital_line']=(df.capital_ret+1.0).cumprod() return df
qs.start_backtest(mom_trend_follow())
04 價格通道交易策略價格通道交易策略主要有以下幾種: 布林帶策略:利用布林帶指標來判斷股價的波動情況和趨勢,進而進行交易。 Keltner Channel策略:由股票交易員 Chester Keltner 所創(chuàng)造,該指標是基于移動平均線和真實波幅指標計算得出的通道指標。 Donchian Channel策略:該指標是基于價格波動的最高點和最低點所形成的通道,通常選擇20日或者30日作為計算周期。 Envelopes策略:該指標是由一條中心線和上下兩條通道組成,中心線通常為移動平均線,上下通道的寬度由一定的比例參數(shù)決定。 ATR Channel策略:該指標基于股票的波動性,通常使用股票的平均真實波幅(ATR)指標來確定價格通道的范圍。 以上這些價格通道策略都可以用于判斷趨勢和波動,進而進行交易。具體選擇哪種策略要根據(jù)個人的投資風格、資金管理和市場情況來定奪。下面主要介紹布林帶交易策略。 布林帶交易策略 Bollinger Band 當布林帶開口向上或傾斜上升,當價格上漲并觸及布林帶中軌線時,你可以立即入場做多(只要觸及中軌線即可入場);反之,當前一日價格突破了布林帶上軌,且價格和均線趨勢掉頭向下,布林帶開口向下或傾斜下降時做空。 def pp_trend_follow(code='中國平安',benchmark='hs300',n=20,k=1,start='20100101',end='20230317'): df=qs.data_feed(code,index=benchmark,start=start,end=end) # 計算價格通道指標 df['sma'] = df['close'].rolling(n).mean() df['std'] = df['close'].rolling(n).std() df['upper_band'] = df['sma'] + k * df['std'] df['lower_band'] = df['sma'] - k * df['std'] # 根據(jù)布林帶中軌線進行交易 df['position'] = 0 for i in range(1, len(df)): # 上漲趨勢,價格回撤并觸及中軌線,買入 if df['sma'][i] > df['sma'][i-1] and df['close'][i-1] > df['sma'][i-1] and df['close'][i] >= df['sma'][i]: df['position'][i] = 1 # 下跌趨勢,價格反彈并觸及中軌線,賣出 elif df['sma'][i] < df['sma'][i-1] and df['close'][i] < df['close'][i-1] and df['close'][i-1] > df['upper_band'][i-1]: df['position'][i] = -1 # 將信號序列向前移動一位,防止未來數(shù)據(jù)干擾 df['position'] = df['position'].shift(1).fillna(0) #df['position'].fillna(method='ffill',inplace=True) df['capital_ret']=df.rets.values*df['position'] #計算策略累計收益率 df['capital_line']=(df.capital_ret+1.0).cumprod() return df
qs.start_backtest(pp_trend_follow())
Keltner Channel交易策略 KC Strategy Keltner Channel是一種價格通道交易策略,與布林帶相似,但使用不同的計算方法。它由三條線組成:中軌線,上軌線和下軌線。中軌線是一個移動平均線,通常使用20日或50日的簡單移動平均線。上軌線和下軌線是根據(jù)股票價格的波動率來計算的,通常使用股票價格的平均真實范圍(ATR)。Keltner Channel交易策略的基本思路是,當股票價格穿過上軌線時,表示市場處于超買狀態(tài),可以賣出;當股票價格穿過下軌線時,表示市場處于超賣狀態(tài),可以買入。關于該交易策略的回測留待讀者自己完成。完整版見Python金融量化知識星球。 結語趨勢跟蹤交易策略是一種相對簡單且易于理解的交易策略,其基本思想是在市場存在趨勢時,通過跟隨趨勢方向來獲取收益。在實踐中,趨勢跟蹤交易策略被廣泛應用于股票、期貨、外匯等市場。 相對于其他交易策略,趨勢跟蹤策略的優(yōu)勢在于可以通過較少的交易來獲取較高的收益率,尤其是在市場存在明顯趨勢的時候。同時,趨勢跟蹤交易策略也可以提高交易的勝率和風險控制能力,因為在趨勢明顯的時候,交易者可以更加自信地持有頭寸,減少不必要的交易操作。 值得注意的是,趨勢跟蹤交易策略需要市場具備足夠的趨勢性,才能夠發(fā)揮較好的效果。換句話說,趨勢跟蹤交易策略并非適用于所有市場和所有交易者,因為市場并非總是存在趨勢,而且趨勢的變化也很難預測。在中國A股市場中,由于市場波動較大、個股投機情緒較為普遍,市場整體趨勢性相對較弱。因此,趨勢跟蹤交易策略在中國A股市場中的表現(xiàn)可能不如在某些其他市場中的表現(xiàn)。趨勢跟蹤交易策略需要有一定的市場觀察能力和交易經(jīng)驗。需要觀察市場走勢、價格變化等多個方面的信息,并能夠進行較為準確的判斷,才能夠更好地發(fā)揮趨勢跟蹤交易策略的效果。同時,還需要具備良好的風險控制能力,能夠靈活地控制倉位和止損。
|