主頁 > 軟體設計 > 研報復現系列(二):【光大證券】基于阻力支撐相對強度(RSRS)的市場擇時

研報復現系列(二):【光大證券】基于阻力支撐相對強度(RSRS)的市場擇時

2021-04-25 11:27:09 軟體設計

1.研報概述

本文是券商金工研報復現系列的第二篇,文本復現了【光大證券】的【基于阻力支撐相對強度(RSRS)的市場擇時】,

阻力位與支撐位傳統的應用方法一般是選取特定的阻力位、支撐位作為閾值來進行突破、反轉策略的構建,常見的策略如均線策略:【若當日收盤價超過 20 日均線,則建倉買入,一直持倉至收盤價低于 20 日均線,賣出平倉】,

不同于選取阻力位與支撐位閾值區間的傳統應用方法,該篇研報關注阻力位與支撐位的相對強弱程度,

阻力位與支撐位實際上反應了交易者對市場狀態頂部和底部的預期判斷,

從直覺上看,如果這種預期判斷極易改變,則表明支撐位或阻力位的強度小,有效性弱;而如果眾多交易者預期較為一致、變動不大,則表明支撐位或阻力位強度高,有效性強,

如果支撐位的強度小,作用弱于阻力位,則表明市場參與者對于支撐位的分歧大于對于阻力位的分歧,市場接下來更傾向于向熊市轉變,而如果支撐位的強度大,作用強于阻力位,則表示市場參與者對于支撐位的認可度更高于對于阻力位的認可度,市場更傾向于在牛市轉變,
我們按照不同市場狀態分類來說明支撐阻力相對強度的應用邏輯:
1.市場在上漲牛市中:
如果支撐明顯強于阻力,牛市持續,價格加速上漲
如果阻力明顯強于支撐,牛市可能即將結束,價格見頂
2.市場在震蕩中:
如果支撐明顯強于阻力,牛市可能即將啟動
如果阻力明顯強于支撐,熊市可能即將啟動
3.市場在下跌熊市中:
如果支撐明顯強于阻力,熊市可能即將結束,價格見底
如果阻力明顯強于支撐,熊市持續,價格加速下跌

該篇研報構建衡量阻力位與支撐位相對強度的指標RSRS(Resistance Support Relative Strength),當支撐位強度小,阻力位強度大時,RSRS的值較高,相反RSRS的值較低,

2.研究環境

資料源:聚寬JoinQuant,2005.6-2017.5日線資料

import datetime 
import math
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import statsmodels.api as sm
import warnings
warnings.filterwarnings("ignore")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

3.研報復現

3.1量化阻力位支撐位相對強度RSRS

該研報要解決的首要問題是如何定義并量化阻力位與支撐位的相對強度,而解決該問題首先要選取一對合適的阻力位與支撐位指標,

3.1.1如何選取阻力位與支撐位

量化阻力位與支撐位相對強度的第一步,是選取合適的阻力位和支撐位指標,在技術分析學派中,已經有了許多對于支撐位與阻力位的定義,常見的包括通道線(布林帶的上下軌),一段時間內 的前高與前低,區間震蕩線(DPO)等等,

該篇研報選取每日的最高價和最低價作為阻力位和支撐位,因為每日的最高價和最低價可以迅速反應近期市場對于阻力位與支撐位態度的性質,

3.1.2RSRS構建的基本思想

本篇研報提出了多種相對強弱程度的量化方法,并且是逐層優化的關系,

這里對各自方法進行簡單的介紹,后面會給出每種量化方法構建的策略的效果,

基本思想:

這里使用最高價和最低價的相對變化速率,即類似 delta(high)/delta(low)的值來描

述支撐位與阻力位的相對強度,即最低價每變動 1 的時候,最高價變動的幅度,

基于該基本思想,原研報使用

線性回歸線的斜率

斜率標準分

修正標準分

右偏標準分

