Python&Colab:投資の「期待値」と 単利・複利の「損益分岐点」を算出、グラフ化

Python&Colab:投資の「期待値」と 単利・複利の「損益分岐点」を算出、グラフ化

この記事では、以下の手順とコードを紹介しています。
・投資の「期待値」の算出
・投資の「単利・複利の『損益分岐点』」の算出
・算出結果をもとにグラフを描画

数値等の詳細について

詳細については以下の記事をお読みください。分からない点はコメントをいただければお答えします。

トレードの損益分岐点! 期待値をプラスにする「勝率とリスクリワード比率」(複利もあるよ!)

この記事を読むと以下のことが分かります。 1.どんな勝率とリスクリワード比率なら勝てるのか(根拠) 2.損益分岐点をグラフで分かりやすく 3.損益分岐点をトレードで用いる際の "注意点"

複利を活かす#4: ベストな資金管理はこれ!投資の "複利" を徹底検証

複利は非常に強力です。しかし一方で、理解せずに使うと「利益がでるはずなのに "何故か" 損してしまった」という事態に陥ってしまいます。複利の「活用方法」を、根拠とともにご紹介したいと思います。

Python&Colab:投資における「期待値」と 単利・複利の「損益分岐点」を算出、グラフ化

  1. 必要なモジュールのインストールと読み込み
  2. 期待値の算出
  3. 期待値一覧表の作成
  4. Surface(3D)グラフの作成
  5. Contour(等高線)グラフの作成
  6. 複利の損益分岐点(均衡利益率)の算出とグラフ
  7. 複利の損益分岐点(RR)の算出とグラフ

1.必要なモジュールのインストールと読み込み

Google Colab: Cell-1

!pip install plotly --upgrade

import numpy as np
import pandas as pd

import plotly
import plotly.graph_objs as go
import plotly.figure_factory as ff
plotly.offline.init_notebook_mode( connected=True )

# google colabでplotlyを表示するにはこれが必要。
# グラフを書き出すセルごとに使用する
def enable_plotly_in_cell():
    import IPython
    from plotly.offline import init_notebook_mode
    display(IPython.core.display.HTML('''
            <script src="/static/components/requirejs/require.js"></script>
    '''))
    init_notebook_mode( connected=False )

目次へ

2.期待値の算出

リスクを「1」とした場合の期待値を算出。

Google Colab: Cell-2

def calc_edge( win ,rr ) :
    return win * rr - abs( 1 - win )

if __name__=='__main__' :
    win = 0.4176
    rr = 2.044
    print( calc_edge( win ,rr ) )

以下のように算出される。

0.27117440000000004

目次へ

3.期待値一覧表の作成

Google Colab: Cell-3

win_range = np.arange(0.7 ,0.2 ,-0.02)
rr_range  = np.arange(0.1 ,4.1 ,0.1)

df_edge = pd.DataFrame()
for win in win_range :
    for rr in rr_range :
        edge = calc_edge( win ,rr )
        df_edge.loc[rr ,f'{ win :.0%}'] = f'{ round( edge ,3 ) }'

df_edge
  90% 88% 86% 84% 82% 80% 78% 76% 74% 72% 70% 68% 66% 64% 62% 60% 58% 56% 54% 52% 50% 48% 46% 44% 42% 40% 38% 36% 34% 32% 30% 28% 26% 24% 22% 20% 18% 16% 14% 12%
