Python&Colab:Plotlyでアニメーショングラフを作成する

Python&Colab:Plotlyでアニメーショングラフを作成する

この記事では、以下の手順とコードをご紹介しています。
・3Dの Surfaceグラフのアニメーション
・Contour(等高線)グラフのアニメーション

Python&Colab:Plotlyでアニメーショングラフを作成する

  1. グラフにするのは「破産の確率」
  2. 3Dの Surfaceグラフのアニメーション
    1. 定額の「破産の確率」
    2. 定率の「破産の確率」
  3. Contour(等高線)グラフのアニメーション
    1. 定額の「破産の確率」
    2. 定率の「破産の確率」

1.グラフにするのは「破産の確率」

バルサラの破産確率表を算出し、グラフ化していきます。「『破産の確率』を算出する方法とコード」については別途記事を書いているので、そちらをご覧ください。

Python&Colab:「破産の確率」を算出とグラフ化(コピペするだけ!)

Google Colab および Python で「『破産の確率』を算出する方法」「破産確率表の作成」「破産確率表のグラフ化」「破産の確率の計算式とコードの解説」などを備忘録としてメモ。

破産確率表は、以下のコードで算出しています。

破産確率表を算出

def make_dict_ruin( win_range ,rr_range ,risk_rate_range ,funds ,ruin_line ,rate_amount='amount') :
    dict_ruin = { 'index' : rr_range
                , 'columns' : [ f'{ win * 100 }' for win in win_range] }
    for risk_rate in risk_rate_range :
        raw = pd.DataFrame()
        for win in win_range :
            for rr in rr_range :
                if rate_amount=='rate' :
                    ruin_rate = ruin_fixed_rate( win ,rr ,risk_rate ,funds ,ruin_line ).calc()
                elif rate_amount=='amount' :
                    ruin_rate = ruin_fixed_amount( win ,rr ,risk_rate ).calc()
                raw.loc[ rr ,f'{ win :.0%}' ] = f'{ round( ruin_rate * 100 ,2 ) }'
        dict_ruin[ risk_rate ] = raw.T.as_matrix()
    return dict_ruin
    
        
        
if __name__=="__main__" :

    win_range = np.arange(0.3 ,0.62 ,0.02)
    rr_range = np.arange(0.4 ,3.1 ,0.1)
    risk_rate_range = np.arange(0.02 ,0.62 ,0.02)
    funds = 1000000
    ruin_line = 200000
    
    dict_ruin = make_dict_ruin( win_range ,rr_range ,risk_rate_range ,funds ,ruin_line ,rate_amount='rate')

目次へ

2.3Dの Surfaceグラフのアニメーション

まずは、グラフを作成するコードを作成。

Surface graph

def make_surface_graph( dict_ruin ,risk_rate_range ,graph_title ) :
    
    sliders = [dict(
          steps = [dict( method = 'animate'
                       , args = [ [ f'{ risk_rate :.0%}' ]
                                , dict( mode = 'immediate'
                                      , frame = dict( duration=100 ,redraw=False )
                                      , transition = dict( duration=0 ) ) ]
                       , label=f'{ risk_rate :.0%}' ) for risk_rate in risk_rate_range ]
        , transition = dict( duration = 0 )
        , x = 0
        , y = 0
        , currentvalue = dict( font = dict(size=12)
                             , prefix = ''
                             , visible = True
                             , xanchor = 'center' )
        , len=1.0 )]
    
    updatemenus = [dict(
          type = 'buttons'
        , showactive = False
        , y = 1
        , x = -0.05
        , xanchor = 'right'
        , yanchor = 'top'
        , pad = dict( t=0, r=10 )
        , buttons = [dict(
              label = 'Play'
            , method = 'animate'
            , args = [ None
                     , dict( frame = dict( duration=100 , redraw=True )
                           , transition = dict( duration=0 )
                           , fromcurrent = True
                           , mode = 'immediate' )] )] )]
    
    layout = go.Layout( title         = graph_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" ,range=[-1,101] ,title="破産の確率(%)")
                          , camera = dict(eye=dict(x=1.5 ,y=.9 ,z=.7)) )
                      , font = dict(color="#fff")
                      , updatemenus = updatemenus
                      , sliders = sliders )
    
    z1 = dict_ruin
    data = [ go.Surface( z = z1[ 0.02 ]
                       , y = z1['columns']
                       , x = z1['index']
                       , cmin=0 ,cmax=100
                       , colorscale = "Jet"
                       , colorbar   = dict(lenmode='fraction' ,len=0.5 ,x=1 ,y=0.3 )
                       , contours   = dict(x=dict(color="#fff") ,y=dict(color="#fff") ,z=dict(color="#fff")) ) ]
    
    frames = []
    for risk_rate in risk_rate_range :
        frames.append( dict( data = [ go.Surface( z = z1[ risk_rate ]
                                                , y = z1['columns']
                                                , x = z1['index'] ) ]
                           , name = f'{ risk_rate :.0%}' ) )
        
    enable_plotly_in_cell()
    fig = dict( data=data ,layout=layout ,frames=frames )
    plotly.offline.iplot( fig )