四種方法量化阻力支撐相對強弱程度,這四種方法是逐層遞進、優化的關系,

最后又結合價量資料優化策略,本文將會對每一種方法給出其計算方法和構建的策略的效果,

3.2 具體計算方法和策略效果

3.2.0 資料格式與策略統計函式

在給出具體的策略代碼之前,我們先介紹策略使用的資料格式,

在策略回測中,我們使用DataFrame格式的資料df,其不僅包含價格和RSRS指標的時間序列,還有flag和position兩列,

flag是開倉平倉標志位,df[‘flag’][i]為1時,表明第i日進行了開倉操作,df[‘flag’][i]為-1時,表明第i日進行了平倉操作,position是賬戶持倉標志位,其值為1表明當前賬戶持有證券,其值為0表明當前賬戶為空倉,

同時,本文構建的策略中,只有當前賬戶空倉時才進行買入操作

這里,我們先給出統計策略結果的函式,后文會多次用到該函式,

def calculate_statistics(df):
    '''
    輸入:
    DataFrame型別,包含價格資料和倉位、開平倉標志
        position列:倉位標志位,0表示空倉,1表示持有標的
        flag列:買入賣出標志位,1表示在該時刻買入,-1表示在該時刻賣出
        close列:日收盤價
        
    輸出:dict型別,包含夏普比率、最大回撤等策略結果的統計資料
    '''
    #凈值序列
    df['net_asset_pct_chg'] = df.net_asset_value.pct_change(1).fillna(0)
    
    #總收益率與年化收益率
    total_return = (df['net_asset_value'][df.shape[0]-1] -1)
    annual_return = (total_return)**(1/(df.shape[0]/252)) -1
    total_return = total_return*100
    annual_return = annual_return*100
    #夏普比率
    df['ex_pct_chg'] = df['net_asset_pct_chg']
    sharp_ratio = df['ex_pct_chg'].mean() * math.sqrt(252)/df['ex_pct_chg'].std()
    
    #回撤
    df['high_level'] = (
            df['net_asset_value'].rolling(
            min_periods=1, window=len(df), center=False).max()
    )
    df['draw_down'] = df['net_asset_value'] - df['high_level']
    df['draw_down_percent'] = df["draw_down"] / df["high_level"] * 100
    max_draw_down = df["draw_down"].min()
    max_draw_percent = df["draw_down_percent"].min()
    
    #持倉總天數
    hold_days = df['position'].sum()
    
    #交易次數
    trade_count = df[df['flag']!=0].shape[0]/2
    
    #平均持倉天數
    avg_hold_days = int(hold_days/trade_count)
    
    #獲利天數
    profit_days = df[df['net_asset_pct_chg'] > 0].shape[0]
    #虧損天數
    loss_days = df[df['net_asset_pct_chg'] < 0].shape[0]
    
    #勝率(按天)
    winrate_by_day = profit_days/(profit_days+loss_days)*100
    #平均盈利率(按天)
    avg_profit_rate_day = df[df['net_asset_pct_chg'] > 0]['net_asset_pct_chg'].mean()*100
    #平均虧損率(按天)
    avg_loss_rate_day = df[df['net_asset_pct_chg'] < 0]['net_asset_pct_chg'].mean()*100
    #平均盈虧比(按天)
    avg_profit_loss_ratio_day = avg_profit_rate_day/abs(avg_loss_rate_day)
    
    
    #每一次交易情況  
    buy_trades = df[df['flag']==1].reset_index()
    sell_trades = df[df['flag']==-1].reset_index()
    result_by_trade = {
        'buy':buy_trades['close'],
        'sell':sell_trades['close'],
        'pct_chg':(sell_trades['close']-buy_trades['close'])/buy_trades['close']
    }
    result_by_trade = pd.DataFrame(result_by_trade)
    #盈利次數
    profit_trades = result_by_trade[result_by_trade['pct_chg']>0].shape[0]
    #虧損次數
    loss_trades = result_by_trade[result_by_trade['pct_chg']<0].shape[0]
    #單次最大盈利
    max_profit_trade = result_by_trade['pct_chg'].max()*100
    #單次最大虧損
    max_loss_trade = result_by_trade['pct_chg'].min()*100
    #勝率(按次)
    winrate_by_trade = profit_trades/(profit_trades+loss_trades)*100
    #平均盈利率(按次)
    avg_profit_rate_trade = result_by_trade[result_by_trade['pct_chg'] > 0]['pct_chg'].mean()*100
    #平均虧損率(按次)
    avg_loss_rate_trade = result_by_trade[result_by_trade['pct_chg'] < 0]['pct_chg'].mean()*100
    #平均盈虧比(按次)
    avg_profit_loss_ratio_trade = avg_profit_rate_trade/abs(avg_loss_rate_trade)
    
    statistics_result = {
        'net_asset_value':df['net_asset_value'][df.shape[0]-1],#最終凈值
        'total_return':total_return,#收益率
        'annual_return':annual_return,#年化收益率
        'sharp_ratio':sharp_ratio,#夏普比率
        'max_draw_percent':max_draw_percent,#最大回撤
        'hold_days':hold_days,#持倉天數
        'trade_count':trade_count,#交易次數
        'avg_hold_days':avg_hold_days,#平均持倉天數
        'profit_days':profit_days,#盈利天數
        'loss_days':loss_days,#虧損天數
        'winrate_by_day':winrate_by_day,#勝率(按天)
        'avg_profit_rate_day':avg_profit_rate_day,#平均盈利率(按天)
        'avg_loss_rate_day':avg_loss_rate_day,#平均虧損率(按天)
        'avg_profit_loss_ratio_day':avg_profit_loss_ratio_day,#平均盈虧比(按天)
        'profit_trades':profit_trades,#盈利次數
        'loss_trades':loss_trades,#虧損次數
        'max_profit_trade':max_profit_trade,#單次最大盈利
        'max_loss_trade':max_loss_trade,#單次最大虧損
        'winrate_by_trade':winrate_by_trade,#勝率(按次)
        'avg_profit_rate_trade':avg_profit_rate_trade,#平均盈利率(按次)
        'avg_loss_rate_trade':avg_loss_rate_trade,#平均虧損率(按次)
        'avg_profit_loss_ratio_trade':avg_profit_loss_ratio_trade#平均盈虧比(按次)
    }
    return statistics_result