0.1 -0.01 -0.032 -0.054 -0.076 -0.098 -0.12 -0.142 -0.164 -0.186 -0.208 -0.23 -0.252 -0.274 -0.296 -0.318 -0.34 -0.362 -0.384 -0.406 -0.428 -0.45 -0.472 -0.494 -0.516 -0.538 -0.56 -0.582 -0.604 -0.626 -0.648 -0.67 -0.692 -0.714 -0.736 -0.758 -0.78 -0.802 -0.824 -0.846 -0.868
0.2 0.08 0.056 0.032 0.008 -0.016 -0.04 -0.064 -0.088 -0.112 -0.136 -0.16 -0.184 -0.208 -0.232 -0.256 -0.28 -0.304 -0.328 -0.352 -0.376 -0.4 -0.424 -0.448 -0.472 -0.496 -0.52 -0.544 -0.568 -0.592 -0.616 -0.64 -0.664 -0.688 -0.712 -0.736 -0.76 -0.784 -0.808 -0.832 -0.856
0.3 0.17 0.144 0.118 0.092 0.066 0.04 0.014 -0.012 -0.038 -0.064 -0.09 -0.116 -0.142 -0.168 -0.194 -0.22 -0.246 -0.272 -0.298 -0.324 -0.35 -0.376 -0.402 -0.428 -0.454 -0.48 -0.506 -0.532 -0.558 -0.584 -0.61 -0.636 -0.662 -0.688 -0.714 -0.74 -0.766 -0.792 -0.818 -0.844
0.4 0.26 0.232 0.204 0.176 0.148 0.12 0.092 0.064 0.036 0.008 -0.02 -0.048 -0.076 -0.104 -0.132 -0.16 -0.188 -0.216 -0.244 -0.272 -0.3 -0.328 -0.356 -0.384 -0.412 -0.44 -0.468 -0.496 -0.524 -0.552 -0.58 -0.608 -0.636 -0.664 -0.692 -0.72 -0.748 -0.776 -0.804 -0.832
0.5 0.35 0.32 0.29 0.26 0.23 0.2 0.17 0.14 0.11 0.08 0.05 0.02 -0.01 -0.04 -0.07 -0.1 -0.13 -0.16 -0.19 -0.22 -0.25 -0.28 -0.31 -0.34 -0.37 -0.4 -0.43 -0.46 -0.49 -0.52 -0.55 -0.58 -0.61 -0.64 -0.67 -0.7 -0.73 -0.76 -0.79 -0.82
0.6 0.44 0.408 0.376 0.344 0.312 0.28 0.248 0.216 0.184 0.152 0.12 0.088 0.056 0.024 -0.008 -0.04 -0.072 -0.104 -0.136 -0.168 -0.2 -0.232 -0.264 -0.296 -0.328 -0.36 -0.392 -0.424 -0.456 -0.488 -0.52 -0.552 -0.584 -0.616 -0.648 -0.68 -0.712 -0.744 -0.776 -0.808
0.7 0.53 0.496 0.462 0.428 0.394 0.36 0.326 0.292 0.258 0.224 0.19 0.156 0.122 0.088 0.054 0.02 -0.014 -0.048 -0.082 -0.116 -0.15 -0.184 -0.218 -0.252 -0.286 -0.32 -0.354 -0.388 -0.422 -0.456 -0.49 -0.524 -0.558 -0.592 -0.626 -0.66 -0.694 -0.728 -0.762 -0.796
0.8 0.62 0.584 0.548 0.512 0.476 0.44 0.404 0.368 0.332 0.296 0.26 0.224 0.188 0.152 0.116 0.08 0.044 0.008 -0.028 -0.064 -0.1 -0.136 -0.172 -0.208 -0.244 -0.28 -0.316 -0.352 -0.388 -0.424 -0.46 -0.496 -0.532 -0.568 -0.604 -0.64 -0.676 -0.712 -0.748 -0.784
0.9 0.71 0.672 0.634 0.596 0.558 0.52 0.482 0.444 0.406 0.368 0.33 0.292 0.254 0.216 0.178 0.14 0.102 0.064 0.026 -0.012 -0.05 -0.088 -0.126 -0.164 -0.202 -0.24 -0.278 -0.316 -0.354 -0.392 -0.43 -0.468 -0.506 -0.544 -0.582 -0.62 -0.658 -0.696 -0.734 -0.772
1.0 0.8 0.76 0.72 0.68 0.64 0.6 0.56 0.52 0.48 0.44 0.4 0.36 0.32 0.28 0.24 0.2 0.16 0.12 0.08 0.04 -0.0 -0.04 -0.08 -0.12 -0.16 -0.2 -0.24 -0.28 -0.32 -0.36 -0.4 -0.44 -0.48 -0.52 -0.56 -0.6 -0.64 -0.68 -0.72 -0.76
1.1 0.89 0.848 0.806 0.764 0.722 0.68 0.638 0.596 0.554 0.512 0.47 0.428 0.386 0.344 0.302 0.26 0.218 0.176 0.134 0.092 0.05 0.008 -0.034 -0.076 -0.118 -0.16 -0.202 -0.244 -0.286 -0.328 -0.37 -0.412 -0.454 -0.496 -0.538 -0.58 -0.622 -0.664 -0.706 -0.748
1.2 0.98 0.936 0.892 0.848 0.804 0.76 0.716 0.672 0.628 0.584 0.54 0.496 0.452 0.408 0.364 0.32 0.276 0.232 0.188 0.144 0.1 0.056 0.012 -0.032 -0.076 -0.12 -0.164 -0.208 -0.252 -0.296 -0.34 -0.384 -0.428 -0.472 -0.516 -0.56 -0.604 -0.648 -0.692 -0.736
1.3 1.07 1.024 0.978 0.932 0.886 0.84 0.794 0.748 0.702 0.656 0.61 0.564 0.518 0.472 0.426 0.38 0.334 0.288 0.242 0.196 0.15 0.104 0.058 0.012 -0.034 -0.08 -0.126 -0.172 -0.218 -0.264 -0.31 -0.356 -0.402 -0.448 -0.494 -0.54 -0.586 -0.632 -0.678 -0.724
1.4 1.16 1.112 1.064 1.016 0.968 0.92 0.872 0.824 0.776 0.728 0.68 0.632 0.584 0.536 0.488 0.44 0.392 0.344 0.296 0.248 0.2 0.152 0.104 0.056 0.008 -0.04 -0.088 -0.136 -0.184 -0.232 -0.28 -0.328 -0.376 -0.424 -0.472 -0.52 -0.568 -0.616 -0.664 -0.712
1.5 1.25 1.2 1.15 1.1 1.05 1.0 0.95 0.9 0.85 0.8 0.75 0.7 0.65 0.6 0.55 0.5 0.45 0.4 0.35 0.3 0.25 0.2 0.15 0.1 0.05 -0.0 -0.05 -0.1 -0.15 -0.2 -0.25 -0.3 -0.35 -0.4 -0.45 -0.5 -0.55 -0.6 -0.65 -0.7
1.6 1.34 1.288 1.236 1.184 1.132 1.08 1.028 0.976 0.924 0.872 0.82 0.768 0.716 0.664 0.612 0.56 0.508 0.456 0.404 0.352 0.3 0.248 0.196 0.144 0.092 0.04 -0.012 -0.064 -0.116 -0.168 -0.22 -0.272 -0.324 -0.376 -0.428 -0.48 -0.532 -0.584 -0.636 -0.688
1.7 1.43 1.376 1.322 1.268 1.214 1.16 1.106 1.052 0.998 0.944 0.89 0.836 0.782 0.728 0.674 0.62 0.566 0.512 0.458 0.404 0.35 0.296 0.242 0.188 0.134 0.08 0.026 -0.028 -0.082 -0.136 -0.19 -0.244 -0.298 -0.352 -0.406 -0.46 -0.514 -0.568 -0.622 -0.676
1.8 1.52 1.464 1.408 1.352 1.296 1.24 1.184 1.128 1.072 1.016 0.96 0.904 0.848 0.792 0.736 0.68 0.624 0.568 0.512 0.456 0.4 0.344 0.288 0.232 0.176 0.12 0.064 0.008 -0.048 -0.104 -0.16 -0.216 -0.272 -0.328 -0.384 -0.44 -0.496 -0.552 -0.608 -0.664
1.9 1.61 1.552 1.494 1.436 1.378 1.32 1.262 1.204 1.146 1.088 1.03 0.972 0.914 0.856 0.798 0.74 0.682 0.624 0.566 0.508 0.45 0.392 0.334 0.276 0.218 0.16 0.102 0.044 -0.014 -0.072 -0.13 -0.188 -0.246 -0.304 -0.362 -0.42 -0.478 -0.536 -0.594 -0.652
2.0 1.7 1.64 1.58 1.52 1.46 1.4 1.34 1.28 1.22 1.16 1.1 1.04 0.98 0.92 0.86 0.8 0.74 0.68 0.62 0.56 0.5 0.44 0.38 0.32 0.26 0.2 0.14 0.08 0.02 -0.04 -0.1 -0.16 -0.22 -0.28 -0.34 -0.4 -0.46 -0.52 -0.58 -0.64
2.1 1.79 1.728 1.666 1.604 1.542 1.48 1.418 1.356 1.294 1.232 1.17 1.108 1.046 0.984 0.922 0.86 0.798 0.736 0.674 0.612 0.55 0.488 0.426 0.364 0.302 0.24 0.178 0.116 0.054 -0.008 -0.07 -0.132 -0.194 -0.256 -0.318 -0.38 -0.442 -0.504 -0.566 -0.628
2.2 1.88 1.816 1.752 1.688 1.624 1.56 1.496 1.432 1.368 1.304 1.24 1.176 1.112 1.048 0.984 0.92 0.856 0.792 0.728 0.664 0.6 0.536 0.472 0.408 0.344 0.28 0.216 0.152 0.088 0.024 -0.04 -0.104 -0.168 -0.232 -0.296 -0.36 -0.424 -0.488 -0.552 -0.616
2.3 1.97 1.904 1.838 1.772 1.706 1.64 1.574 1.508 1.442 1.376 1.31 1.244 1.178 1.112 1.046 0.98 0.914 0.848 0.782 0.716 0.65 0.584 0.518 0.452 0.386 0.32 0.254 0.188 0.122 0.056 -0.01 -0.076 -0.142 -0.208 -0.274 -0.34 -0.406 -0.472 -0.538 -0.604
2.4 2.06 1.992 1.924 1.856 1.788 1.72 1.652 1.584 1.516 1.448 1.38 1.312 1.244 1.176 1.108 1.04 0.972 0.904 0.836 0.768 0.7 0.632 0.564 0.496 0.428 0.36 0.292 0.224 0.156 0.088 0.02 -0.048 -0.116 -0.184 -0.252 -0.32 -0.388 -0.456 -0.524 -0.592
2.5 2.15 2.08 2.01 1.94 1.87 1.8 1.73 1.66 1.59 1.52 1.45 1.38 1.31 1.24 1.17 1.1 1.03 0.96 0.89 0.82 0.75 0.68 0.61 0.54 0.47 0.4 0.33 0.26 0.19 0.12 0.05 -0.02 -0.09 -0.16 -0.23 -0.3 -0.37 -0.44 -0.51 -0.58
2.6 2.24 2.168 2.096 2.024 1.952 1.88 1.808 1.736 1.664 1.592 1.52 1.448 1.376 1.304 1.232 1.16 1.088 1.016 0.944 0.872 0.8 0.728 0.656 0.584 0.512 0.44 0.368 0.296 0.224 0.152 0.08 0.008 -0.064 -0.136 -0.208 -0.28 -0.352 -0.424 -0.496 -0.568
2.7 2.33 2.256 2.182 2.108 2.034 1.96 1.886 1.812 1.738 1.664 1.59 1.516 1.442 1.368 1.294 1.22 1.146 1.072 0.998 0.924 0.85 0.776 0.702 0.628 0.554 0.48 0.406 0.332 0.258 0.184 0.11 0.036 -0.038 -0.112 -0.186 -0.26 -0.334 -0.408 -0.482 -0.556
2.8 2.42 2.344 2.268 2.192 2.116 2.04 1.964 1.888 1.812 1.736 1.66 1.584 1.508 1.432 1.356 1.28 1.204 1.128 1.052 0.976 0.9 0.824 0.748 0.672 0.596 0.52 0.444 0.368 0.292 0.216 0.14 0.064 -0.012 -0.088 -0.164 -0.24 -0.316 -0.392 -0.468 -0.544
2.9 2.51 2.432 2.354 2.276 2.198 2.12 2.042 1.964 1.886 1.808 1.73 1.652 1.574 1.496 1.418 1.34 1.262 1.184 1.106 1.028 0.95 0.872 0.794 0.716 0.638 0.56 0.482 0.404 0.326 0.248 0.17 0.092 0.014 -0.064 -0.142 -0.22 -0.298 -0.376 -0.454 -0.532
3.0 2.6 2.52 2.44 2.36 2.28 2.2 2.12 2.04 1.96 1.88 1.8 1.72 1.64 1.56 1.48 1.4 1.32 1.24 1.16 1.08 1.0 0.92 0.84 0.76 0.68 0.6 0.52 0.44 0.36 0.28 0.2 0.12 0.04 -0.04 -0.12 -0.2 -0.28 -0.36 -0.44 -0.52
3.1 2.69 2.608 2.526 2.444 2.362 2.28 2.198 2.116 2.034 1.952 1.87 1.788 1.706 1.624 1.542 1.46 1.378 1.296 1.214 1.132 1.05 0.968 0.886 0.804 0.722 0.64 0.558 0.476 0.394 0.312 0.23 0.148 0.066 -0.016 -0.098 -0.18 -0.262 -0.344 -0.426 -0.508
3.2 2.78 2.696 2.612 2.528 2.444 2.36 2.276 2.192 2.108 2.024 1.94 1.856 1.772 1.688 1.604 1.52 1.436 1.352 1.268 1.184 1.1 1.016 0.932 0.848 0.764 0.68 0.596 0.512 0.428 0.344 0.26 0.176 0.092 0.008 -0.076 -0.16 -0.244 -0.328 -0.412 -0.496
3.3 2.87 2.784 2.698 2.612 2.526 2.44 2.354 2.268 2.182 2.096 2.01 1.924 1.838 1.752 1.666 1.58 1.494 1.408 1.322 1.236 1.15 1.064 0.978 0.892 0.806 0.72 0.634 0.548 0.462 0.376 0.29 0.204 0.118 0.032 -0.054 -0.14 -0.226 -0.312 -0.398 -0.484
3.4 2.96 2.872 2.784 2.696 2.608 2.52 2.432 2.344 2.256 2.168 2.08 1.992 1.904 1.816 1.728 1.64 1.552 1.464 1.376 1.288 1.2 1.112 1.024 0.936 0.848 0.76 0.672 0.584 0.496 0.408 0.32 0.232 0.144 0.056 -0.032 -0.12 -0.208 -0.296 -0.384 -0.472
3.5 3.05 2.96 2.87 2.78 2.69 2.6 2.51 2.42 2.33 2.24 2.15 2.06 1.97 1.88 1.79 1.7 1.61 1.52 1.43 1.34 1.25 1.16 1.07 0.98 0.89 0.8 0.71 0.62 0.53 0.44 0.35 0.26 0.17 0.08 -0.01 -0.1 -0.19 -0.28 -0.37 -0.46
3.6 3.14 3.048 2.956 2.864 2.772 2.68 2.588 2.496 2.404 2.312 2.22 2.128 2.036 1.944 1.852 1.76 1.668 1.576 1.484 1.392 1.3 1.208 1.116 1.024 0.932 0.84 0.748 0.656 0.564 0.472 0.38 0.288 0.196 0.104 0.012 -0.08 -0.172 -0.264 -0.356 -0.448
3.7 3.23 3.136 3.042 2.948 2.854 2.76 2.666 2.572 2.478 2.384 2.29 2.196 2.102 2.008 1.914 1.82 1.726 1.632 1.538 1.444 1.35 1.256 1.162 1.068 0.974 0.88 0.786 0.692 0.598 0.504 0.41 0.316 0.222 0.128 0.034 -0.06 -0.154 -0.248 -0.342 -0.436
3.8 3.32 3.224 3.128 3.032 2.936 2.84 2.744 2.648 2.552 2.456 2.36 2.264 2.168 2.072 1.976 1.88 1.784 1.688 1.592 1.496 1.4 1.304 1.208 1.112 1.016 0.92 0.824 0.728 0.632 0.536 0.44 0.344 0.248 0.152 0.056 -0.04 -0.136 -0.232 -0.328 -0.424
3.9 3.41 3.312 3.214 3.116 3.018 2.92 2.822 2.724 2.626 2.528 2.43 2.332 2.234 2.136 2.038 1.94 1.842 1.744 1.646 1.548 1.45 1.352 1.254 1.156 1.058 0.96 0.862 0.764 0.666 0.568 0.47 0.372 0.274 0.176 0.078 -0.02 -0.118 -0.216 -0.314 -0.412
4.0 3.5 3.4 3.3 3.2 3.1 3.0 2.9 2.8 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2.0 1.9 1.8 1.7 1.6 1.5 1.4 1.3 1.2 1.1 1.0 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 -0.0 -0.1 -0.2 -0.3 -0.4

