投資のためのデータサイエンス

個人の投資活動に役立つデータ分析にまつわる話題を綴ります。

mplfinanceライブラリを用いた株価チャートの描画(その5)

今回もmplfinaceライブラリによる株価チャートの続きです。mplfinanceでは別途コーディングして計算した指標をチャートに付け加えることができます。

今回もまず、必要なライブラリをインポートし、株価データをダウンロードします。

# ライブラリのインポート
import pandas as pd
from pandas_datareader import data as pdr
import mplfinance as mpf
import datetime
import yfinance as yf
# Yahoo! Financeからのデータ獲得
start = "2023-1-1"
end = datetime.date.today()
ticker = "4755.T" # 4755は楽天グループ
yf.pdr_override()
# yahooサイトからデータをダウンロード
df3 = pdr.get_data_yahoo(ticker, start, end)

ここでは、MACDオシレーターの諸指標をプロットします。最初に諸指標を計算して別途データフレームに格納する関数を定義し、次にその関数を呼び出し、さらに作成したプロットのリストを引数addplot=で指定してチャートの下にMACDのプロットを付け加えます。

# MACDの諸指標を計算する関数
# .ewm(span=n)のとき指数平滑係数α=2/(span+1) ただしspan>=1
def MACD(df, window_slow, window_fast, window_signal):
    macd = pd.DataFrame()
    macd['ema_slow'] = df['Close'].ewm(span=window_slow).mean()
    macd['ema_fast'] = df['Close'].ewm(span=window_fast).mean()
    macd['macd'] = macd['ema_slow'] - macd['ema_fast']
    macd['signal'] = macd['macd'].ewm(span=window_signal).mean()
    macd['diff'] = macd['macd'] - macd['signal']
    macd['bar_positive'] = macd['diff'].map(lambda x: x if x > 0 else 0)
    macd['bar_negative'] = macd['diff'].map(lambda x: x if x < 0 else 0)
    return macd

# MACD計算関数を呼び出し、結果をデータフレームに格納する
macd = MACD(df3, 12, 26, 9)

# mplfinanceのmake_addplotメソッドを用いてチャートに付け加えるプロットを作成する
macd_plot = [
    mpf.make_addplot((macd['macd']), color='#D2691E', panel=2, ylabel='MACD', secondary_y=False), #D2691Eはチョコレート色
    mpf.make_addplot((macd['signal']), color='#800080', panel=2, secondary_y=False), #800080は紫
    mpf.make_addplot((macd['bar_positive']), type='bar', color='#4dc790', panel=2),
    mpf.make_addplot((macd['bar_negative']), type='bar', color='#fd6b6c', panel=2),
]

# 上記で作成したプロットのリストを引数addplot=で指定してチャートの下にMACDのプロットを付け加える
mpf.plot(df3,type='candle',figsize =(12,6), style='yahoo',
          volume=True, addplot=macd_plot,
          title = "STOCK PRICE CHART FOR {0}".format(ticker))

このaddplotの機能を利用することにより、Yahoo! Financeで提供されるデータを用いて計算できるあらゆる指標をチャートに付け加えることができ、オリジナルのチャート分析ツールとしてカスタマイズして強力な株価分析ツールを作り上げることができます。

mplfinanceライブラリを用いた株価チャートの描画(その4)

前回から少し間が空いてしまいましたが、mplfinaceライブラリによる株価チャートの続きです。mplfinanceでは(株価分析ツールとして)広く使われている移動平均(MA)や出来高を表示することもできます。

まず、必要なライブラリをインポートします。尚、ライブラリmplfinanceインポート時の別名は今回より、一般的に用いられている"mpf"に変更しました。

import pandas as pd
from pandas_datareader import data as pdr
import mplfinance as mpf
import datetime
import yfinance as yf

ここでは、日単位のローソク足を表示し、それに5日,25日,75日の移動平均を重ねて表示しています。尚、移動平均曲線の色はstyle='yahoo'を指定した場合、matplotlibのデフォルトの順番で青,オレンジ,緑となります。

start = "2023-1-1"
end = datetime.date.today()
ticker = "4755.T" # 4755は楽天グループ
yf.pdr_override()
# yahooサイトからデータをダウンロード
df2 = pdr.get_data_yahoo(ticker, start, end)
# 指定可能なtype: 'ohlc'(default), 'candle', 'line', 'renko', 'pnf'
mpf.plot(df2,type='candle', figsize =(16,5), style='yahoo',
          mav=(5,25,75), # 移動平均(色は順に青,オレンジ,緑)
          volume=True, # 出来高
          title = "STOCK PRICE CHART FOR {0}".format(ticker))


さまざまな期間で計算した移動平均を重ね合わせることにより、トレンドの方向性の把握が容易になり、さらに出来高を表示することにより、より市場の状況の理解に役立ちます。