3.2.1斜率方法

因為市場上存在噪聲,所以考慮用連續N日的最高價與最低價的線性回歸模型的斜率來量化支撐位與阻力位的相對強度,以求增加信噪比,

即,取連續N日的最高價與最低價的線性回歸模型

high = alpha + beta*low

中的beta,即直線的斜率,作為我們的相對強度RSRS,

斜率指標計算方法:

  1. 取前 N 日的最高價序列與最低價序列,
  2. 將兩列資料按式(1)的模型進行 OLS 線性回歸,
  3. 將擬合后的 beta 值作為當日 RSRS 斜率指標值,

在原研報中,經過對N的不同取值的比較,N取18時,量化出的指標構建的策略更有效,

基于斜率方法,構建策略:

  1. 計算 RSRS 斜率,
  2. 如果斜率大于 1,則買入持有,
  3. 如果斜率小于 0.8,則賣出手中持股平倉,

策略源代碼

#當日斜率指標計算方式,線性回歸
def cal_nbeta(df,n):
    nbeta = []
    trade_days = len(df.index)
    
    df['position'] = 0
    df['flag'] = 0
    position = 0
    
  #計算斜率值
    for i in range(trade_days):
        if i < (n-1):
            #n-1為配合接下來用iloc索引
            continue
        else:    
            x = df['low'].iloc[i-n+1:i+1]
            #iloc左閉右開
            x = sm.add_constant(x)
            y = df['high'].iloc[i-n+1:i+1]
            regr = sm.OLS(y,x)
            res = regr.fit()
            beta = round(res.params[1],2)#斜率指標          
            nbeta.append(beta)    
    df1 = df.iloc[n-1:]
    df1['beta'] = nbeta
    
  #執行交易策略
    for i in range(len(df1.index)-1):
        #此處-1是為了避免最后一行
        if df1['beta'].iloc[i] > 1 and position == 0:
            df1['flag'].iloc[i] = 1 #開倉標志
            df1['position'].iloc[i+1] =1 #倉位不為空
            position = 1
        elif df1['beta'].iloc[i] < 0.8 and position == 1:
            df1['flag'].iloc[i] = -1 #平倉標志
            df1['position'].iloc[i+1] = 0 #倉位為空
            position = 0
        else:
            df1['position'].iloc[i+1] = df1['position'].iloc[i]
    #計算凈值序列     
    df1['net_asset_value'] = (1+df1.close.pct_change(1).fillna(0)*df1.position).cumprod()
    return df1