目次へ

4.Surface(3D)グラフの作成

半透明の部分が、期待値の「プラスとマイナスの境い目」。

Google Colab: Cell-4

layout = go.Layout( title         = '期待値の変化'
                  , autosize      = False
                  , paper_bgcolor = "#000"
                  , width         = 1000
                  , height        = 800
                  , scene = dict(
                          aspectmode  = "manual"
                        , aspectratio = dict(x=1 ,y=1 ,z=0.5)
                        , xaxis = dict(color="#fff" ,linecolor="#fff" ,gridcolor="#eee" ,title="勝率")
                        , yaxis = dict(color="#fff" ,linecolor="#fff" ,gridcolor="#eee" ,title="リスクリワード比率")
                        , zaxis = dict(color="#fff" ,linecolor="#fff" ,gridcolor="#eee" ,title="期待値")
                        , camera = dict(eye=dict(x=-1.5 ,y=-1 ,z=.9)) )
                  , font = dict(color="#fff") )

z1 = df_edge

data = [ go.Surface( z = np.zeros(( len(z1.index) ,len(z1.columns) ))
                   , y = z1.index
                   , x = z1.columns 
                   , showscale=False
                   , opacity=0.7 )
       , go.Surface( z = z1.as_matrix()
                   , y = z1.index
                   , x = z1.columns 
                   #, cmin=0 ,cmax=1
                   , colorscale = "Jet"
                   , colorbar   = dict(lenmode='fraction', len=0.5)
                   , contours   = dict(x=dict(color="#fff") ,y=dict(color="#fff") ,z=dict(color="#fff")) ) ]


