import os
import time
import pandas as pd
import pandas_datareader.data as web
from pandas_datareader._utils import RemoteDataError
def get_finance_data(
ticker_symbol: str, start="2021-01-01", end="2021-06-30", savedir="data"
) -> pd.DataFrame:
"""株価を記録したデータを取得します
Args:
ticker_symbol (str): Description of param1
start (str): 期間はじめの日付, optional.
end (str): 期間終わりの日付, optional.
Returns:
res: 株価データ
"""
res = None
filepath = os.path.join(savedir, f"{ticker_symbol}_{start}_{end}_historical.csv")
os.makedirs(savedir, exist_ok=True)
if not os.path.exists(filepath):
try:
time.sleep(5.0)
res = web.DataReader(ticker_symbol, "yahoo", start=start, end=end)
res.to_csv(filepath, encoding="utf-8-sig")
except (RemoteDataError, KeyError):
print(f"ticker_symbol ${ticker_symbol} が正しいか確認してください。")
else:
res = pd.read_csv(filepath, index_col="Date")
res.index = pd.to_datetime(res.index)
assert res is not None, "データ取得に失敗しました"
return res
# 銘柄名、期間、保存先ファイル
ticker_symbol = "NVDA"
start = "2021-01-01"
end = "2021-06-30"
# データを取得する
df = get_finance_data(ticker_symbol, start=start, end=end, savedir="../data")
df.head()
High | Low | Open | Close | Volume | Adj Close | |
---|---|---|---|---|---|---|
Date | ||||||
2020-12-31 | 131.509995 | 129.149994 | 131.365005 | 130.550003 | 19242400.0 | 130.413864 |
2021-01-04 | 136.524994 | 129.625000 | 131.042496 | 131.134995 | 56064000.0 | 130.998245 |
2021-01-05 | 134.434998 | 130.869995 | 130.997498 | 134.047501 | 32276000.0 | 133.907700 |
2021-01-06 | 132.449997 | 125.860001 | 132.225006 | 126.144997 | 58042400.0 | 126.013443 |
2021-01-07 | 133.777496 | 128.865005 | 129.675003 | 133.440002 | 46148000.0 | 133.300842 |
OHLCとは始値・高値・安値・終値のことで、普段最もよくみるグラフの一つです。 ローソク足と、線でのプロットをしてみます。
import mplfinance as mpf
mpf.plot(df, type="candle", style="starsandstripes", figsize=(12, 4))
mpf.plot(df, type="line", style="starsandstripes", figsize=(12, 4))
株価や外国為替のテクニカル分析において使用される指標の一つに、移動平均線というものがあります。
現在のテクニカル分析では、短期、中期、長期の3本の移動平均線を同時に表示させる例が多く、日足チャートでは、5日移動平均線、25日移動平均線、75日移動平均線がよく使われる。(引用元:Wikipedia 移動平均線)
5/25/75日移動平均線をプロットするために mav
オプションを指定します。
mpf.plot(df, type="candle", style="starsandstripes", figsize=(12, 4), mav=[5, 25, 75])
どの線が何日移動平均線かわかりにくいので、凡例を追加します。
import japanize_matplotlib
import matplotlib.patches as mpatches
fig, axes = mpf.plot(
df,
type="candle",
style="starsandstripes",
figsize=(12, 4),
mav=[5, 25, 75],
returnfig=True,
)
fig.legend(
[f"{days} days" for days in [5, 25, 75]], bbox_to_anchor=(0.0, 0.78, 0.28, 0.102)
)
<matplotlib.legend.Legend at 0x7f8be96e5b80>
fig, axes = mpf.plot(
df,
title="NVDA 2021/1/B~2021/6/E",
type="candle",
style="starsandstripes",
figsize=(12, 4),
mav=[5, 25, 75],
volume=True,
datetime_format="%Y/%m/%d",
returnfig=True,
)
fig.legend(
[f"{days} days" for days in [5, 25, 75]], bbox_to_anchor=(0.0, 0.78, 0.28, 0.102)
)
<matplotlib.legend.Legend at 0x7f8beac867f0>
fig, axes = mpf.plot(
df,
title="NVDA 2021/1/B~2021/6/E",
type="candle",
style="yahoo",
figsize=(12, 4),
mav=[5, 25, 75],
volume=True,
datetime_format="%Y/%m/%d",
returnfig=True,
)
fig.legend(
[f"{days} days" for days in [5, 25, 75]], bbox_to_anchor=(0.0, 0.78, 0.28, 0.102)
)