min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

Python3 Yahoo Finance APIを試す

株には全く興味が無い。あんなものにハマるのはアホだ。

 

しかし、彼らカネの亡者の「カネが欲しい」という貪欲7つの大罪で言えばGreedか、その酷さというか、愚かさゆえの強欲がもたらすエネルギー、それは信じている

 

つまり、例えば株価を取得するプログラムは、彼らのその強欲ゆえにバグの無い正確なものとなる。だって、エラーのある株価で取引したら大損するんだから。皮肉だが、強欲がもたらす正確性というか、エンジンのような力は、確かにある。

 

  

 

そこで、株取引は一切しないけど、株取引をしている彼ら(の強欲)が作り出したものを利用して、こちらの知恵や知見とさせてもらう。

 

具体的にはこれ。株価を取得するAPI

www.youtube.com

Pythonで気楽に試せるらしい。コードに落として実行してみる。

 

使うAPIはpip3でインストールできた(2020/12/30時点)。

$ pip3 install yahoo-finance-api2 --user

f:id:min117:20201230103747p:plain

 

でけた。

f:id:min117:20201230105936p:plain

9行目 apiが提供するメソッド(Share)を使ってデータをsymbol_dataへ格納。

 share.PERIOD_TIME_DAY,10 だと10日毎のデータ。

 share.PERIOD_TIME_YEAR,10 にすれば10年単位のデータ。

 share.FREQUENCY_TYPE_MINUTE,5 だと5分ごとにデータを取得する。

30行目 配列の先頭(一番古い株価の取得日)

31行目 配列の最後(最新の株価の取得日)

 

実行してみる。

$ python3 kabu01_yahoo.py

 

f:id:min117:20201230120309p:plain

カンタンだけどしっかり動く。

 

もう一つ作ってみる。

 

日経225(って何だ)にある企業の株価を取得する。inputデータはこれ(企業コード)。

f:id:min117:20201230113845p:plain

 

$ vim kabu02_nikkei225.py 

f:id:min117:20201230113748p:plain

実行。

f:id:min117:20201230113926p:plain

 

日経225の

企業コード4151,そのデータ件数121,10年前の株価838円今日の株価2,828円3.37倍

企業コード4502,そのデータ件数121,10年前の株価3,950円今日の株価3,740円0.95倍

f:id:min117:20201230113649p:plain

ふむ。簡単。配列からデータ取り出しの雛形にはなりそう。

 

コピペ用

import sys

from yahoo_finance_api2 import share

from yahoo_finance_api2.exceptions import YahooFinanceError

 

my_share = share.Share('MSFT')

symbol_data = None

 

try:

    symbol_data = my_share.get_historical(share.PERIOD_TYPE_DAY,

                                            10,

                                            share.FREQUENCY_TYPE_MINUTE,

                                            5)

 

except YahooFinancceError as e:

    print(e.message)

    sys.exit()

 

print(symbol_data)

len(symbol_data.keys())

 

#dict_keys(['timestamp', 'open', 'high', 'low', 'close', 'vllume'])

 

my_date = symbol_data["timestamp"]

print('----------------------------------')

print('timestamp')

#print('symbol_data["timestamp"] の length')

print(len(my_date))

print('----------------------------------')

print(my_date)

 

old_date = my_date[0]

now_date = my_date[807]

 

from datetime import datetime

old_date = datetime.utcfromtimestamp(int(old_date/1000))

now_date = datetime.utcfromtimestamp(int(now_date/1000))

 

print(old_date)

print(now_date)

 

 

my_price_close = symbol_data["close"]

old_price = my_price_close[0]

now_price = my_price_close[807]

print('----------------------------------')

print('終値close')

#print('symbol_data["close"] の length')

print(len(my_price_close))

print('----------------------------------')

print(str(old_date) + "の時の株価:" + str(old_price))

print(str(now_date) + "の時の株価:" + str(now_price))

 

コピペ用2

import csv

import time

from datetime import datetime

import sys

from yahoo_finance_api2 import share

from yahoo_finance_api2.exceptions import YahooFinanceError

 

# https://www.youtube.com/watch?v=yYckWsRtoXw&feature=emb_title

 

count = 1

csvfile = "kabu_date02_input_nikkei225.csv"

 

 

def get_data():

    global old_date, now_date, old_time, now_time, old_price, now_price, change_rate, data_volume

 

    my_share = share.Share(row_str + '.T')

    symbol_data = None

 

    try:

        symbol_data = my_share.get_historical(share.PERIOD_TYPE_YEAR, 10, share.FREQUENCY_TYPE_MONTH, 1)

        time.sleep(5)

        date = symbol_data["timestamp"]

 

        old_date = date[0]

        now_date = date[-1]

 

        old_time = datetime.utcfromtimestamp(int(old_date/1000))

        now_time = datetime.utcfromtimestamp(int(now_date/1000))

 

        price = symbol_data["close"]

        old_price = price[0]

        now_price = price[-1]

 

        change_rate = '{:.2f}'.format(now_price/old_price)

        data_volume = len(date)

 

    except YahooFinanceError as e:

        print(e.message)

        sys.exit(1)

 

 

def write_csv():

    global old_date, now_date, old_time, now_time, old_price, now_price, change_rate, data_volume

    with open("kabu_date03_output.csv", "a") as csvFile:

        writer = csv.writer(csvFile)

        writer.writerow([row_str, data_volume, old_time, old_price, now_time, now_price, change_rate])

 

 

 

 

with open(csvfile, "r") as f:

    rows = csv.reader(f)

    for row in rows:

        print("ループ:" + str(count) + "回目")

        row_str = str("".join(row))

 

        get_data()

        write_csv()

 

        count = count +1