LoginSignup
3
2

More than 3 years have passed since last update.

『フィナンシャルモデリング』をPythonで実装してみた(1)株価データをインポート

Last updated at Posted at 2019-04-29

はじめに

サイモンベニンガ著『ファイナンシャル・モデリング』(2017、ロキガ書房)の内容をPythonで実装してみました。本記事は本のp191-196に該当します。

1. Yahoo Financeから時系列データを読み込む

(参照:https://qiita.com/ympnov22/items/0dd0dfd1785015e8b36f

まず、これから必要になるライブラリをインポートします。

import pandas as pd
import pandas_datareader.data as pdr
import matplotlib.pyplot as plt
%matplotlib inline

今回はpandasのdatareaderを用いて株価情報を読み取ります。

#Yahoo FinanceからGoogleの2011/01/01~2012/12/31までのデータを取得する
google = pdr.DataReader('GOOGL', 'yahoo', '2011/1/1', '2012/1/1')
apple = pdr.DataReader('AAPL', 'yahoo', '2011/1/1', '2012/1/1')

pdr.DataReaderの引数は(name, data_source, start_date, end_date)の4つで、

  • name: 取り出したい株の銘柄
  • data_source: データの取り出し元(今回はyahoo)
  • start_date: データ取得の開始日(今回は2011/01/01)
  • end_date: データ取得の終了日(今回は2012/01/01)

となっています。
上のコードを実行することで、googleという変数には2011/01/01~2012/01/01のグーグル社の株価情報がpandas.DataFrameの形で入りました。appleも同様です。
ちなみにこのDataFrameは
スクリーンショット 2019-04-29 午後5.20.14.png
のような形になっています。

2. 日次収益率を求める

日次リターンの計算には先ほど読み込んだDataFrameの'Adj Close' (調整後終値) という列を使用します。

#調整後終値を抽出する
gg_adjClose = google[['Adj Close']]
app_adjClose = apple[['Adj Close']]

DataFrameから特定の列を取り出したら、pct_change()というpandasのメソッドを使って前日からの増分を計算します。また、今後のためにrename()メソッドを使ってカラムの名前を"Adj Close"から"Goolge"に変更しておきます。

#日次リターンを求める。データフレームの最初の行がNaNになるのでdropna()する。
gg_daily_pct_change = gg_adjClose.pct_change().dropna()
#列の名前を変更
gg_daily = gg_daily_pct_change.rename(columns={'Adj Close': 'Google'})

Appleも同様です。

app_daily_pct_change = app_adjClose.pct_change().dropna()
app_daily = app_daily_pct_change.rename(columns={'Adj Close': 'Apple'})

比較しやすくするために二社のデータを横に連結し、dailyという一つのDataFrameを作ります。

#2社分のデータを結合
daily = pd.concat([gg_daily, app_daily], axis = 1)

以上でこんな感じの日次収益率のDataFrameが出来上がりました。
スクリーンショット 2019-04-29 午後5.37.33.png

統計量を求める

平均、標準偏差、共分散、相関関数などの基本的な統計量を求めます。

#基本統計量
daily.describe()

このコードを実行すると
スクリーンショット 2019-04-29 午後5.43.55.png

上からデータ数、平均、標準偏差、最小値、第一四分位数、中央値、第三四分位数、最大値が表示されます。

共分散と相関係数は次のように求められます。

#共分散
cov = daily.cov()['Google']['Apple']
#相関係数
corr = daily.corr()['Google']['Apple']

4. 二社の傾向線を引く

matplotlibを使って日次収益率の散布図を作ってみましょう。

apple = daily['Apple']
google = daily['Google']
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x=apple, y=google)
ax.grid()
ax.set_xlabel('Apple')
ax.set_ylabel('Google')

このコードを実行すると散布図ができます。
スクリーンショット 2019-04-29 午後6.01.46.png

上のコードに次のコードを追加すれば傾向直線が引けます。

ax.plot(apple, np.poly1d(np.polyfit(apple, google, 1))(apple), color="red", label='trend line')

スクリーンショット 2019-04-29 午後6.04.20.png

完成です!

宣伝

SmartTrade社では毎週水曜日18:00から勉強会を行っています。(https://python-algo.connpass.com/)

3
2
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
3
2