mplfinanceライブラリを用いた株価チャートの描画(その3)

今回も株価分析用のチャートの描画のためのmplfinanceというライブラリに関する話題です。mplfinanceではローソク足のような通常の時系列チャート以外にも、「連行足チャート」と「ポイント・アンド・フィギュア」という不規則時系列チャートの描画もサポートしています。

まず、必要なライブラリをインポートします。

import pandas as pd
from pandas_datareader import data as pdr
import mplfinance as fplt
import datetime
import yfinance as yf

最初は「連行足チャート」の描画です。日本で開発された手法ですが、現在日本では類似した手法である「カギ足チャート」の方がよく知られているようです。連行足チャートを描く場合にはどの位の価格の変化があったら「レンガ」を積み増すかを指定する必要があります。mplfinanceの場合のデフォルトではATR、つまり直前の一定期間のボラティリティの大きさを示す指標を用います。計算期間の長さのデフォルトは14です。

start = "2022-8-1"
end = datetime.date.today()
ticker = "4755.T" # 4755は楽天グループ
yf.pdr_override()
# yahooサイトからデータをダウンロード
df2 = pdr.get_data_yahoo(ticker, start, end)
# 指定可能なtype: 'ohlc'(default), 'candle', 'line', 'renko', 'pnf'
fplt.plot(df2,type='renko',figsize =(16,5), style='yahoo',
          renko_params=dict(brick_size='atr',atr_length=14),
# レンガのサイズ:brick_size='atr'はデフォルト(Average True Range) ATRの長さ atr_length=14はデフォルト
          title = "STOCK PRICE CHART FOR {0}".format(ticker))

次に「ポイント・アンド・フィギュア」の描画です。描画の設定を適切に行えば収益をあげられる可能性が高いことが確かめられている手法です。ポイント・アンド・フィギュアを描く場合にはどの位の価格の変化があったら印を積み増すか(1枠の大きさ)及びその枠の大きさの何倍の逆向き変化があったらトレンド反転と判断するか(反転枠数)を指定する必要があります。mplfinanceの場合、1枠の大きさのデフォルトでは連行足チャートと同じATRを用います。反転枠数のデフォルトは1です。

start = "2022-8-1"
end = datetime.date.today()
ticker = "4755.T" # 4755は楽天グループ
yf.pdr_override()
# yahooサイトからデータをダウンロード
df3 = pdr.get_data_yahoo(ticker, start, end)
# 指定可能なtype: 'ohlc'(default), 'candle', 'line', 'renko', 'pnf'
fplt.plot(df3,type='pnf',figsize =(16,5), style='yahoo',
          pnf_params=dict(box_size='atr',reversal=1),
# 1枠の大きさ:box_size='atr'はデフォルト(Average True Range) 反転枠数:reversal=1はデフォルト
          title = "STOCK PRICE CHART FOR {0}".format(ticker))

このような不規則時系列チャートを描けることがmplfinanceライブラリの大きな魅力でもあります。

mplfinanceライブラリを用いた株価チャートの描画(その2)

前回は株価分析のためにmplfinanceというライブラリを用いて株価のチャートを描く方法を述べました。今回は同ライブラリにある補助線をひく機能について述べます。

ここでは、前回紹介したPythonコードが全て実行されていることを前提とします。

まず、グラフのY軸の値を指定して水平線をひくことができます。これは支持線抵抗線をひく時に便利です。

fplt.plot(df,type='ohlc',style='yahoo',figsize =(18,7),
          hlines=dict(hlines=[30900,37450], colors=['g','r'],linestyle='-.'),
          title = "STOCK PRICE CHART FOR {0}".format(ticker))

同様に、グラフのX軸の値(この場合は日付)を指定して垂直線をひくこともできます。ここではその垂直線に幅を持たせて、ある期間をハイライトしています。

fplt.plot(df,type='candle',style='yahoo',figsize =(18,7),
          vlines=dict(vlines='2023-05-15',linewidths=60,alpha=0.4),
          title = "STOCK PRICE CHART FOR {0}".format(ticker))

また、日付および特性値の種類(高値(high)/安値(low)/始値(open)/終値(close))を指定してトレンドラインをひくこともできます。機能的には3つ以上の日付を折れ線状に結ぶラインの表示もできますが、ここでは一般的な上昇トレンドラインのひき方にしたがって、2つの日付の安値の間を結ぶ線をひいています。

# トレンドラインを結ぶ日付の指定
dates = ['2023-04-07','2023-07-10']
# 中間点がある場合の処理
datepairs = [(d1,d2) for d1,d2 in zip(dates,dates[1:])]
# トレンドラインの描画
fplt.plot(df,type='ohlc',style='yahoo',figsize =(18,7),
          tlines=dict(tlines=datepairs,tline_use='low'),
          title = "STOCK PRICE CHART FOR {0}".format(ticker))