enable_plotly_in_cell()
plotly.offline.iplot( go.Figure( data=data ,layout=layout ) )
Surface(3D)グラフ 単利 期待値

目次へ

5.Contour(等高線)グラフの作成

「0」のラインが、期待値「±0」を表す。ゼロラインより右上ならプラス、左下ならマイナスの期待値。

Google Colab: Cell-5

layout = go.Layout( title    = '期待値の変化'
                  , autosize = False
                  , xaxis    = dict( title="リスクリワード比率" )
                  , yaxis    = dict( title="勝率(%)" )
                  , width    = 1000
                  , height   = 800
                  , font     = dict( size=16 ) )

z1 = df_edge

data = [ go.Contour( z = z1.T.as_matrix() #go.Heatmap
                   , x = z1.index
                   , y = z1.columns
                   , colorscale = 'Jet' ) ]

enable_plotly_in_cell()
plotly.offline.iplot(go.Figure(data=data ,layout=layout))
Contour(等高線)グラフ 単利 期待値

目次

6.複利の損益分岐点(均衡利益率)の算出とグラフ

Google Colab: Cell-6

def calc_compound_break_even_profit_rate( win_rate ,loss_pct ) :
    return ( 1 - loss_pct )**( 1 - 1 / win_rate ) - 1

def calc_simple_break_even_profit_rate( win_rate ,loss_pct ) :
    return ( 1 - win_rate ) * loss_pct / win_rate

