チャネルブレイクアウトbotコード(by スナフキン氏)読解メモ40

の続きです。
題材コードは https://sshuhei.com/entry/channelbreakout/ です。

describeResultメソッドの続きから。

       pl, buyEntrySignals, sellEntrySignals, buyCloseSignals,\
       sellCloseSignals, nOfTrade, plPerTrade \
           = self.backtest(
           judgement, df_candleStick, 1, rangeTh, rangeTerm,
           originalWaitTerm=originalWaitTerm, waitTh=waitTh,
           cost=cost)

backtestメソッドから各種値が返ってきました。

       plt.figure()
       plt.subplot(211)

subplotは、

plt.subplot(行数, 列数, 何番目のプロットか)

で指定します。 考: http://bicycle1885.hatenablog.com/entry/2014/02/14/023734
211の間にカンマはないので、カンマなしでも問題ないのかもしれません。

       plt.plot(df_candleStick.index, df_candleStick["high"])
       plt.plot(df_candleStick.index, df_candleStick["low"])

x軸をローソク足の番号、y軸を高値もしくは安値としたグラフを描画します。

        plt.ylabel("Price(JPY)")

y軸の名前を設定します。

       ymin = min(df_candleStick["low"]) - 200
       ymax = max(df_candleStick["high"]) + 200

グラフの分かりやすさのために、minを200減算し、maxを200加算します。

       plt.vlines(buyEntrySignals, ymin, ymax, "blue", linestyles='dashed',
                  linewidth=1)
       plt.vlines(sellEntrySignals, ymin, ymax, "red", linestyles='dashed',
                  linewidth=1)
       plt.vlines(buyCloseSignals, ymin, ymax, "black", linestyles='dashed',
                  linewidth=1)
       plt.vlines(sellCloseSignals, ymin, ymax, "green", linestyles='dashed',
                  linewidth=1)

エントリークローズした時間に縦線を引きます。
先ほどのグラフと合わせるとどういう価格でエントリーしてどういう価格でクローズしたかがわかりやすくなります。

       plt.subplot(212)
       plt.plot(df_candleStick.index, pl)
       plt.hlines(y=0, xmin=df_candleStick.index[0],
                  xmax=df_candleStick.index[-1], colors='k',
                  linestyles='dashed')
       plt.ylabel("PL(JPY)")

二つ目のグラフとして、損益履歴をプロットします。

       # 各統計量の計算および表示.
       winTrade = sum([1 for i in plPerTrade if i > 0])
       loseTrade = sum([1 for i in plPerTrade if i < 0])
       winPer = round(winTrade / (winTrade + loseTrade) * 100, 2)

勝ちトレードの回数と負けトレードの回数を計算し、勝率を算出します。

       winTotal = sum([i for i in plPerTrade if i > 0])
       loseTotal = sum([i for i in plPerTrade if i < 0])
       profitFactor = round(winTotal / -loseTotal, 3)

勝ちトレードの利益と負けトレードの損失を計算し、プロフィットファクターを算出します。

       maxProfit = max(plPerTrade)
       maxLoss = min(plPerTrade)

最大利益と最大損失を算出します。

       print("Total pl: {}JPY".format(int(pl[-1])))
       print("The number of Trades: {}".format(nOfTrade))
       print("The Winning percentage: {}%".format(winPer))
       print("The profitFactor: {}".format(profitFactor))
       print("The maximum Profit and Loss: {}JPY, {}JPY".format(maxProfit,
                                                                maxLoss))

バックテスト結果を表示します。

       if showFigure:
           plt.show()
       else:
           plt.clf()

showFigureが指定されている場合はグラフを描画します。
そうでない場合はクリアします。
参考: https://qiita.com/7of9/items/a478f84df3e8a8562cc0

        return pl[-1], profitFactor

最終損益とプロフィットファクターを返します。

15分経ったので今日はここまで。

↓次


この記事が気に入ったらサポートをしてみませんか?