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

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

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

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

  1. 必要なモジュールのインストールと読み込み
  2. データの取得
  3. Ku-Chart を作成
  4. Ku-Chart をグラフ化

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

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

Google Colab: Cell-1

!pip install plotly --upgrade

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

Google Colab: 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 )

目次へ

2.データの取得

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

Google Colab: 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(パーセントチェンジ)のグラフを出力して確認してみる。

Google Colab: 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 ) )
Plotlyでグラフを出力して確認

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

目次へ

3.Ku-Chart を作成

Google Colab: 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 の算出結果を確認する

目次へ

4.Ku-Chart をグラフ化

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

Google Colab: 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 ) )

以下のようなグラフが描画される。

Plotly で Ku-Chart を描画

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

目次へ

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