def df_break_even_profit( win_range ,loss_range ,comp_simp ) :
    raw = pd.DataFrame()
    for win_rate in win_range :
        for loss_pct in loss_range :
            for manage in comp_simp :
                row = f'{ win_rate :.0%}'
                col = f'{ manage } { loss_pct :.0%}'
                if manage=='複利' :
                    calc_result = f'{ calc_compound_break_even_profit_rate( win_rate ,loss_pct ) :%}'
                if manage=='単利' :
                    calc_result = f'{ calc_simple_break_even_profit_rate( win_rate ,loss_pct ) :%}'
                raw.loc[ row ,col ] = calc_result
    return raw

def make_graph( df ) :
    layout = go.Layout( title    = '損益均衡点'
                      , autosize = False
                      , xaxis    = dict( title="勝率(%)" )
                      , yaxis    = dict( title="均衡利益率" )
                      , width    = 1000
                      , height   = 800
                      , font     = dict( size=16 ) )
    data = [ go.Scatter( x = df.index
                       , y = df[ col ]
                       , mode = 'lines'
                       , name = col )
           for col in df.columns ]
    enable_plotly_in_cell()
    plotly.offline.iplot(go.Figure(data=data ,layout=layout))    

if __name__=='__main__' :
    win_range = np.arange(0.7 ,0.2 ,-0.02)
    loss_range = [ 0.05 ,0.1 ,0.2 ]
    comp_simp = ['複利' ,'単利']
    df = df_break_even_profit( win_range ,loss_range ,comp_simp )
    make_graph( df )
