Backtrader在同一軸上繪圖

  |  

在博客上發表評論之後,對繪圖做了一點補充(幸運的是只有幾代碼)。

  • 在任何其他指標上繪製任何指標的能力

一個潛在的用例:

  • 通過將一些指標繪製在一起並有更多空間來欣賞 OHLC 條來節省寶貴的屏幕空間

    示例:連接隨機和 RSI 圖

當然必須考慮一些事情:

  • 如果指標的縮放比例差異太大,則某些指標將不可見。

    示例:MACD 在 0.0 正負 0.5 附近振盪,繪製在 0-100 範圍內移動的隨機指標上。

第一個實現是在提交時的開發分支中…14252c6

一個示例腳本(完整代碼見下文)讓我們看看效果

筆記

因為示例策略什麼都不做,除非通過命令開關激活,否則標準觀察者將被刪除。

首先腳本在沒有開關的情況下運行。

  • 在數據上繪製一個簡單移動平均線

  • MACD、隨機指標和 RSI 繪製在自己的軸/子圖上

執行:

$ ./plot-same-axis.py

還有圖表。

第二次執行改變了全景圖:

  • 簡單移動平均線移至子圖

  • MACD 隱藏

  • RSI 在隨機指標上繪製(y 軸範圍兼容:0-100)

    這是通過將指標的plotinfo.plotmaster值設置為要繪製到的另一個指標來實現的。

    在這種情況下,由於__init__中的局部變量被命名為stoc代表 Stochastic 和rsi代表 RSI,它看起來像:

    rsi.plotinfo.plotmaster = stoc
    

執行:

$ ./plot-same-axis.py --smasubplot --nomacdplot --rsioverstoc

圖表。

為了檢查比例尺的不兼容性,讓我們嘗試在 SMA 上繪製 rsi:

$ ./plot-same-axis.py --rsiovermacd

圖表。

RSI 標籤與數據和 SMA 一起顯示,但比例在 3400-4200 範圍內,因此……沒有 RSI 的痕跡。

進一步徒勞的嘗試是將 SMA 放在子圖上,然後再次在 SMA 上繪製 RSI

$ ./plot-same-axis.py –rsiovermacd –smasubplot

圖表。

標籤很清楚,但 RSI 中剩下的只是 SMA 圖底部的一條淡藍色

筆記

添加了在另一個指標上繪製的多指標

在另一個方向上,讓我們在另一個指標上繪製一個多指標。讓我們在 RSI 上繪製隨機指標:

$ ./plot-same-axis.py --stocrsi

有用。 Stochastic標籤出現,2K%D%也出現。但是這些沒有“命名”,因為我們已經獲得了指標的名稱。

在代碼中,當前設置為:

stoc.plotinfo.plotmaster = rsi

要顯示隨機的名稱而不是名稱,我們還需要:

stoc.plotinfo.plotlinelabels = True

這已被參數化,並且新的執行顯示了它:

$ ./plot-same-axis.py --stocrsi --stocrsilabels

圖表現在在 RSI的名稱下方顯示隨機的名稱。

腳本用法:

$ ./plot-same-axis.py --help
usage: plot-same-axis.py [-h] [--data DATA] [--fromdate FROMDATE]
                         [--todate TODATE] [--stdstats] [--smasubplot]
                         [--nomacdplot]
                         [--rsioverstoc | --rsioversma | --stocrsi]
                         [--stocrsilabels] [--numfigs NUMFIGS]

Plotting Example

optional arguments:
  -h, --help            show this help message and exit
  --data DATA, -d DATA  data to add to the system
  --fromdate FROMDATE, -f FROMDATE
                        Starting date in YYYY-MM-DD format
  --todate TODATE, -t TODATE
                        Starting date in YYYY-MM-DD format
  --stdstats, -st       Show standard observers
  --smasubplot, -ss     Put SMA on own subplot/axis
  --nomacdplot, -nm     Hide the indicator from the plot
  --rsioverstoc, -ros   Plot the RSI indicator on the Stochastic axis
  --rsioversma, -rom    Plot the RSI indicator on the SMA axis
  --stocrsi, -strsi     Plot the Stochastic indicator on the RSI axis
  --stocrsilabels       Plot line names instead of indicator name
  --numfigs NUMFIGS, -n NUMFIGS
                        Plot using numfigs figures

和代碼。

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import argparse
import datetime

# The above could be sent to an independent module
import backtrader as bt
import backtrader.feeds as btfeeds
import backtrader.indicators as btind


class PlotStrategy(bt.Strategy):
    '''
    The strategy does nothing but create indicators for plotting purposes
    '''
    params = dict(
        smasubplot=False,  # default for Moving averages
        nomacdplot=False,
        rsioverstoc=False,
        rsioversma=False,
        stocrsi=False,
        stocrsilabels=False,
    )

    def __init__(self):
        sma = btind.SMA(subplot=self.params.smasubplot)

        macd = btind.MACD()
        # In SMA we passed plot directly as kwarg, here the plotinfo.plot
        # attribute is changed - same effect
        macd.plotinfo.plot = not self.params.nomacdplot

        # Let's put rsi on stochastic/sma or the other way round
        stoc = btind.Stochastic()
        rsi = btind.RSI()
        if self.params.stocrsi:
            stoc.plotinfo.plotmaster = rsi
            stoc.plotinfo.plotlinelabels = self.p.stocrsilabels
        elif self.params.rsioverstoc:
            rsi.plotinfo.plotmaster = stoc
        elif self.params.rsioversma:
            rsi.plotinfo.plotmaster = sma


