Python:Ku-Chart で通貨の強弱を確認(コピペするだけ!)

Posted on January 20th, 2019Updated on October 25th, 2019
Python:Ku-Chart で通貨の強弱を確認(コピペするだけ!)

※ この記事は最終更新日から5年以上が経過しています。

どんな記事

通貨の強弱を確認することができる「Ku-Chart」をGoogle Colab(Python)で算出し、グラフを描画する方法の備忘録。テスト用の価格データは、pandas_datareaderでFREDから取得。Ku-Chartを算出し、Plotlyでグラフを描画する手順。

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

インストールが必要なのは Plotly だけ。

GoogleColab:Cell-1
!pip install plotly

必要なモジュールを読み込む。

GoogleColab:Cell-2
import pandas as pd
import pandas_datareader.data as web
import numpy as np
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 )

データの取得

データの取得は、pandas_datareaderでFREDから。Stooqやyahooはうまく動作しなかった。幸い、終値だけで事足りるので、FREDのデータで十分。

GoogleColab:Cell-3
start = '2018/1/1'
symbols = { 'EURUSD': 'DEXUSEU'
          , 'GBPUSD': 'DEXUSUK'
          , 'USDJPY': 'DEXJPUS'
          , 'USDCHF': 'DEXSZUS'
          , 'AUDUSD': 'DEXUSAL'
          , 'USDCAD': 'DEXCAUS'
          , 'NZDUSD': 'DEXUSNZ' }

def get_prices( symbolsDict ,start ) :
    fredCodeList = [ symbolsDict[symbol] for symbol in symbolsDict ]
    df = web.DataReader( fredCodeList ,'fred' ,start )

    #列名の変更、欠損値の対応
    renameDict = { symbolsDict[symbol] : symbol  for symbol in symbolsDict }
    return df.rename( columns=renameDict ).ffill()[1:]

if __name__=='__main__' :
    df = get_prices( symbols ,start )

データを取得するための、FRED独自のコードは以下の通り。

通貨FREDコードFRED銘柄名
EURUSDDEXUSEUU.S. / Euro Foreign Exchange Rate
GBPUSDDEXUSUKU.S. / U.K. Foreign Exchange Rate
USDJPYDEXJPUSJapan / U.S. Foreign Exchange Rate
USDCHFDEXSZUSSwitzerland / U.S. Foreign Exchange Rate
AUDUSDDEXUSALU.S. / Australia Foreign Exchange Rate
USDCADDEXCAUSCanada / U.S. Foreign Exchange Rate
NZDUSDDEXUSNZU.S. / New Zealand Foreign Exchange Rate

出力して確認

pct_change(パーセントチェンジ)のグラフを出力して確認してみる。

GoogleColab:Cell-4
layout = dict( autosize = False
             , legend   = dict( xanchor="left" ,y=1.1 ,orientation="h")
             , width    = 1200
             , height   = 600
             , xaxis    = dict( title="" ,type="date" ,showgrid=True ,tickangle=45 ,anchor="y1" ,rangeslider=dict(visible=False) )
             , yaxis    = dict( domain=[.05 ,1.] ,title="" ,side="right")
             , font     = dict( family='Courier New, monospace' ,size=20 ,color='#7f7f7f') )

df2 = df['2018'].pct_change().cumsum()

data = [ go.Scatter(x=df2.index ,y=df2[col] ,name=col ,line=dict(width=1)) for col in df2.columns]

enable_plotly_in_cell()
plotly.offline.iplot( go.Figure( data=data ,layout=layout ) )

ざっくり TradingView で確認し、問題なさそう。

Ku-Chart を作成

GoogleColab:Cell-5
#逆数をとる銘柄
make_reciprocal = { 'USDJPY': 'JPYUSD'
                  , 'USDCHF': 'CHFUSD'
                  , 'USDCAD': 'CADUSD' }

def make_ku() :
    ku  = pd.DataFrame()
    log = df.copy()

    #逆数をとって基軸をUSDに揃える
    for symbol in make_reciprocal :
        log[ make_reciprocal[symbol] ] = 1 / log[ symbol ]
        del log[ symbol ]

    #対数変化率を算出
    # log = log.pct_change().apply( np.log1p )[1:]
    log = np.log( 1 + log.pct_change() )[1:]

    ku['mean'] = np.sum( log ,axis=1 ) / ( len(log.columns) + 1 )
    ku['USD']  = -ku['mean']
    ku['JPY']  = log['JPYUSD'] - ku['mean']
    ku['EUR']  = log['EURUSD'] - ku['mean']
    ku['GBP']  = log['GBPUSD'] - ku['mean']
    ku['AUD']  = log['AUDUSD'] - ku['mean']
    ku['CHF']  = log['CHFUSD'] - ku['mean']
    ku['CAD']  = log['CADUSD'] - ku['mean']
    ku['NZD']  = log['NZDUSD'] - ku['mean']

    del ku['mean']

if __name__=='__main__' :
    make_ku()

ku.head()で出力して確認。

Ku-Chart をグラフ化

算出した Ku-Chart をグラフ化。ポイントはcumsum()

GoogleColab:Cell-6
layout = dict( autosize = False
             , legend   = dict( xanchor="left" ,y=1.1 ,orientation="h")
             , width    = 1200
             , height   = 600
             , xaxis    = dict( title="" ,type="date" ,showgrid=True ,tickangle=45 ,anchor="y1" ,rangeslider=dict(visible=False) )
             , yaxis    = dict( domain=[.05 ,1.] ,title="" ,side="right")
             , font     = dict( family='Courier New, monospace' ,size=20 ,color='#7f7f7f') )

df3 = ku['2018'].cumsum()

data = [ go.Scatter(x=df3.index ,y=df3[col] ,name=col ,line=dict(width=1)) for col in df3.columns ]

enable_plotly_in_cell()
plotly.offline.iplot( go.Figure( data=data ,layout=layout ) )

これも TradingView で、同じ形のチャートになることを確認。おそらく問題なし。

開発を承っています

  • Pineスクリプト(インジケーターやストラテジー)
  • Google Apps Script
  • Python
  • MQL4

などの開発を承っています。とくに投資関連が得意です。過去の事例は「実績ページ(不定期更新)」でご確認ください。ご相談は「お問い合わせ」からお願いします。

同じタグの記事
yuya takahashi

タカハシ / 11年目の兼業投資家

投資やプログラミング、動画コンテンツの撮影・制作・編集などが得意。更新のお知らせは、LINE、メールで行っています。

このブログと筆者についてご質問はこちら

  • 記事をシェア
© Investment Tech Hack 2023.