策略凈值曲線

圖片

策略的統計指標

統計量斜率策略
凈值10.66
收益率965.73%
年化收益率21.92%
夏普比率1.16
最大回撤-50.26%
持倉天數1184
交易次數21
平均持倉天數56
盈利天數747
虧損天數575
勝率(按天)56.51%
平均盈利率(按天)1.31%
平均虧損率(按天)-1.25%
平均盈虧比(按天)1.05
盈利次數16
虧損次數5
單次最大盈利170%
單次最大虧損-12%
勝率(按次)76.19%
平均盈利率(按次)25%
平均虧損率(按次)-3%
平均盈虧比(按次)7.86

3.2.2斜率方法的優化——斜率標準分

使用斜率指標構建策略時,需要參考斜率指標在歷史上的均值和標準差以選擇合適的開倉、平倉閾值,

但隨時市場的變化,不同時期資料的均值與標準差可能會發生變化,同時交易者也可能更關心在當前市場在近期的環境中處在什么樣的位置,或者接下來一段時間市場相比于目前將會有怎么的發展,所以相較于直接使用斜率在整個歷史上的均值和標準差來幫助選擇閾值,根據斜率在最近一定周期內(600個交易日)的標準分確定閾值可以更加靈活地適應近期的整體市場基本狀態,

斜率標準分計算方法:

  1. 取前 M 日的斜率時間序列,
  2. 以此樣本計算當日斜率的標準分,
  3. 將計算得到的標準分 z 作為當日 RSRS 標準分指標值,

構建標準分策略:

1.根據斜率計算標準分(引數 N=18,M=600),
2.如果標準分大于 S(引數 S=0.7),則買入持有,
3.如果標準分小于-S,則賣出平倉,

策略源代碼

#標準分策略
def cal_stdbeta(df,n):
    
    df['position'] = 0
    df['flag'] = 0
    position = 0
    
    df1 = cal_nbeta(df,n)
    pre_stdbeta = df1['beta']
    pre_stdbeta = np.array(pre_stdbeta)
    #轉化為陣列,可以對整個陣列進行操作
    sigma = np.std(pre_stdbeta)
    mu = np.mean(pre_stdbeta)
    #標準化
    stdbeta = (pre_stdbeta-mu)/sigma
    
    df1['stdbeta'] = stdbeta
    
    for i in range(len(df1.index)-1):
        #此處-1是為了避免最后一行
        if df1['stdbeta'].iloc[i] > 0.7 and position == 0:
            df1['flag'].iloc[i] = 1
            df1['position'].iloc[i+1] =1
            position = 1
        elif df1['stdbeta'].iloc[i] < -0.7 and position == 1:
            df1['flag'].iloc[i] = -1
            df1['position'].iloc[i+1] = 0
            position = 0
        else:
            df1['position'].iloc[i+1] = df1['position'].iloc[i]
            
    df1['net_asset_value'] = (1+df1.close.pct_change(1).fillna(0)*df1.position).cumprod()
    return df1