def runstrategy():
    args = parse_args()

    # Create a cerebro
    cerebro = bt.Cerebro()

    # Get the dates from the args
    fromdate = datetime.datetime.strptime(args.fromdate, '%Y-%m-%d')
    todate = datetime.datetime.strptime(args.todate, '%Y-%m-%d')

    # Create the 1st data
    data = btfeeds.BacktraderCSVData(
        dataname=args.data,
        fromdate=fromdate,
        todate=todate)

    # Add the 1st data to cerebro
    cerebro.adddata(data)

    # Add the strategy
    cerebro.addstrategy(PlotStrategy,
                        smasubplot=args.smasubplot,
                        nomacdplot=args.nomacdplot,
                        rsioverstoc=args.rsioverstoc,
                        rsioversma=args.rsioversma,
                        stocrsi=args.stocrsi,
                        stocrsilabels=args.stocrsilabels)

    # And run it
    cerebro.run(stdstats=args.stdstats)

    # Plot
    cerebro.plot(numfigs=args.numfigs, volume=False)


def parse_args():
    parser = argparse.ArgumentParser(description='Plotting Example')

    parser.add_argument('--data', '-d',
                        default='../../datas/2006-day-001.txt',
                        help='data to add to the system')

    parser.add_argument('--fromdate', '-f',
                        default='2006-01-01',
                        help='Starting date in YYYY-MM-DD format')

    parser.add_argument('--todate', '-t',
                        default='2006-12-31',
                        help='Starting date in YYYY-MM-DD format')

    parser.add_argument('--stdstats', '-st', action='store_true',
                        help='Show standard observers')

    parser.add_argument('--smasubplot', '-ss', action='store_true',
                        help='Put SMA on own subplot/axis')

    parser.add_argument('--nomacdplot', '-nm', action='store_true',
                        help='Hide the indicator from the plot')

    group = parser.add_mutually_exclusive_group(required=False)

    group.add_argument('--rsioverstoc', '-ros', action='store_true',
                       help='Plot the RSI indicator on the Stochastic axis')

    group.add_argument('--rsioversma', '-rom', action='store_true',
                       help='Plot the RSI indicator on the SMA axis')

    group.add_argument('--stocrsi', '-strsi', action='store_true',
                       help='Plot the Stochastic indicator on the RSI axis')

    parser.add_argument('--stocrsilabels', action='store_true',
                        help='Plot line names instead of indicator name')

    parser.add_argument('--numfigs', '-n', default=1,
                        help='Plot using numfigs figures')

    return parser.parse_args()


if __name__ == '__main__':
    runstrategy()

推薦閱讀

相關文章

Backtrader期貨展期

並非每個供應商都為可以交易的工具提供連續的未來。有時提供的數據是仍然有效的到期日期的數據,即:仍在交易的日期 這在回溯測試方面並不是很有幫助,因為數據分散在幾個不同的儀器上,這些儀器另外...時間重疊。 能夠正確地將這些儀器的數據從過去連接到連續的流中,可以減輕疼痛。

Backtrader優化改進

backtrader 1.8.12.99版改進了多處理期間數據饋送和結果的管理方式。

Backtrader傭金計劃

backtrader 的誕生是出於必要。我自己的...有一種感覺,我控制著自己的回溯測試平臺,可以嘗試新的想法。但是,在這樣做並且從一開始就完全 open 採購它時,很明顯它必須有一種方法來滿足他人的需求和願望。 作為未來的交易者,我本可以選擇基於點的計算和每輪傭金的固定價格,但這將是一個錯誤。

Backtrader 教程:訂單 - OCO

版本1.9.34.116將OCO (又名 One Cancel Others)添加到回測庫中。筆記這僅在回測中實現,還沒有針對實時經紀人的實現筆記更新為1.9.36.116版本。盈透證券支持StopTrail 、 StopTrailLimit和OCO 。

Backtrader在同一軸上列印

上一篇文章期貨和現貨補償,在同一空間上繪製原始數據和略微(隨機)修改的數據,但不是在同一軸上。 從該帖子中恢復第 1張圖片。 人們可以看到: 圖表的左側和右側有不同的刻度 當查看在原始數據周圍振蕩+- 50點的旋轉紅line(隨機數據)時,這一點最為明顯。

Backtrader股票篩選

在尋找其他一些東西時,我在StackOverlow家族網站之一上遇到了一個問題:Quantitative Finance aka Quant StackExchange。問題: 它被標記為Python,因此值得一看的是 backtrader 是否能夠勝任這項任務。 分析儀本身 該問題似乎適合用於簡單的分析器。

Backtrader繪製日期範圍

該版本1.9.31.x 增加了製作部分繪圖的功能。 使用策略實例中保存的完整時間戳陣列的索引 或者使用實際datetime.date 或 datetime.datetime 實例來限制必須繪製的內容。 一切都超過標準cerebro.plot。

Backtraderta-lib 集成

即使 backtrader 提供了已經 high 數量的內置指標,並且開發指標主要是定義輸入,輸出和以自然的方式編寫公式的問題,有些人也希望使用TA-LIB。

Backtrader 教程:Cerebro - 例外

設計目標之一是儘早退出,讓用戶完全了解錯誤發生的情況。目的是強迫自己擁有會因異常而中斷的代碼並強制重新訪問受影響的部分。但是時機已經成熟,一些例外可能會慢慢添加到平台中。

BacktraderCSV 數據饋送開發

backtrader已經提供了通用 CSV數據提要和一些特定的 CSV數據提要。