フィリピン株の個別銘柄の過去10年分の株価を得たいと考えたり、あるいは最新の株価を常にチェックしてゴールデンクロスを検出させたりしたい・・・そんなことを思ったことはありませんか?
残念ながらフィリピン株式市場 (PSE)はAPIを無料で公開しておらず、また株価データは基本的に有料での配布となっています。ちなみに最新の株価はアップされていますがスクレイピングは禁止されています。スクレイピングが禁止されているかいないかは規約などを読む必要があるのですが、PSEの規約にはスクレイピングの禁止の有無の記載がありません。だからと言って許可されているわけではない点に注意が必要です。規約などを読んでも分からない場合はrobots.txtを参照する必要があります。
https://www.pse.com.ph/robots.txtへアクセスすると以下のように記載されていることが分かります。
User-agent: Googlebot
Disallow: /
User-agent: googlebot-image
Disallow: /
User-agent: googlebot-mobile
Disallow: /
User-agent: MSNBot
Disallow: /
User-agent: Slurp
Disallow: /
User-agent: Teoma
Disallow: /
User-agent: Gigabot
Disallow: /
User-agent: Robozilla
Disallow: /
User-agent: Nutch
Disallow: /
User-agent: ia_archiver
Disallow: /
User-agent: baiduspider
Disallow: /
User-agent: naverbot
Disallow: /
User-agent: yeti
Disallow: /
User-agent: yahoo-mmcrawler
Disallow: /
User-agent: psbot
Disallow: /
User-agent: yahoo-blogs/v3.9
Disallow: /
User-agent: *
Disallow: /
Disallow: /cgi-bin/
Disallow: /?s=
Disallow: /search/
Sitemap: https://www.pse.com.ph/sitemap.xml
ほぼほぼ全てのクローラーなどが拒絶されているのが分かりますが、それに加えて”User-agent: *”と記載してあります。これはあらゆるタイプのクローラーなどを許可していないことを意味しています。ルートディレクトリが”Disallow”に指定されているので、ルートディレクトリより階層が下のもの全てクロールが禁止されていることを意味します。つまりPSEはスクレイピングを禁止しているというわけです。Google Sheetなどで株価を参照してグラフを作ることもクローラーと同じ扱いですから基本的に許可されていません。したがってPSEから無料で株価を取得することは法的処置を取られる可能性がありますから止めましょう。
Pythonには非常に便利なライブラリがあります。investing.comは世界中のあらゆる市場の株価データを扱っており、フィリピン株も例外ではありません。そんな便利なサイトから株価などのデータを引っ張ってこれるライブラリがinvestpyです。こんな便利なライブラリを使わない手はありません。
書く必要がないかもしれませんが一応。
pip install investpy
試しにJollibeeの最新の株価を取得してみたいと思います。
import investpy
import pandas as pd
ticker = 'jfc' #Jollibee Food Corporation
country = 'philippines'
stock_df = investpy.stocks.get_stock_recent_data(stock=ticker, country=country)
print(stock_df)
これをコピペして実行すると次のように表示されます。
Open High Low Close Volume Currency
Date
2021-06-29 215.0 215.0 212.0 213.6 503420 PHP
2021-06-30 213.4 213.6 208.8 213.6 943470 PHP
2021-07-01 213.6 217.4 213.0 214.0 624860 PHP
2021-07-02 214.6 215.4 211.6 213.0 447130 PHP
2021-07-05 213.0 217.0 212.8 216.8 557230 PHP
2021-07-06 217.0 217.6 214.0 214.0 368340 PHP
2021-07-07 214.0 214.0 209.6 212.4 676080 PHP
2021-07-08 212.0 212.4 210.2 210.2 187480 PHP
2021-07-09 210.0 210.0 202.0 203.0 1334730 PHP
2021-07-12 203.4 210.0 203.4 209.8 271390 PHP
2021-07-13 209.8 209.8 205.6 208.8 294190 PHP
2021-07-14 208.8 209.6 206.4 209.6 456450 PHP
2021-07-15 209.6 209.8 208.8 209.6 353250 PHP
2021-07-16 209.4 212.4 208.8 210.0 1594250 PHP
2021-07-19 209.4 211.0 202.6 210.6 1055320 PHP
2021-07-21 210.0 210.0 201.2 204.0 1218030 PHP
2021-07-22 204.0 207.0 202.2 205.0 411620 PHP
2021-07-23 205.0 205.0 197.6 198.0 857870 PHP
2021-07-26 198.0 198.2 192.0 193.6 563030 PHP
2021-07-27 193.8 199.5 193.1 195.7 422550 PHP
2021-07-28 194.5 194.5 188.5 190.5 837550 PHP
investpy.stocks.get_stock_recent_data で始値、高値、安値、終値、出来高、通貨のデータを取得することができます。
ちなみにpandas.DataFrameとして返されますので、jsonがいいな~という場合はパラメーターに”as_json=True”を加えてやるとjsonとして返されます。また最新データを一番上に持ってきたい、つまり並び替えて返して欲しいときにはパラメーターに”oder=’descending'”を加えてやると最新データが一番上になります。
Jollibeeの2020年1月1日から2020年2月1日までのデータを取得してみましょう。上のコードの”stock_df”以下を次のように書き換えるだけです。
stock_df = investpy.get_stock_historical_data(stock=ticker, country=country, from_date='01/01/2020', to_date='01/02/2020')
print(stock_df.tail())
これを実行すると以下のように表示されます。
Open High Low Close Volume Currency
Date
2020-01-27 216.0 216.0 211.0 213.2 219790 PHP
2020-01-28 213.2 213.2 204.4 205.0 795770 PHP
2020-01-29 205.4 207.0 201.0 203.6 318090 PHP
2020-01-30 202.2 203.0 200.0 200.2 580180 PHP
2020-01-31 200.2 201.0 191.2 191.2 876750 PHP
※”stock_df.tail()”で指定した期間の最新5日分のみを表示しています。
もちろん配当金や配当利回りも取得できちゃいます。ただフィリピン株に関してはinvesting.comのデータが遅いので、あまり役に立ちません。
stock_df = investpy.stocks.get_stock_dividends(stock=ticker, country=country)
print(stock_df.tail())
これを実行すると次のようなデータを得ることができます。
Date Dividend Type Payment Date Yield
0 2018-04-19 3.32 trailing_twelve_months 2018-05-09 1.16%
1 2017-11-22 2.18 trailing_twelve_months 2017-12-11 0.78%
2 2017-04-18 2.00 trailing_twelve_months 2017-05-05 0.80%
3 2015-05-04 1.69 trailing_twelve_months 2015-05-29 0.68%
見ていただいたら分かるように2018年が最新のデータとなっています。既にJollibeeから2021年の配当をもらっていますから、データとしては使えませんね。
株価だけじゃなくて通年の業績のデータも取得することができます。 上のコードの”stock_df”以下を次のように書き換えてください。
annual_df = investpy.get_stock_financial_summary(stock=ticker, country=country, summary_type='income_statement', period='annual')
print(annual_df)
これを実行すると次のように表示されます。
Total Revenue Gross Profit Operating Income Net Income
Date
2020-12-31 129313.00 13586.67 -12811.46 -11510.73
2019-12-31 179626.19 29368.31 10734.31 7302.73
2018-12-31 161167.78 28747.20 9258.97 8212.61
2017-12-31 131576.55 23918.41 6669.65 7109.12
こうやって見るとジョリビーの2020年の業績はかなりダメージが大きかったことが分かりますね。
上のコードのパラメータの”‘income_statement'”を”‘balance_sheet'”に変更するとバランスシートが取得できます。
Total Assets Total Liabilities Total Equity
Date
2020-12-31 210810.13 141682.87 69127.26
2019-12-31 187442.76 133972.42 53470.34
2018-12-31 150512.88 103017.77 47495.11
2017-12-31 89783.90 49001.26 40782.64
たぶん株に投資する人はテクニカル分析とか気になっちゃって仕方ないと思うんですけど、いちいちinvesting.comで確認するのって面倒だと思うんですよね。じゃあ面倒なことはPythonにやらせてしまえばいいわけです。
Jollibeeのテクニカル分析のうち、移動平均による指標を取得してみましょう。上のコードの”stock_df”以下を次のように書き換えるだけです。注意が必要なのは今までパラメーターに”stock”を使用していましたが、テクニカル分析を取得する場合は”name”になります。
moving_averages_df = investpy.moving_averages(name=ticker, country=country, product_type='stock', interval='daily')
print(moving_averages_df)
これを実行すると次のような結果が表示されます。
period sma_value sma_signal ema_value ema_signal
0 5 196.56 sell 196.28 sell
1 10 202.66 sell 200.54 sell
2 20 207.11 sell 203.63 sell
3 50 201.54 sell 200.64 sell
4 100 189.91 buy 194.48 sell
5 200 186.41 buy 185.92 buy
5日から100日までの移動線によるテクニカル分析的にはJollibeeは売り、200日移動平均的には買いだということです。
これはフィリピン株というニッチな市場が故の問題かもしれませんが、既に上場廃止になった銘柄やIPOで上場した銘柄などが反映されていません。そもそものinvesting.comに反映されていないというパターンもあり、この辺りは自分で調べてデータを修正する必要があります。特に優先株あたりはエラーが多いので修正が必要です。Githubで最新のリストなどに更新してくれている有志の方々がいらっしゃいますが、現実問題として追いついていないので自分で直した法が早いと思います。
フィリピン株というニッチな情報を集めるのは英語が基本になり日本語での情報は限定的だったりします。個人的には日本やアメリカ株がとってもオープンで無料で情報が日本語で集められるのにフィリピン株の情報が日本語で得難いのは聊か納得がいかないので、どうにか便利にならないかなと考えています。市場を閉じて仲間内でワイワイやるより、みんなでwin-winになりゃいいじゃん、オープンになればもっと人が集まって市場も活気づいて楽しくなるのに、と考えている派です。
ABキャピタル証券など証券会社から提供される情報を除けば無料で得られる情報としてinvesting.comが今のところは便利ですし、さらにテクニカル分析も勝手にやってくれて、しかもそれをinvestpyで簡単に入手できる、こんな便利なことはありません。ただ配当利回りなど情報が遅い点もあったり、フィリピン株というニッチな市場が故か、上場した銘柄が反映されていないなど問題も山積しています。
まだまだ紹介しきれていない機能はたくさんあるので、詳しい使い方はinvestpyを参照してください。またinvestpyはETFや仮想通貨など幅広い金融商品に対応しているので、フィリピン株に限らず活用できると思います。