複利の損益分岐点(均衡利益率)

目次

7.複利の損益分岐点(RR)の算出とグラフ

6.複利の損益分岐点(均衡利益率)」に少し手を加えて「RR」で確認できるようにし、縦・横軸を「破産の確率」のグラフに合わせたもの。

Google Colab: Cell-7

def calc_compound_break_even_rr( win_rate ,loss_pct ) :
    profit_pct  = ( 1 - loss_pct )**( 1 - 1 / win_rate ) - 1
    risk_reward = profit_pct / loss_pct
    return risk_reward

def calc_simple_break_even_rr( win_rate ,loss_pct ) :
    profit_pct  = ( 1 - win_rate ) * loss_pct / win_rate
    risk_reward = profit_pct / loss_pct
    return risk_reward

def df_break_even_rr( win_range ,loss_range ,comp_simp ) :
    raw = pd.DataFrame()
    for win_rate in win_range :
        for loss_pct in loss_range :
            for manage in comp_simp :
                row = f'{ win_rate :.0%}'
                col = f'{ manage } { loss_pct :.0%}'
                if manage=='複利' :
                    calc_result = f'{ calc_compound_break_even_rr( win_rate ,loss_pct ) :.5}'
                if manage=='単利' :
                    calc_result = f'{ calc_simple_break_even_rr( win_rate ,loss_pct ) :.5}'
                raw.loc[ row ,col ] = calc_result
    return raw

