天天看點

可視化包quantstats與backtrader整合,詳解ADX與ATR名額

作者:七年實作财富自由

持續行動1期 59/100,“AI技術應用于量化投資研究”。

今天重點說說quantstats,可以部分替代backtrader的plot 以及backtrader plotting。

項目官網:https://github.com/ranaroussi/quantstats

安裝 pip install quantstats。

官網上的介紹翻譯過來:

QuantStats Python庫,執行投資組合分析,通過量化和投資組合為經理提供深入的分析和風險度量,使他們能夠更好地了解自己的業績。

QuantStats由3個主要子產品組成:

1.quantstats.stats-用于計算各種性能名額,如夏普比率、勝率、波動性等。

2.quantstats.plots-用于可視化性能、縮水、滾動統計、月度回報等。

3.quantstats.report-用于生成度量報告、批次繪制以及建立可另存為HTML檔案的tear sheets。

01 整合到backtrader

給bt的cerebro添加一個PyFolio的分析器:

self.cerebro.addanalyzer(bt.analyzers.PyFolio, _name='pyfolio')           

在回測過程完成後,讀取py格式的結果:

portfolio_stats = self.results[0].analyzers.getbyname('pyfolio')
returns, positions, transactions, gross_lev = portfolio_stats.get_pf_items()           

我們這裡需要returns這個政策的收益率序列。

quantstats需要這一個參數即可。當然我們可以加上benchmark作為對比。

import quantstats
df = self.feed.get_df('000300.SH')
df= df[['rate']]
df.index = pd.to_datetime(df.index)
print(df)
quantstats.reports.html(returns, benchmark=df, output='stats.html', title='Stock Sentiment')           

常用的名額對比一目了然:

可視化包quantstats與backtrader整合,詳解ADX與ATR名額

還有很多常見的圖表的名額:

可視化包quantstats與backtrader整合,詳解ADX與ATR名額

02 一些技術名額

EMA(200)(指數平滑移動均線),這個名額比較簡單,用以判斷長期趨勢。

ADX(50)(平均趨向指數),也是常用的趨向衡量名額。這是一個輔助名額,它無法獨立判斷方向,但如果方向存在,它可以給出趨勢的強度。

RSI(随機強弱名額),80以上表示超買(回調機率大),20以下表示超賣(止跌機率大)。

ATR(8)(止損名額)。

資料:小時級别的時間序列。

多頭規則:

一、價格> EMA(200)

二、ADX>50

下面這張圖比較清晰看出ADX的計算過程。

+DM是上漲幅度,+DI = +DM/TR,向上比例;-DI是向下比例。

可視化包quantstats與backtrader整合,詳解ADX與ATR名額

ADX與RSI都是計算多空力量的角力。而RSI是“一階”力量對比,ADX更像“二階”力量對比。多空力量的速度與加速度的關系,有點像MACD之于EMA的關系。

三、RSI在超賣區(<20)金叉

RSI叫“相對強弱名額”。相對強弱名額(RSI)=(N日内上漲總幅度平均值/N日内上漲總幅度和下跌總幅度平均值)*100%。

就是過去N天,漲的絕對值/(漲的絕對值+跌的絕對值)*100,是以rsi中間值是50,大于80說明過去14天内,80%在漲;低于20,則說明80%在漲。

超賣區金叉,說明趨勢可能反轉。

四、止損設定的ATR藍線以下;多批止盈。

空頭政策的邏輯反過來。

看下ATR的代碼實作:

class TrueHigh(Indicator):
    lines = ('truehigh',)

    def __init__(self):
        self.lines.truehigh = Max(self.data.high, self.data.close(-1))
        super(TrueHigh, self).__init__()           
class TrueLow(Indicator):
    lines = ('truelow',)

    def __init__(self):
        self.lines.truelow = Min(self.data.low, self.data.close(-1))
    super(TrueLow, self).__init__()
class TrueRange(Indicator):alias = ('TR',)
    lines = ('tr',)
    def __init__(self):
        self.lines.tr = TrueHigh(self.data) - TrueLow(self.data)
    super(TrueRange, self).__init__()
class AverageTrueRange(Indicator):
    alias = ('ATR',)

    lines = ('atr',)
    params = (('period', 14), ('movav', MovAv.Smoothed))

    def _plotlabel(self):
        plabels = [self.p.period]
        plabels += [self.p.movav] * self.p.notdefault('movav')
        return plabels

    def __init__(self):
        self.lines.atr = self.p.movav(TR(self.data), period=self.p.period)
        super(AverageTrueRange, self).__init__()
           

這個名額叫“平均真實波動幅度”,周期預設是14。真實波動幅度。一般說今天的波動是 今天的high-今天的low,而true range是考慮了“昨天收盤價”的概述,是以叫真實的波動幅度。對TrueRange取14天的移動平均得到ATR(14)。

其實很多名額,教程講得天花亂墜,你打開來看沒啥特别。就是一個波動區間的平均數。——波動回大可能會引緻趨勢反轉?這個有一定的邏輯。更多人用它的設定止損位——就是相當于股價創新低了嘛。

這個政策不複雜,用EMA200代表長期趨勢向上,ADX驗證趨勢強度,在超賣區(低位)選擇入場,有強度說明多方有加速度,然後使用ATR計算止損位。

明天使用代碼實作一下。

公衆号:ailabx(七年實作财富自由)

繼續閱讀