目次へ

2-1.定額の「破産の確率」

定額の「破産確率表」plotly surface graph risk of ruin probability fix amount

Calculate ruin probability (fix amount)

if __name__=="__main__" :

    graph_title = '定額の「破産の確率」'
    make_surface_graph( dict_ruin ,risk_rate_range ,graph_title )

目次へ

2-2.定率の「破産の確率」

定率の方がどんどん「『破産の確率』のエリア」が広がっていますね。

定率の「破産確率表」plotly surface graph risk of ruin probability fix rate

Calculate ruin probability (fix rate)

if __name__=="__main__" :

    graph_title = '定率の「破産の確率」、元金100万円、破産の基準:20万円'
    make_surface_graph( dict_ruin ,risk_rate_range ,graph_title )

目次へ

3.Contour(等高線)グラフのアニメーション

同じく、グラフを作成するコードを作成。

Contour graph

def make_contour_graph( dict_ruin ,risk_rate_range ,graph_title ) :
    
    sliders = [dict(
          steps = [dict( method = 'animate'
                       , args = [ [ f'{ risk_rate :.0%}' ]
                                , dict( mode = 'immediate'
                                      , frame = dict( duration=100 ,redraw=False )
                                      , transition = dict( duration=0 ) )
                                ]
                       , label=f'{ risk_rate :.0%}' ) for risk_rate in risk_rate_range ]
        , transition = dict( duration = 0 )
        , x = 0
        , y = -0.15
        , currentvalue = dict( font = dict( size=16 )
                             , prefix = '損失の許容: '
                             , visible = True
                             , xanchor = 'center' )
        , len=1.0 )]
    
    updatemenus = [dict(
          type = 'buttons'
        , showactive = False
        , y = 1
        , x = -0.1
        , xanchor = 'right'
        , yanchor = 'top'
        , pad = dict( t=0, r=10 )
        , buttons = [dict(
              label = 'Play'
            , method = 'animate'
            , args = [ None
                     , dict( frame = dict( duration=100 , redraw=True )
                           , transition = dict( duration=0 )
                           , fromcurrent = True
                           , mode = 'immediate' )]
        )] )]
    
    layout = go.Layout( title       = graph_title
                      , autosize    = False
                      , width       = 1000
                      , height      = 800
                      , xaxis       = dict( title="リスクリワード比率" )
                      , yaxis       = dict( title="勝率(%)" )
                      , font        = dict( size=16 )
                      , updatemenus = updatemenus
                      , sliders     = sliders )
    
    z1 = dict_ruin
    data = [ go.Contour( z = z1[ 0.02 ]
                       , y = z1['columns']
                       , x = z1['index']
                       , zmin=0 ,zmax=100
                       , colorscale = "Jet" ) ]
    
    frames = []
    for risk_rate in risk_rate_range :
        frames.append( dict( data = [ go.Contour( z = z1[ risk_rate ]
                                                , y = z1['columns']
                                                , x = z1['index'] ) ]
                           , name = f'{ risk_rate :.0%}' ) )
        
    enable_plotly_in_cell()
    fig = dict( data=data ,layout=layout ,frames=frames )
    plotly.offline.iplot( fig )

目次へ

3-1.定額の「破産の確率」

定額の「破産確率表」plotly contour graph risk of ruin probability fix amount

Calculate ruin probability (fix amount)

if __name__=="__main__" :

    graph_title = '定額の「破産の確率」'
    make_contour_graph( dict_ruin ,risk_rate_range ,graph_title )

目次へ

3-2.定率の「破産の確率」

定率の「破産確率表」plotly contour graph risk of ruin probability fix rate

Calculate ruin probability (fix rate)

if __name__=="__main__" :

    graph_title = '定率の「破産の確率」、元金100万円、破産の基準:20万円'
    make_contour_graph( dict_ruin ,risk_rate_range ,graph_title )

目次へ

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のアップグレード行う、もしくはその他のブラウザを使用しての閲覧をお願いします。