def make_graph( df ) :
    layout = go.Layout( title    = '損益均衡点'
                      , autosize = False
                      , yaxis    = dict( title="勝率(%)" )
                      , xaxis    = dict( title="リスクリワード比率" )
                      , width    = 1000
                      , height   = 500
                      , font     = dict( size=16 ) )
    data = [ go.Scatter( y = df.index
                       , x = df[ col ]
                       , mode = 'lines'
                       , name = col )
           for col in df.columns ]
    enable_plotly_in_cell()
    plotly.offline.iplot(go.Figure(data=data ,layout=layout))    

if __name__=='__main__' :
    win_range  = np.arange(0.6 ,0.2 ,-0.02)
    loss_range = [ 0.02 ,0.05 ,0.1 ,0.2 ]
    comp_simp  = ['複利' ,'単利']
    df = df_break_even_rr( win_range ,loss_range ,comp_simp )
    make_graph( df )
複利の損益分岐点(RR)

目次

Back to Top

abbamboo

タカハシ / 7年目の兼業トレーダー

このブログの目的は、「学習の備忘録」と「アウトプットして理解を深めること」。「トレードで稼ぐために学んだこと」を徹底的に公開していきます。

元・日本料理の板前、現・金融畑のウェブ屋さん
保有資格:証券外務員1種、認定テクニカルアナリスト

更新のお知らせは、各SNSやLINEで。LINEだと1対1でお話することもできます!

>> このブログと著者についての詳細
>> 使っているツールの紹介

Investment Tech Hack

Sorry... doesn't support your browser

To get the best possible experience using our site we recommend that you upgrade to a modern web browser. Investment Tech Hackではご利用中のブラウザサポートはしていません。
Internet Explorerのアップグレード行う、もしくはその他のブラウザを使用しての閲覧をお願いします。