# リスト3.9.1:株価の取得
import os
import pandas as pd
base_url = (
"https://raw.githubusercontent.com/practical-jupyter/sample-data/master/anime/"
)
anime_stock_price_csv = os.path.join(base_url, "anime_stock_price.csv")
df = pd.read_csv(anime_stock_price_csv, index_col=0, parse_dates=["Date"])
df.head()
TOEI ANIMATION | IG Port | |
---|---|---|
Date | ||
2015-01-01 | 3356.86 | 1201.51 |
2015-01-02 | 3356.86 | 1201.51 |
2015-01-05 | 3396.12 | 1218.44 |
2015-01-06 | 3361.77 | 1201.51 |
2015-01-07 | 3297.97 | 1202.51 |
# リスト3.9.2:騰落率
pd.options.display.max_rows = 10 # pandasで表示する行数を設定
pct_change = df["TOEI ANIMATION"].pct_change()
pct_change
Date 2015-01-01 NaN 2015-01-02 0.000000 2015-01-05 0.011695 2015-01-06 -0.010114 2015-01-07 -0.018978 ... 2016-12-26 0.001725 2016-12-27 0.010326 2016-12-28 0.015333 2016-12-29 0.013422 2016-12-30 0.000000 Name: TOEI ANIMATION, dtype: float64
# リスト3.9.4:累積リターン
cumulative_returns = (pct_change + 1).cumprod()
cumulative_returns[0] = 1
cumulative_returns
Date 2015-01-01 1.000000 2015-01-02 1.000000 2015-01-05 1.011695 2015-01-06 1.001463 2015-01-07 0.982457 ... 2016-12-26 1.722833 2016-12-27 1.740624 2016-12-28 1.767312 2016-12-29 1.791034 2016-12-30 1.791034 Name: TOEI ANIMATION, dtype: float64
# リスト3.9.6:移動平均
df["TOEI ANIMATION"].rolling(5).mean()
Date 2015-01-01 NaN 2015-01-02 NaN 2015-01-05 NaN 2015-01-06 NaN 2015-01-07 3353.916 ... 2016-12-26 5793.260 2016-12-27 5799.232 2016-12-28 5821.132 2016-12-29 5868.912 2016-12-30 5916.692 Name: TOEI ANIMATION, dtype: float64
# リスト3.9.8:20日間のヒストリカルボラティリティ
import numpy as np
def historical_volatility(x):
logreturns = np.diff(np.log(x)) # 対数収益率
return np.sqrt(365 * logreturns.var())
df["TOEI ANIMATION"].rolling(20).apply(historical_volatility)
Date 2015-01-01 NaN 2015-01-02 NaN 2015-01-05 NaN 2015-01-06 NaN 2015-01-07 NaN ... 2016-12-26 0.158355 2016-12-27 0.163235 2016-12-28 0.170891 2016-12-29 0.172681 2016-12-30 0.151983 Name: TOEI ANIMATION, dtype: float64
# リスト3.9.10:DatetimeIndexの作成
ix = pd.date_range("2017-01", "2017-02", freq="1H")
ix
DatetimeIndex(['2017-01-01 00:00:00', '2017-01-01 01:00:00', '2017-01-01 02:00:00', '2017-01-01 03:00:00', '2017-01-01 04:00:00', '2017-01-01 05:00:00', '2017-01-01 06:00:00', '2017-01-01 07:00:00', '2017-01-01 08:00:00', '2017-01-01 09:00:00', ... '2017-01-31 15:00:00', '2017-01-31 16:00:00', '2017-01-31 17:00:00', '2017-01-31 18:00:00', '2017-01-31 19:00:00', '2017-01-31 20:00:00', '2017-01-31 21:00:00', '2017-01-31 22:00:00', '2017-01-31 23:00:00', '2017-02-01 00:00:00'], dtype='datetime64[ns]', length=745, freq='H')
# リスト3.9.12:DatetimeIndexを使用したSeries
time_series = pd.Series(np.arange(len(ix)), index=ix)
time_series
2017-01-01 00:00:00 0 2017-01-01 01:00:00 1 2017-01-01 02:00:00 2 2017-01-01 03:00:00 3 2017-01-01 04:00:00 4 ... 2017-01-31 20:00:00 740 2017-01-31 21:00:00 741 2017-01-31 22:00:00 742 2017-01-31 23:00:00 743 2017-02-01 00:00:00 744 Freq: H, dtype: int64
# リスト3.9.14:インデクサにdatetime型の値を指定
from datetime import datetime
df.loc[datetime(2016, 1, 4)]
TOEI ANIMATION 5699.74 IG Port 822.66 Name: 2016-01-04 00:00:00, dtype: float64
# リスト3.9.16:インデクサに日付形式の文字列を指定①
df.loc["2016-01-04"]
TOEI ANIMATION 5699.74 IG Port 822.66 Name: 2016-01-04 00:00:00, dtype: float64
# リスト3.9.17:インデクサに日付形式の文字列を指定②
df.loc["Jan-04-2016"]
TOEI ANIMATION 5699.74 IG Port 822.66 Name: 2016-01-04 00:00:00, dtype: float64
# リスト3.9.18:年を指定した抽出
print(df.loc["2015"].head())
TOEI ANIMATION IG Port Date 2015-01-01 3356.86 1201.51 2015-01-02 3356.86 1201.51 2015-01-05 3396.12 1218.44 2015-01-06 3361.77 1201.51 2015-01-07 3297.97 1202.51
# リスト3.9.20:月を指定した抽出
print(df.loc["2016-05"].head())
TOEI ANIMATION IG Port Date 2016-05-02 4703.29 933.34 2016-05-03 4703.29 933.34 2016-05-04 4703.29 933.34 2016-05-05 4703.29 933.34 2016-05-06 4678.41 953.28
# リスト3.9.22:年月でスライス
print(df.loc["2015-12":"2016-01"])
TOEI ANIMATION IG Port Date 2015-12-01 5947.13 910.41 2015-12-02 5917.44 896.45 2015-12-03 5917.44 893.46 2015-12-04 5867.97 888.47 2015-12-07 5917.44 892.46 ... ... ... 2016-01-25 5452.36 704.99 2016-01-26 5491.94 702.00 2016-01-27 5521.63 721.94 2016-01-28 5679.95 733.91 2016-01-29 5670.06 739.89 [44 rows x 2 columns]
# リスト3.9.24:9時のデータを抽出
from datetime import time
time_series.loc[time(9, 0)]
2017-01-01 09:00:00 9 2017-01-02 09:00:00 33 2017-01-03 09:00:00 57 2017-01-04 09:00:00 81 2017-01-05 09:00:00 105 ... 2017-01-27 09:00:00 633 2017-01-28 09:00:00 657 2017-01-29 09:00:00 681 2017-01-30 09:00:00 705 2017-01-31 09:00:00 729 Freq: 24H, dtype: int64
# リスト3.9.26:9時から12時のデータを抽出
time_series.between_time(time(9, 0), time(12, 0))
2017-01-01 09:00:00 9 2017-01-01 10:00:00 10 2017-01-01 11:00:00 11 2017-01-01 12:00:00 12 2017-01-02 09:00:00 33 ... 2017-01-30 12:00:00 708 2017-01-31 09:00:00 729 2017-01-31 10:00:00 730 2017-01-31 11:00:00 731 2017-01-31 12:00:00 732 dtype: int64
# リスト3.9.28:月次の株価の平均値
df["TOEI ANIMATION"].resample("M").mean().head()
Date 2015-01-31 3647.080000 2015-02-28 3612.302500 2015-03-31 3625.770455 2015-04-30 3477.555455 2015-05-31 3653.990476 Freq: M, Name: TOEI ANIMATION, dtype: float64
# リスト3.9.30:日次の終値を週足に変換
df["TOEI ANIMATION"].resample("W").ohlc().head()
open | high | low | close | |
---|---|---|---|---|
Date | ||||
2015-01-04 | 3356.86 | 3356.86 | 3356.86 | 3356.86 |
2015-01-11 | 3396.12 | 3513.90 | 3297.97 | 3513.90 |
2015-01-18 | 3513.90 | 3872.16 | 3435.38 | 3872.16 |
2015-01-25 | 3877.07 | 3877.07 | 3739.66 | 3739.66 |
2015-02-01 | 3774.01 | 3965.41 | 3774.01 | 3965.41 |