investpyチートシート（最終更新：2021/02/04）

#はじめに
国内のinvestpyの解説が2件しかないし、パッケージのdocumentも充実してないので作成しました。
まだ触り始めなので、情報量は少ないです（追記予定あり）。

Pythonを使って日本株を分析するのに便利なのではないでしょうか。
慣れたらPandas_Datareaderみたいな感じで使えるので、使いやすいのか…？

現在の環境はPython 3.8.5、investpy 1.0です。
（Python 3.9はnumpyが投稿日現在使用できないので不可）

#investpyとは
[PyPiページ](https://pypi.org/project/investpy/)
2019年2月より更新されている、投資関係のデータを収集できるパッケージです。
データの取得元は[investing.com](https://www.investing.com/)で、日本の商品のデータも取得できます。
取得したデータは基本的にPandas.DataFrame型です。

Pandas_Datareaderとの違いは何といっても日本商品のデータも取得できることです。
Pandas_Datareader紹介記事でYahooから日本株も取得できる、みたいなことも書いてありますが、私は取得できませんでした。
また、APIも必要ないです。
→調べてみたらPandas_Datareaderでも取得できるかも。
週末に速度含め測定予定。

2021/2/4追記（@Akahachiさんありがとうございます）
やはりPandas_Datareaderでも日本株を取得できるとのこと。
ただし、yahooからはTOPIXなど一部指標が取得できないことから、investpyを利用するのがいいかもしれません。
（teratailかどこかでyahooは頻繁に通信すると遮断されるぞ、みたいなことが書いてあった気がしたけど、気のせいだった…？）

ざっと見取得できる使えそうなデータは以下の通り。

- 株の4本値（日次）
- ETFの4本値（日次）
- 各種指数の4本値（日次）
- ファンドのデータ（いまのところ取得したことがないから詳細不明）

また、為替や投信のデータも取得できそうです。

#インストール
```
pip install investpy
```
condaではインストール不可なのであしからず。
必要なパッケージは以下の通りです（PyPiより）。

- pandas 0.25.1
- requests 2.22.0
- lxml 4.4.1
- unidecode 1.1.1

#日本株の一覧取得
**注：ETFのデータ取得はこの方法ではできないので注意**
`investpy.get_stocks(country='japan')`で取得可能です。
返り値はpandas.DataFrame型です。
引数をなしにするとすべての国のデータがとれる？（未確認）
また、`investpy.get_stocks_list`で`list`型を、`investpy.get_stocks_dict`でdict型を返します。

#日本株の4本値取得
**注：ETFのデータ取得はこの方法ではできないので注意**
基本的に`investpy.get_stock_historical_data`で取得します。

```python:get_stock_historical_data
import investpy
import datetime

#銘柄を証券コードで指定（ここでは適当に入力）
#string型でないといけない？（未確認）
code = '1301'

#開始日from_dateと終了日to_dateを指定
#string型でdd/mm/yyyyの書式でない場合はエラーが返るので注意
#datetime.dateから変換してやるといい
from_date = datetime.strftime(yesterday, '%d/%m/%Y')
to_date = datetime.date.today().strftime('%d/%m/%Y')

#countryで国を指定
#引数に as_json=True を入れるとjson形式で返るのかもしれない（未確認）
#typeはpandas.DataFrame型
df = investpy.get_stock_historical_data(stock=code, country='japan', 
                                               from_date=from_date, to_date=to_date)
```

30年分のデータを試しにとってみましたが、大体3秒/銘柄くらいの速度でした。
`investpy.get_stock_recent_data`で期間を指定せずにとれるらしいですが、使ったことはないです。

#日本ETFの一覧取得
基本は日本株と一緒です。
`investpy.get_etfs`、`investpy.get_etfs_list`、`investpy.get_etfs_dict`が使用可能です。

#日本ETFの4本値取得
`investpy.get_etf_historical_data`を使います。
株価とほぼ同じですが、銘柄は**証券コードではなく銘柄名で指定する**ことに注意。

```python:get_etf_historical_data
import investpy
import datetime

#銘柄名を自動で入手するため、ETFの商品リストを取得しておく
etfs_df = investpy.get_etfs(country='japan')

#銘柄を証券コードで指定（ここでは適当に入力）
code = '1305'

#codeに該当するデータのインデックスを探して、銘柄名を取得
#銘柄コードの列名はsymbol、銘柄名の列名はname
idx = etfs_df.query('symbol == @code').index
etf_name = etfs_df.at[idx[0], 'name']

#開始日from_dateと終了日to_dateを指定
#string型でdd/mm/yyyyの書式でない場合はエラーが返るので注意
#datetime.dateから変換してやるといい
from_date = datetime.strftime(yesterday, '%d/%m/%Y')
to_date = datetime.date.today().strftime('%d/%m/%Y')

#countryで国を指定
#引数に as_json=True を入れるとjson形式で返るのかもしれない（未確認）
#typeはpandas.DataFrame型
df = investpy.get_etf_historical_data(etf=etf_name, country='japan', 
                                      from_date=from_date, to_date=to_date)
```

なお、こちらにも`investpy.get_etf_recent_data`がありますが、使用したことがないため詳細不明です。

#株価指標の4本値取得
`investpy.get_index_historical_data`を使用します。
基本はETFと同じ方法で取得します。

```python:get_index_historical_data
import investpy
import datetime

#指標名を自動で入手するため、指標のリストを取得しておく
index_df = investpy.get_indices(country='japan')

#指標のシンボルを入力（ここでは日経225）
#シンボルはindex_dfから欲しいものを探すのがいいかと思います
symbol = 'N225'

#codeに該当するデータのインデックスを探して、指標名を取得
#シンボルの列名はsymbol、指標名の列名はname
idx = index_df.query('symbol == @symbol').index
index_name = index_df.at[idx[0], 'name']

#開始日from_dateと終了日to_dateを指定
#string型でdd/mm/yyyyの書式でない場合はエラーが返るので注意
#datetime.dateから変換してやるといい
from_date = datetime.strftime(yesterday, '%d/%m/%Y')
to_date = datetime.date.today().strftime('%d/%m/%Y')

#countryで国を指定
#引数に as_json=True を入れるとjson形式で返るのかもしれない（未確認）
#typeはpandas.DataFrame型
df = investpy.get_index_historical_data(index=index_name, country='japan', 
                                      from_date=from_date, to_date=to_date)
```

#Q&A
####株のほかの情報は持ってこれないの？
ソースコードから確認できたのは以下の通りですが、試してないので詳細不明です（今後追記予定）。
`investpy.get_stock_company_profile`：企業情報？（現在`country=spanish`のみ対応）
`investpy.get_stock_dividends`：配当データ
`investpy.get_stock_information`：ファンダメンタルズ（自分で分析した方が早いと思います）
`investpy.get_stock_financial_summary`：財務データ


####RuntimeError: ERR#0018: stock **** not found, check if it is correct.と表示される！
investing.comにはデータがあるのにinvestpyで取得できないデータがあるみたいです（詳細不明）。
`investpy.search_stocks`でデータが取得できるか確認できそうです。

#追記履歴
2021/2/4
@Akahachiさんから頂いた情報ほかをもとに追記。
株価指標を取得する方法を追記。