10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

株価をダウンロードしてプロット

Posted at

はじめに

株取引を行うために統計を取りたい、と思い、株価のデータの取得方法を調べました。
株価をダウンロードしてプロットするところまでpython で動かせたので、メモします。東京証券取引所で取引されている3銘柄のデータをダウンロードして、こんな感じでプロットできました。

Figure_1.png

何か大儲け、できないかな。。。。なんて。^^)

Yahoo Finance からデータを取得するライブラリ

方法はGoogle先生に紹介していただいたページを拝見していろいろ調査したのですが、なかなか思うように「ここ1~2年のデータをスクリプトでダウンロードして比べる」という用途に使えなく苦労しました。Quandl, pandas_datareader などをさまよった挙句,

yahoo-finance-api2

に行きつきました。ソースをみると https://query1.finance.yahoo.com/v8/finance/chart/... の応答をparse している感じです。また、リンクのgithub の READMEに書かれているUsage そのままで動きました。

準備

PIPでインストールできました。

python3 -m pip install yahoo_finance_api2

実装

README にあるUsage を少し変更しただけですが、以下の感じでプロットしました。
メモとしては、

  • timestamp はミリ秒、UTCなので、日本標準時間に変更してあげる
  • 各エポックについて、Open, High, Low, Close, Volume に数値があり、データが無いところは null となっている。例えば取引が無かった場合、とかでしょうか。
  • 取得できる範囲が限られている感じがしました。例えば、以下のプログラムでは、1000週間のデータを要求していますが、1年ちょっとしかデータは得られていません。
import matplotlib.pyplot as plt
from yahoo_finance_api2 import share
from yahoo_finance_api2.exceptions import YahooFinanceError
import pandas as pd

data_list = [ \
    ["4391.T", "LOGIZARD"], 
    ["4755.T", "RAKUTEN"],
    ["2303.T", "DAWN"]]

fig, ax = plt.subplots(len(data_list), 1, figsize=(16, 8))
for i, (company_code, company_name) in enumerate(data_list):
    my_share = share.Share(company_code)

    try:
        symbol_data = my_share.get_historical(share.PERIOD_TYPE_WEEK, 1000,
                                        share.FREQUENCY_TYPE_DAY, 1)
        df = pd.DataFrame(symbol_data.values(), index=symbol_data.keys()).T
        df.timestamp = pd.to_datetime(df.timestamp, unit='ms')
        df.index = pd.DatetimeIndex(df.timestamp, name='timestamp').tz_localize('UTC').tz_convert('Asia/Tokyo')

        ax[i].set_title( "TSE {} ({})".format(company_name, company_code))
        ax[i].plot(df.index, df.close, '.')
        ax[i].grid(True)
        ax[i].set_ylabel("Stock Price [Yen]")
        ax[i].label_outer()
        if i == (len(data_list) - 1):
            ax[i].set_xlabel("Date")
    except YahooFinanceError as e:
        print(e.message)
        pass
plt.show()

とりあえず動いたから良いとする。

 - 本件と関係ないですが、ググっていたらTradingView という、使えればすごそうなサイトに出会いました。 
 - 当初は、Quandl を使おうと頑張りました。pip3 install Quandl で簡単にインストールでき、ここ にあるとおりに動きます。ただ、最近のデータが取得できませんでした。一方、 https://www.quandl.com/api/v3/datasets/TSE/4391/data.csv のように、直接悪背うすることもできました。変数を指定して、所望のデータが得られたのかもしれません。
 

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?