こんにちは。TATです。
今日のテーマは「Pythonで株価データを日足から週足・月足に変換する」です。
過去にPythonで株価データを扱う記事をいろいろとご紹介してきました。
Pythonで株価データを扱う方法まとめ【データの取得・分析・可視化等、なんでもできます】
続きを見る
今回は取得した日足データを週足や月足に変換します。
Pythonを使えばこういったデータの処理も簡単に実装することができます。
この方法を利用すれば、日足のデータだけを収集すれば週足や月足に自由に変換して扱うことができます。
目次
【コード解説】Pythonで株価データを日足から週足・月足に変換する!
(おさらい)株価データの取得
まずは解説に使用するための株価データを取得します。
過去記事でも解説済みなのでサクッといきます。
【日本株対応】Pythonで株価のローソク足データを取得する方法まとめ【CSV、ライブラリ、スクレイピング】
続きを見る
【Pythonコード解説】yahoo_finance_api2で日本株の株価データを取得する
続きを見る
今回はyahoo_finance_api2を使ってトヨタ自動車(証券コード:7203)の株価データを取得しました。
過去2年分のデータを取得しています。
import sys from yahoo_finance_api2 import share from yahoo_finance_api2.exceptions import YahooFinanceError import pandas as pd my_share = share.Share('7203.T') symbol_data = None try: symbol_data = my_share.get_historical( share.PERIOD_TYPE_YEAR, 2, share.FREQUENCY_TYPE_DAY, 1) except YahooFinanceError as e: print(e.message) sys.exit(1) df = pd.DataFrame(symbol_data) df["datetime"] = pd.to_datetime(df.timestamp, unit="ms")
取得したデータがこちらです。
週足・月足に変換する
データの取得ができたところで、週足・月足に変換していきます。
pandasのresampleを活用する
週足・月足への変換にはpandasのresampleを使うと大変便利です。
resampleを使うと簡単に週足や月足への変換が完了します。
名前の通り、データのリサンプリングを行ってくれます。
DataframeのIndexを日付データにしておけば、週足や月足の変換も簡単に行うことができます。
週足に変換してみる
早速変換していきます。
resampleの使い方は、期間を選択して、さらにカラムごとの計算手法を指定します。
週足に変換する場合は、始値は週初めの始値、高値は1週間の高値、安値は1週間の安値、終値は週最後の終値、出来高は合計値になります。
import pandas as pd # カラムごとの計算手法を指定 agg_dict = { "open": "first", "high": "max", "low": "min", "close": "last", "volume": "sum" } # 週足に変換する df_week = df.set_index("datetime").resample("W").agg(agg_dict)
WはWeek(週)を意味します。
resampleを使うには、indexが日付データになっている必要があるので、set_indexでdatetimeカラムをindexに指定しています。
完成したデータがこちらです
週ごとに変換されていることが確認できますね。
loffsetを指定して日付を調整する
先ほどのデータをみると、各日付は該当する週の日曜日になっています。
週足データの日付の表示はサイトによって異なります。
例えば、yahooファイナンスだと、週の月曜日(祝日なら翌日)で表示されます。
株探だと金曜日(祝日なら前日)で表示されます。
どちらにするかは好みの問題です。
僕的には株探をよく使っているので、金曜日表示に慣れています。
ゆえにここでは日付の表示が金曜日になるように調整していこうと思います。
これを行うにはresampleで、loffsetを指定します。
ここでは日曜日を金曜日にずらすために日付を2日間マイナスします。
import pandas as pd # カラムごとの計算手法を指定 agg_dict = { "open": "first", "high": "max", "low": "min", "close": "last", "volume": "sum" } # 週足に変換する df.set_index("datetime").resample("W", loffset=pd.offsets.timedelta(days=-2)).agg(agg_dict)
pandasのoffsetsを使うと任意の日付を指定することができます。
結果がこちらです。
日曜から2日引いているので金曜日になっています。
月曜日で表示したい場合は6日引けばOKです。
月足に変換する
次に日足データを月足に変換してみます。
この場合はresampleの引数をWからMに変更すればOKです。
MはMonth(月)の頭文字です。
import pandas as pd # カラムごとの計算手法を指定 agg_dict = { "open": "first", "high": "max", "low": "min", "close": "last", "volume": "sum" } # 週足に変換する df_month = df.set_index("datetime").resample("M").agg(agg_dict)
計算結果をdf_monthに格納しました。
値を確認します。
きちんと月ごとに集計できていることが確認できます。
これで日足データを週足・月足データに変換することができました。
注意点:最初のデータはずれる場合があります
最後に注意点です。
日足データを週足・月足データに変換する際には、用意するデータによっては一部データの値がずれます。
特に最初のデータがずれる場合が多いです。
本記事で使用したデータは2019年7月29日〜のデータになってるので、これを月足にすると2019年7月分のデータは3日分しかありません。
また、記事を書いている2021年7月時点のデータも7月がまだ終わっていないので、2020年7月のデータは途中までのデータになります。
週足に変換する場合には、収集する日足データを月曜開始になるように調整する必要があります。
月足データに収集する場合には月初めからのデータを用意する必要があります。
ここだけは要注意なのでご紹介しておきました!
収集するデータが1種類あれば十分!
本記事でご紹介した変換方法と使えば、日足データさえあれば週足データと月足データは簡単に変換できることがわかりました。
よって、データ収集の際には、基本的には1種類のデータだけあればOKです。
具体的には必要なデータのうち最も細かいデータが1つだけあれば、それより粗いデータは自由に変換することができます。
5分足のデータがあれば、そこから30分足や1時間足などのデータも作れます。
逆に日足データから1時間足などのデータに変換することはできないので、必要なデータのうち、最も粒度の細かいデータを1つだけ収集しておけばOKということになります。
これだけで収集するデータはかなり減ります。
僕の場合は、日足データのみを収集して、週足・月足に変換するようにしています。(月足はほぼ使いませんがw)
データの分析・可視化にはPythonが最適!
本記事で紹介したコードは、全てPythonを使って書いています。
Pythonはデータの分析や可視化を得意とするプログラミング言語で、さらにAI関連のライブラリーも豊富で昨今のAIブームで需要が急拡大しています。
→ 【いますぐ始められます】データ分析をするならPythonが最適です。
また、Pythonは比較的学びやすい言語でもあります。
実際、僕は社会人になってからPythonを独学で習得して転職にも成功し、Python独学をきっかけに人生が大きく変わりました。
→ 【実体験】ゼロからのPython独学を決意してから転職を掴み取るまでのお話。
Pythonの学習方法についてはいろいろな方法があります。
僕はUdemyを選びましたが、書籍やプログラミングスクールも選択肢になります。
→ 【決定版】Python独学ロードマップ【完全初心者からでもOKです】
→ 【まとめ】Pythonが学べるおすすめプログラミングスクール
→ プログラミングの独学にUdemyをおすすめする理由!【僕はUdemyでPythonを独学しました!】
まとめ
いかがでしたでしょうか。
ここでは「Pythonで株価データを日足から週足・月足に変換する」というテーマで、resampleを使って株価データを変換する方法を解説しました。
Pythonと使うと、複雑な処理でも短いコードで実装できるのでとても便利です。
本記事のほかにも、Pythonで株価データを扱う記事はいろいろまとめているので合わせてご覧ください。
Pythonで株価データを扱う方法まとめ【データの取得・分析・可視化等、なんでもできます】
続きを見る
ここまで読んでくださってありがとうございました。