このような補助線の描画機能を利用することにより、強力な株価分析ツールとして使えそうです。

mplfinanceライブラリを用いた株価チャートの描画

前回の投稿まででYahoo! Financeからの株価データの獲得については述べましたが、株価分析のためにはやはり自在にチャートを描いて検討することが必要です。そこで、Pythonによるチャート(特にローソク足以外)の描き方について調べました。

これはすでに多くのオンライン記事が出ていますが、現時点ではmplfinanceというライブラリを使うのが最もよいようです。(注:必要なライブラリはあらかじめ「pip install ライブラリ名」などによりインストールしておく必要があります)。以下にコードを示します。

まず、ライブラリをインポートします。

import pandas as pd
from pandas_datareader import data as pdr
import mplfinance as fplt
import datetime
import yfinance as yf 

次に、米国のYahoo! Financeから株価データを取得します。

start = "2023-4-1"
end = datetime.date.today()
ticker = "9983.T" # 9983:ファーストリテイリング
yf.pdr_override()
# yahooサイトからデータをダウンロード
df = pdr.get_data_yahoo(ticker, start, end)
df.head()

最後に、チャートを描画します。

fplt.plot(df,type='renko',figsize =(16,5), title = "STOCK PRICE CHART FOR {0}".format(ticker))

尚、type=で指定できるチャートの種類は、'ohlc'(バーチャート:デフォルト), 'candle'(ローソク足), 'line'(折れ線), 'renko'(練行(足)チャート), 'pnf'(ポイントアンドフィギュア)です。また、style='yahoo'と指定すると米国流のチャートスタイル(緑が上昇で赤が下降)となります。

Yahoo Finaceからのデータの取得と分析(続き)

前回投稿した、Yahoo Financeからデータを抽出できる(現時点でまともに動く)ライブラリであるyahooqueryの詳細について調べた。

(補足1)前回言及したライブラリyfinanceは財務諸表の表示がエラーになりますが、過去の株価や取引数量データは取り出せます(ネット上にある多くの記事でyfinanceを用いている)。
(補足2)日本の株価データを参照する場合は、4ケタのコードの後ろに「.T」をつけた文字列をシンボルとして指定します。これはライブラリyfinanceでもyahooqueryでも同じです。

【yahooqueryの詳細】
本パッケージは3つの異なるクラスを提供する。
データの大部分を取得できる主クラスがTickerクラスである。例えば以下のように指定する。

# 米国アマゾン社を指定
ticker = Ticker('amzn')

〔オプション指定〕
asynchronous=True: Yahoo Financeに対するリクエストが非同時的になされる(2つ以上のシンボルを指定した場合に有効)
backoff_factor=0.3 (デフォルト): 2回目のトライの後の試行の秒係数
country='United States' (デフォルト): 言語,地域,corsDomainを変える(newsメソッドで独自の言語でデータが返される)
指定可能な国名: france, india, hong kong, germany, canada, spain, italy, united states, australia, united kingdom, brazil, new zealand, singapore, taiwan ※ japan はない。
formatted=True: APIからの大部分の数値データが辞書型として返される
max_workers=8 (デフォルト): 非同時リクエストをする際に用いられるworkerの数(asynchronous=Trueの時のみ有効)
proxies=None (デフォルト): 各リクエストをプロキシ経由にする
retry=5 (デフォルト): リクエスト失敗時にリトライする回数
status_forcelist=[429,500,502,503,504] (デフォルト): 強制リトライを可とするHTTPステータスコード
timeout=5 (デフォルト): 応答を待つのをやめる秒数
user_agent (ランダムセレクション) 各リクエストのヘッダとして送られるuser-agent文字列
validate=False (デフォルト): インスタンス化の間にシンボルの存在を検証する
verify=True (デフォルト): 詳細は省略
username, password: Yahoo Finance Premiumにログインする場合

Tickerクラスは異なるカテゴリーに分類される:モジュール,オプション,過去の株価,プレミアムデータ
〔モジュール〕
モジュールは通常、Yahoo Financeのフロントエンド(個別の銘柄を検索して表示させた結果画面)からの個別タブ内のタブあるいはデータに対応する。例えば、"Summary"タブからのデータを引き出すためには、Tickerクラスのsummary_detailプロパティを利用する。あるいは"Statistics"タブ内のデータを見つけるためには、プロパティvaluation_measuresとkey_statsを用いる。
〔(金融商品としての)オプション〕
全てのオプションの満期日は1行のコマンドで引き出すことができる:

faang = Ticker('fb aapl amzn nflx goog', asynchronous=True)
options = faang.option_chain

上の場合の変数optionはpandasデータフレームである。このデータフレームはsymbol, expiration, optionTypeという多重インデックスを持つ。