#stdbeta是陣列 beta是串列

凈值曲線圖

圖片

策略的統計指標

統計量標準分策略
凈值13.93
收益率1292.70%
年化收益率25.07%
夏普比率1.28
最大回撤-50.26%
持倉天數1298
交易次數67
平均持倉天數19
盈利天數741
虧損天數557
勝率(按天)57.09%
平均盈利率(按天)1.32%
平均虧損率(按天)-1.25%
平均盈虧比(按天)1.06
盈利次數40
虧損次數26
單次最大盈利91%
單次最大虧損-41%
勝率(按次)60.61%
平均盈利率(按次)18%
平均虧損率(按次)-9%
平均盈虧比(按次)2.05

3.2.3再優化——修正標準分:考慮到線性擬合的程度

使用線性回歸擬合直線的斜率或其標準分作為相對強弱程度時,可能出現斜率或標準分的絕對值很大,但直線本身的擬合效果并不好,使得斜率或斜率的標準分本身不能很好的體現出相對強弱程度的問題,需要構建相對強弱程度指標時可以考慮到線性模型擬合結果的好壞,

在線性回歸中,R 平方值(決定系數)可以理解成線性擬合效果的程度,

因此,使用

修正標準分=標準分*R 平方值(決定系數

來量化相對強弱程度,可以削弱直線擬合效果對指標效果的影響,

構建修正標準分策略

  1. 計算修正標準分(N=16,M=300),
  2. 如果修正標準分大于 S(S=0.7),則買入持有,
  3. 如果修正標準分小于-S,則賣出平倉,

策略源代碼

#RSRS 標準分指標優化,修正標準分
def cal_better_stdbeta(df,n):
    nbeta = []
    R2 = []
    trade_days = len(df.index)
    for i in range(trade_days):
        if i < (n-1):
            #n-1為配合接下來用iloc索引
            continue
        else:
    
            x = df['low'].iloc[i-n+1:i+1]
            #iloc左閉右開
            x = sm.add_constant(x)
            y = df['high'].iloc[i-n+1:i+1]
            regr = sm.OLS(y,x)
            res = regr.fit()
            beta = round(res.params[1],2)
            
            R2.append(res.rsquared)
            nbeta.append(beta)
            
    prebeta = np.array(nbeta)
    sigma = np.std(prebeta)
    mu = np.mean(prebeta)
    stdbeta = (prebeta-mu)/sigma
    
    r2 = np.array(R2)
    better_stdbeta = r2*stdbeta#修正標準分
    
    df1 = df.iloc[n-1:]
    df1['beta'] = nbeta
    df1['flag'] = 0
    df1['position'] = 0
    position = 0
    df1['better_stdbeta'] = better_stdbeta
    
    for i in range(len(df1.index)-1):
        #此處-1是為了避免最后一行
        if df1['better_stdbeta'].iloc[i] > 0.7 and position == 0:
            df1['flag'].iloc[i] = 1
            df1['position'].iloc[i+1] =1
            position = 1
        elif df1['better_stdbeta'].iloc[i] < -0.7 and position == 1:
            df1['flag'].iloc[i] = -1
            df1['position'].iloc[i+1] = 0
            position = 0
        else:
            df1['position'].iloc[i+1] = df1['position'].iloc[i]
    df1['net_asset_value'] = (1+df1.close.pct_change(1).fillna(0)*df1.position).cumprod()
    return df1

策略凈值曲線
圖片

策略指標

修正標準分策略
凈值12.15
收益率1115.40%
年化收益率23.47%
夏普比率1.19
最大回撤-51.28%
持倉天數1397
交易次數46
平均持倉天數30
盈利天數790
虧損天數607
勝率(按天)56.55%
平均盈利率(按天)1.30%
平均虧損率(按天)-1.25%
平均盈虧比(按天)1.05
盈利次數32
虧損次數14
單次最大盈利76%
單次最大虧損-18%
勝率(按次)69.57%
平均盈利率(按次)11%
平均虧損率(按次)-3%
平均盈虧比(按次)3.3

3.2.4再再優化——右偏標準分:在實踐程序中的猜想

原研報在分析比較標準分和修正標準分對后市的相關性時,發現右側(即z>0)的標準分對后市收益有較好的預測性,而左側的標準分則失去了預測性,因為左側的標準分占了整體的大部分,所以整體標準分與后市收益相關性較低,而修正標準分右側的取值范圍擴大了(相對于左側而言,并非絕對的值域),修正標準分整體上呈現了更好的預測性,

因此猜測:是否右側的取值范圍越廣(相對于左側而言,并非絕對的值域范圍),指標的預測性更好?

為了驗證該猜想,構建右偏標準分

右偏標準分=修正標準分*斜率

構建右偏標準分策略

  1. 計算右偏標準分(N=16,M=300),
  2. 如果右偏標準分大于 S(S=0.7),則買入持有,
  3. 如果右偏標準分小于-S,則賣出平倉,

策略源代碼

#右偏標準分 此時N取16
def cal_right_stdbeta(df,n):
    
    df1 = cal_better_stdbeta(df,n)
    df1['position'] = 0
    df1['flag'] = 0
    df1['net_value'] = 0  
    position = 0
    
    df1['right_stdbeta'] = df1['better_stdbeta']*df1['beta']        
    #修正標準分與斜率值相乘能夠達到使原有分布右偏的效果
    
    for i in range(len(df1.index)-1):
        #此處-1是為了避免最后一行
        if df1['right_stdbeta'].iloc[i] > 0.7 and position == 0:
            df1['flag'].iloc[i] = 1
            df1['position'].iloc[i+1] =1
            position = 1
        elif df1['right_stdbeta'].iloc[i] < -0.7 and position == 1:
            df1['flag'].iloc[i] = -1
            df1['position'].iloc[i+1] = 0
            position = 0
        else:
            df1['position'].iloc[i+1] = df1['position'].iloc[i]
    df1['net_asset_value'] = (1+df1.close.pct_change(1).fillna(0)*df1.position).cumprod()    
    return df1

凈值曲線圖
圖片

策略指標

統計量右偏標準分
凈值17.67
收益率1667.22%
年化收益率27.88%
夏普比率1.29
最大回撤-51.16%
持倉天數1638
交易次數37.5
平均持倉天數43
盈利天數928
虧損天數710
勝率(按天)56.65%
平均盈利率(按天)1.27%
平均虧損率(按天)-1.22%
平均盈虧比(按天)1.04
盈利次數26
虧損次數11
單次最大盈利91%
單次最大虧損-17%
勝率(按次)70.27%
平均盈利率(按次)15%
平均虧損率(按次)-3%
平均盈虧比(按次)4.6

3.3 結合市場狀態的優化

基于上文介紹的四種阻力支撐相對強弱程度指標RSRS構建出的交易策略都大幅度地跑贏了基準收益,但也都有一個共同的缺陷:凈值在08年股災期間都出現了大幅的回撤

圖片

這是因為按照阻力支撐相對強弱指標的邏輯,策略大概率是在左側開倉、左側平倉,(這里的左側是指股價呈現“V”字型時的下跌階段,并不是上文討論右偏標準分時提到的左側),但當市場處在大熊市狀態時,如果開倉預測失誤,就會造成嚴重的虧損,

因此,我們期望在保證收益的同時,盡可能降低熊市錯誤開倉的幾率,

簡單的想法是:先判斷市場狀態是處在上升還是下跌趨勢,再結合RSRS構建買入、賣出策略,

3.3.1 結合均線指標的優化

有很多指標幫助我們判斷近期市場狀態,如MA,MACD等,在這里我們使用當日 20 日均線值與 3 日前 20 日均線值的相對大小來判斷近期市場狀態,

優化后的交易策略為:

1.計算 RSRS 標準分指標買賣信號,

  1. 如果指標發出買入信號,同時滿足前一日 MA(20)的值大于前三日MA(20)的值,則買入,
  2. 如果指標發出賣出信號,則賣出手中持股,

策略代碼

RSRS 指標配合價格資料優化策略
def cal_ma_beta(df,n):
    df1 = cal_stdbeta(df,n)
    df1['position'] = 0
    df1['flag'] = 0
    df1['net_asset_value'] = 0
    position = 0
    
#beta是前17天沒有資料(n=18) ma20是前20天沒有資料
    for i in range(5,len(df1.index)-1):
        if df1['stdbeta'].iloc[i] > 0.7 and df1['ma20'].iloc[i-1]>df1['ma20'].iloc[i-3] and position == 0:
            df1['flag'].iloc[i] = 1
            df1['position'].iloc[i+1] = 1
            position = 1
        elif df1['stdbeta'].iloc[i] < -0.7 and df1['ma20'].iloc[i-1]<df1['ma20'].iloc[i-3] and position == 1:
            df1['flag'].iloc[i] = -1
            df1['position'].iloc[i+1] = 0
            position = 0
        else:
            df1['position'].iloc[i+1] = df1['position'].iloc[i]
    df1['net_asset_value'] = (1+df1.close.pct_change(1).fillna(0)*df1.position).cumprod()          
    return df1

凈值曲線
圖片

策略指標

統計量均值優化標準分策略
凈值16.91
收益率1591.22%
年化收益率27.36%
夏普比率1.48
最大回撤-23.61%
持倉天數1638
交易次數37.5
平均持倉天數43
盈利天數714
虧損天數470
勝率(按天)60.30%
平均盈利率(按天)1.24%
平均虧損率(按天)-1.24%
平均盈虧比(按天)1
盈利次數26
虧損次數11
單次最大盈利91%
單次最大虧損-17%
勝率(按次)70.27%
平均盈利率(按次)15%
平均虧損率(按次)-3%
平均盈虧比(按次)4.6

3.3.2 結合交易量相關性的優化

除卻直接從近期歷史價格來確認當下市場趨勢狀態,很多發表的研究表明市場漲跌與交易量有明顯的正相關性,借鑒類似的想法,我們嘗試用交易量與修正標準分之間的相關性來過濾誤判信號,只有在相關性為正的時刻給出的交易信號,我們才認為是合理的信號,

優化后的策略為

  1. 計算 RSRS 標準分指標買賣信號,
  2. 如果指標發出買入信號,同時滿足前 10 日交易量與修正標準分之間的相關性為正,則買入,
  3. 如果指標發出賣出信號,則賣出手中持股,

策略代碼

#基于 RSRS 指標與交易量相關性的優化
def cal_vol_beta(df,n):
    df1 = cal_stdbeta(df,n)
    
    df1['position'] = 0
    df1['flag'] = 0
    df1['net_asset_value'] = 0  
    position = 0
    
    for i in range(10,len(df1.index)-1):
        
        pre_volume = df1['volume'].iloc[i-10:i]
        series_beta = df1['stdbeta'].iloc[i-10:i]
        #計算相關系數需要資料為series格式
        corr = series_beta.corr(pre_volume,method = 'pearson')
        if df1['stdbeta'].iloc[i] > 0.7 and corr > 0 and position == 0:
            df1['flag'].iloc[i] = 1
            df1['position'].iloc[i+1] = 1
            position = 1
        elif df1['stdbeta'].iloc[i] < -0.7 and position == 1:
            df1['flag'].iloc[i] = -1
            df1['position'].iloc[i+1] = 0
            position = 0
        else:
            df1['position'].iloc[i+1] = df1['position'].iloc[i]
            
    df1['net_asset_value'] = (1+df1.close.pct_change(1).fillna(0)*df1.position).cumprod()
    return df1

凈值曲線
圖片

策略指標

統計量成交量優化標準分策略
凈值13.97
收益率1296.64%
年化收益率25.10%
夏普比率1.57
最大回撤-22.29%
持倉天數916
交易次數40
平均持倉天數22
盈利天數548
虧損天數368
勝率(按天)59.83%
平均盈利率(按天)1.29
平均虧損率(按天)-1.16
平均盈虧比(按天)1.11
盈利次數27
虧損次數13
單次最大盈利79%
單次最大虧損-16%
勝率(按次)67.50%
平均盈利率(按次)13%
平均虧損率(按次)-4%
平均盈虧比(按次)3.71

3.4 策略結果匯總

現在給出所有RSRS策略的凈值曲線和統計資料

圖片

統計量斜率標準分修正標準分右偏標準分均值優化標準分成交量優化標準分
凈值10.6613.9312.1517.6716.9113.97
收益率965.73%1292.70%1115.40%1667.22%1591.22%1296.64%
年化收益率21.92%25.07%23.47%27.88%27.36%25.10%
夏普比率1.161.281.191.291.481.57
最大回撤-50.26%-50.26%-51.28%-51.16%-23.61%-22.29%
持倉天數11841298139716381638916
交易次數21674637.537.540
平均持倉天數561930434322
盈利天數747741790928714548
虧損天數575557607710470368
勝率(按天)56.51%57.09%56.55%56.65%60.30%59.83%
平均盈利率(按天)1.31%1.32%1.30%1.27%1.24%1.29
平均虧損率(按天)-1.25%-1.25%-1.25%-1.22%-1.24%-1.16
平均盈虧比(按天)1.051.061.051.0411.11
盈利次數164032262627
虧損次數52614111113
單次最大盈利170%91%76%91%91%79%
單次最大虧損-12%-41%-18%-17%-17%-16%
勝率(按次)76.19%60.61%69.57%70.27%70.27%67.50%
平均盈利率(按次)25%18%11%15%15%13%
平均虧損率(按次)-3%-9%-3%-3%-3%-4%
平均盈虧比(按次)7.862.053.34.64.63.71

4.總結

本文基本復現了【光大證券-基于阻力支撐相對強度(RSRS)的市場擇時】的研究內容,同時得到了與原研報相近的結果,

本文的不足:

1.沒有考慮交易成本,原研報同時給出了在不同交易成本下各策略的結果,凈值有略微的下降,

2.沒有給出選取不同N、M時策略的表現情況,

5.本文作者

何百圣 哈爾濱工業大學威海校區 經濟管理學院

蔡金航 哈爾濱工業大學威海校區 計算機科學與技術學院

寫在最后

我們是國內普通高校的在校學生,同時也是量化投資的初學者,我們的學校不是清北復交,也沒有金融工程實驗室,同時地處三線小城,因此我們在校期間較難獲得量化實習機會,但我們期待與業界進行溝通、交流,

蔡金航同學是我們其中的一員,其在尋找暑期量化實習時,收到了幾家私募和券商金工組的筆試邀請,筆試內容皆為在給定時間內復現出一篇金工研報,蔡同學受到啟發,發覺復現金工研報是我們學習量化策略、鍛煉程式設計能力同時也是與業界交流的很好的途徑,

在蔡同學的建議下,我們開啟研報復現系列的創作,記錄我們的學習程序,并將我們的創作內容分享出來,與讀者們一起交流、學習、進步,

我們的水平有限,創作的內容難免會有錯誤或不嚴謹的內容,我們歡迎讀者的批評指正,

如果您對我們的內容感興趣,請聯系我們:cai_jinhang@foxmail.com

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/279845.html

標籤:其他

上一篇:OpenCV呼叫海康威視等攝像頭(處理rtsp視頻流)方法以及,出現記憶體溢位(error while decoding)或者高延遲問題解決

下一篇:手把手教你如何安裝使用Git(Windows系統)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more