どんな記事
通貨の強弱を確認することができる「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銘柄名 |
---|---|---|
EURUSD | DEXUSEU | U.S. / Euro Foreign Exchange Rate |
GBPUSD | DEXUSUK | U.S. / U.K. Foreign Exchange Rate |
USDJPY | DEXJPUS | Japan / U.S. Foreign Exchange Rate |
USDCHF | DEXSZUS | Switzerland / U.S. Foreign Exchange Rate |
AUDUSD | DEXUSAL | U.S. / Australia Foreign Exchange Rate |
USDCAD | DEXCAUS | Canada / U.S. Foreign Exchange Rate |
NZDUSD | DEXUSNZ | U.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
などの開発を承っています。とくに投資関連が得意です。過去の事例は「実績ページ(不定期更新)」でご確認ください。ご相談は「お問い合わせ」からお願いします。
- 記事をシェア