〔過去の株価データ〕
シンボル(のリスト)の銘柄のOHLC(四本値: 始値、高値、安値、終値)を取り出すには以下のように記述する:

faang = Ticker('fb aapl amzn nflx goog', asynchronous=True)
history = faang.history()

上記コードは日次のYTDデータを返す(YTDとは "year to date "の略で、今年の初めから今日までの期間を意味する)。
他の引数の指定が可能である。
(指定方法)
yahooquery.ticker.history(self, period='ytd', interval='1d', start=None, end=None)
過去の株価データ
与えられたシンボル(のリスト)について過去の株価データを取り出す
パラメータ
period: str, default ytd, optional
時間の長さ
オプション:['1d', '5d', '7d', '60d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max']
interval: str, default 1d, optional
データ点間の時間
オプション:['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo']
start: str or datetime.datetime, default None, optional
データ引用の開始時点を指定する。YYYY-MM-DD形式の文字列又はdatetimeオブジェクト
end: str of datetime.datetime, default None, optional
データ引用の終了時点を指定する。YYYY-MM-DD形式の文字列又はdatetimeオブジェクト
adj_timezone: bool, default True, optional
タイムスタンプにGMTオフセットを適用するかどうかの指定
adj_ohlc: bool, default False, optional
スプリットや配当情報にしたがってOHLCデータの修正値を計算するかどうかの指定
(返り値)
返り値は、過去の株価データについてのpandasデータフレームである。

Yahoo Finaceからのデータの取得と分析

(補足)日本の株価データを参照する場合は、4ケタのコードの後ろに「.T」をつけた文字列をシンボルとして指定します。これはライブラリyfinanceでもyahooqueryでも同じです。

投資のためのデータ分析をするにあたり、まず以下の書籍を参考にすることとした。

Satoshi著「Pythonで米国株をデータ分析:-40%ルール、PSR、株価成長率を見ていこう- (Amazon Kindle)

この書籍ではYahoo Financeからのデータの取得に"yahoo_fin"というライブラリを用いている。しかしこのライブラリは最近更新されておらず、本で参照されているコードはエラーで動かない。webサイトでこのライブラリの代替として紹介されているもののうち"yfinance"というライブラリを試してみたが、これも過去の株価データ参照はできるものの、財務諸表の取得などはエラーでできない。もう一つ紹介されているのが"yahooquery"というライブラリである。これは現状(2023年4月末)で全ての機能がエラーなく動く。以下はこの"yahooquery"の使い方に関するメモである。

リンク先のサイトにはドキュメント・デモなどへのリンクが掲載されている。まず、Pythonの然るべき環境にyahooqueryをインストールする。私の場合はWindowsPCに最新のAnacondaをインストールし、Anaconda promptで「$ pip install yahooquery」を実行した。

次にPythonコードを記述する。まず、ライブラリをインポートする:

# ライブラリのインポート
import numpy as np
import pandas as pd
from yahooquery import Ticker

次に、分析したい銘柄のティッカーコードを指定してTickerクラスを呼び出す:

# 米国アマゾン社を指定
ticker = Ticker('amzn')

Tickerクラスで利用可能なモジュールを調べる:

# View available modules on the Ticker class
cmodule = [i for i in Ticker.__dict__.keys() 
 if "_" not in i[:2] ]
print(cmodule)

結果は以下のようになる:
['all_modules', 'get_modules', 'asset_profile', 'calendar_events', 'earnings', 'earnings_trend', 'esg_scores', 'financial_data', 'news', 'index_trend', 'industry_trend', 'key_stats', 'major_holders', 'page_views', 'price', 'quote_type', 'quotes', 'recommendations', 'share_purchase_activity', 'summary_detail', 'summary_profile', 'technical_insights', 'all_financial_data', 'get_financial_data', 'corporate_events', 'corporate_guidance', 'valuation_measures', 'balance_sheet', 'cash_flow', 'company_officers', 'earning_history', 'fund_ownership', 'grading_history', 'income_statement', 'insider_holders', 'insider_transactions', 'institution_ownership', 'recommendation_trend', 'sec_filings', 'fund_bond_holdings', 'fund_category_holdings', 'fund_equity_holdings', 'fund_performance', 'fund_profile', 'fund_holding_info', 'fund_top_holdings', 'fund_bond_ratings', 'fund_sector_weightings', 'dividend_history', 'history', 'option_chain']

次に、四半期の損益計算書を出力してみる:

ticker.income_statement('q') # 四半期の損益計算書

以下の表が出力される(表の列は右側に続いている):

次に、株価の時系列データを出力してみる:

# 株価の時系列データ
ticker.history(start='2019-05-01')  # デフォルトの終了日は現在

以下のデータフレームが生成される:

列"close"を折れ線グラフにしてみる:

ticker.history(start='2019-05-01').close.plot()

以下の図が出力される: