[Python]investpyでフィリピン株の株価やテクニカル分析、業績などデータを取得する

フィリピン株の個別銘柄の過去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から無料で株価を取得することは法的処置を取られる可能性がありますから止めましょう。

investpyを使ってフィリピン株のデータを取得する

Pythonには非常に便利なライブラリがあります。investing.comは世界中のあらゆる市場の株価データを扱っており、フィリピン株も例外ではありません。そんな便利なサイトから株価などのデータを引っ張ってこれるライブラリがinvestpyです。こんな便利なライブラリを使わない手はありません。

環境

  • Python (3.9.5)
  • investpy (1.0.7)
  • pandas (1.2.4)

インストール

書く必要がないかもしれませんが一応。

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日移動平均的には買いだということです。

Investpyにも問題がある

これはフィリピン株というニッチな市場が故の問題かもしれませんが、既に上場廃止になった銘柄やIPOで上場した銘柄などが反映されていません。そもそものinvesting.comに反映されていないというパターンもあり、この辺りは自分で調べてデータを修正する必要があります。特に優先株あたりはエラーが多いので修正が必要です。Githubで最新のリストなどに更新してくれている有志の方々がいらっしゃいますが、現実問題として追いついていないので自分で直した法が早いと思います。

まとめ

フィリピン株というニッチな情報を集めるのは英語が基本になり日本語での情報は限定的だったりします。個人的には日本やアメリカ株がとってもオープンで無料で情報が日本語で集められるのにフィリピン株の情報が日本語で得難いのは聊か納得がいかないので、どうにか便利にならないかなと考えています。市場を閉じて仲間内でワイワイやるより、みんなでwin-winになりゃいいじゃん、オープンになればもっと人が集まって市場も活気づいて楽しくなるのに、と考えている派です。

ABキャピタル証券など証券会社から提供される情報を除けば無料で得られる情報としてinvesting.comが今のところは便利ですし、さらにテクニカル分析も勝手にやってくれて、しかもそれをinvestpyで簡単に入手できる、こんな便利なことはありません。ただ配当利回りなど情報が遅い点もあったり、フィリピン株というニッチな市場が故か、上場した銘柄が反映されていないなど問題も山積しています。

まだまだ紹介しきれていない機能はたくさんあるので、詳しい使い方はinvestpyを参照してください。またinvestpyはETFや仮想通貨など幅広い金融商品に対応しているので、フィリピン株に限らず活用できると思います。

フィリピン株の購入資金を貯めるならMoppy (モッピー) がおススメ

ホテルの予約やYahooショッピングなどで買い物をする前にMoppyを介せばポイントが貯まります。貯まったポイントは現金化できるのでフィリピン株の買い増しにも使えます!

累計会員数900万人突破!内職/副業/お小遣い稼ぎするならモッピー!

この記事を書いた人
株式投資とか不動産投資とか、あと旅行とか大好物です。これまで58カ国と10ヶ所くらいの微妙な地域を訪れました。英語の勉強もしていますが、なかなか上達しないのに色々な言語に目移りしがち。なぜかフィリピン株中心のブログになってますが、基本的には僕のしがない日記です。
SNSでフォローする

コメントを残す

メールアドレスが公開されることはありません。