teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

誤字

2020/02/11 03:58

投稿

gusachan3
gusachan3

スコア16

answer CHANGED
@@ -31,7 +31,7 @@
31
31
  import datetime
32
32
 
33
33
  # データの保存場所を指定
34
- # この場合は、C:/Users/s-sug/Anaconda3/linear_regression/ を読み書きする
34
+ # この場合は、C:/Users/hoge/Anaconda3/linear_regression/ を読み書きする
35
35
 
36
36
  WORK_DIR = 'C:/Users/hoge/Anaconda3/linear_regression/'
37
37
  DATA_DIR = 'C:/Users/hoge/Anaconda3/linear_regression/data/'

4

字句の校正

2020/02/11 03:58

投稿

gusachan3
gusachan3

スコア16

answer CHANGED
@@ -19,7 +19,7 @@
19
19
 
20
20
  Notebook を再起動したときは各ブロックのimport したライブラリを、[run] ボタンでリロードしてますか。一応、写経したコードを貼っておきます。
21
21
  追記)
22
- エラーが出たの、tqdm, datetime のインポート表記を変更・追加をしました。
22
+ エラーが出た箇所の、tqdm, datetime のインポート表記を変更・追加をしました。
23
23
  ```Python3
24
24
  from IPython.core.display import display
25
25
 

3

コードの追加

2020/02/11 02:51

投稿

gusachan3
gusachan3

スコア16

answer CHANGED
@@ -18,10 +18,134 @@
18
18
  ```
19
19
 
20
20
  Notebook を再起動したときは各ブロックのimport したライブラリを、[run] ボタンでリロードしてますか。一応、写経したコードを貼っておきます。
21
+ 追記)
22
+ エラーが出たので、tqdm, datetime のインポート表記を変更・追加をしました。
21
23
  ```Python3
22
- DATA_DIR = 'C:/Users/hoge/Anaconda3/linear_regression/data/' # (パスは適宜変えてください)
24
+ from IPython.core.display import display
23
- DATA_CHAPTER1 = 'C:/Users/hoge/Anaconda3/data/download_data/' # (パスは適宜変えてください)
24
25
 
26
+ from os import path
27
+ import re
28
+ import pandas as pd
29
+ import numpy as np
30
+ from tqdm.notebook import tqdm
31
+ import datetime
32
+
33
+ # データの保存場所を指定
34
+ # この場合は、C:/Users/s-sug/Anaconda3/linear_regression/ を読み書きする
35
+
36
+ WORK_DIR = 'C:/Users/hoge/Anaconda3/linear_regression/'
37
+ DATA_DIR = 'C:/Users/hoge/Anaconda3/linear_regression/data/'
38
+ DATA_CHAPTER1 = 'C:/Users/hoge/Anaconda3/data/download_data/'
39
+
40
+ daily_data = pd.read_pickle(f"{DATA_CHAPTER1}daily_data.pickle")
41
+
42
+ # 銘柄ごとに計算するため、証券コード(SC)で集計する
43
+ groups = daily_data.groupby('SC')
44
+
45
+ data_set = []
46
+ for security, values in tqdm(groups):
47
+ # 全体の10%以上の取引日で取引のない銘柄は無視する
48
+ if values['株価'].isnull().sum() > values.shape[0]*0.1:
49
+ continue
50
+
51
+ # 一時的に market_value 列を作って計算する
52
+ # 証券コード(SC)1、2 は株価指数を表しているので、単純に指数値を入れる
53
+ if security in {1, 2}:
54
+ values = values.assign(market_value = lambda x: x['株価'])
55
+ else:
56
+ values = values.assign(market_value = lambda x: x['時価総額(百万円)'])
57
+
58
+ # calculation return
59
+ values = values.sort_values('日時') # 時系列でソート
60
+ values['収益率'] = values['market_value'].pct_change() # 変化率の計算
61
+ values.drop(columns = ['market_value']) # 一時的な列を削除
62
+ data_set.append(values)
63
+
64
+ daily_data_adj = pd.concat(data_set) # 銘柄ごとに計算したものを結合
65
+
66
+ # 極端な値を外れ値として削除。ここでは上下 0.1% を外れ値とする
67
+ threshold = 0.001
68
+
69
+ lower = daily_data_adj['収益率'].quantile(threshold)
70
+ upper = daily_data_adj['収益率'].quantile(1-threshold)
71
+
72
+ daily_data_adj = daily_data_adj[
73
+ (lower < daily_data_adj['収益率']) & (daily_data_adj['収益率'] < upper)
74
+ ].copy()
75
+
76
+ #############################################################
77
+
78
+ jgb_path = f'{DATA_DIR}risk_free_rate/jgbcm_all.csv'
79
+ risk_free_rate = pd.read_csv(
80
+ jgb_path,
81
+ skiprows=1,
82
+ usecols=['基準日', '10年'],
83
+ parse_dates=['基準日'],
84
+ encoding='sjis',
85
+ index_col=['基準日'],
86
+ na_values='-'
87
+ )
88
+
89
+ risk_free_rate = risk_free_rate['10年'].apply(
90
+ # 半年複利(%表記)を日時対数収益率に変換
91
+ lambda x: np.log(1 + 0.01 * 0.5 * x) / 125
92
+ ).apply(
93
+ # 単利へ変換
94
+ lambda x: np.exp(x) -1
95
+ )
96
+ risk_free_rate.rename('安全資産利子率', inplace=True)
97
+ risk_free_rate.index.rename('日時', inplace=True)
98
+
99
+ risk_free_rate = pd.DataFrame(risk_free_rate)
100
+
101
+ # 出力して結果を確認
102
+ display(risk_free_rate.dropna().head())
103
+
104
+ ############################################################
105
+
106
+ stock_return_and_risk_free_return = pd.merge(
107
+ daily_data_adj[daily_data_adj['SC'] > 2],
108
+ risk_free_rate, on='日時'
109
+ )
110
+
111
+ # SC と日時を index にする
112
+ stock_return_and_risk_free_return.set_index(
113
+ ['SC', '日時'],
114
+ verify_integrity=True,
115
+ inplace=True
116
+ )
117
+ # 出力して結果を確認
118
+ display(stock_return_and_risk_free_return.head())
119
+
120
+ ############################################################
121
+
122
+ # 日時で集計
123
+ group_by_date = stock_return_and_risk_free_return.groupby('日時')
124
+
125
+ data_with_market_returns = []
126
+ for date, values in tqdm(group_by_date):
127
+ sum_of_market_capital = values['時価総額(百万円)'].sum()
128
+ values = values.assign(
129
+ # retuen がすべて null なら null にする
130
+ 市場収益率 = lambda x: (
131
+ x['収益率'] * (x['時価総額(百万円)'] / sum_of_market_capital)
132
+ ).sum(
133
+ min_count=1
134
+ )
135
+ )
136
+ data_with_market_returns.append(values)
137
+
138
+ data_with_market_returns = pd.concat(data_with_market_returns)
139
+
140
+ display(data_with_market_returns.head())
141
+
142
+ ############################################################
143
+ data_with_excess_returns = data_with_market_returns.assign(
144
+ 超過収益率 = lambda x: x['収益率'] -x['安全資産利子率'],
145
+ 市場超過収益率 = lambda x: x['市場収益率'] -x['安全資産利子率']
146
+ )
147
+
148
+ ###########################################################
25
149
  # 扱いやすくするために index を通常の列に戻す
26
150
  temporary_data_excess_returns = data_with_excess_returns.reset_index()
27
151
 

2

コードの追加

2020/02/11 02:48

投稿

gusachan3
gusachan3

スコア16

answer CHANGED
@@ -15,4 +15,95 @@
15
15
  )
16
16
  )
17
17
  temporary_list.append(aligned)
18
+ ```
19
+
20
+ Notebook を再起動したときは各ブロックのimport したライブラリを、[run] ボタンでリロードしてますか。一応、写経したコードを貼っておきます。
21
+ ```Python3
22
+ DATA_DIR = 'C:/Users/hoge/Anaconda3/linear_regression/data/' # (パスは適宜変えてください)
23
+ DATA_CHAPTER1 = 'C:/Users/hoge/Anaconda3/data/download_data/' # (パスは適宜変えてください)
24
+
25
+ # 扱いやすくするために index を通常の列に戻す
26
+ temporary_data_excess_returns = data_with_excess_returns.reset_index()
27
+
28
+ # read financial data
29
+ financial_data = pd.read_pickle(
30
+ f'{DATA_CHAPTER1}financial_data_all.pickle'
31
+ )
32
+
33
+ # 利用しない列を削除
34
+ financial_data.drop(
35
+ columns=['発行済株式数', '日時'],
36
+ inplace=True
37
+ )
38
+
39
+ # 決算発表日の株価データとマージできるように、株価データに決算発表日を張る
40
+ group_by_security = temporary_data_excess_returns.groupby('SC')
41
+
42
+ temporary_list = []
43
+ for security, values in tqdm(group_by_security):
44
+
45
+ # 財務データから決算発表日を取得
46
+ # 例: array(
47
+ # ['2016-05-11T00:00:00.000000000', '2017-05-T00:00:00.000000000'],
48
+ # dtype='datetime64[ns]'
49
+ # )
50
+ announcement_dates = financial_data[
51
+ '決算発表日(本決算)'
52
+ ][
53
+ financial_data.SC == security
54
+ ].dropna().unique()
55
+
56
+ # 古いソートにして np.array に戻す
57
+ announcement_dates = pd.Series(announcement_dates).sort_values().values
58
+
59
+ # 収益率データの「日時」が含まれる決算期を意味するカテゴリカル変数を作る
60
+ # 例:「日時」が 2016-05-11 より前 → 欠損値、
61
+ #   「日時」が 2016-05-11 ~ 2017-05-11 → 2016-05-11、など
62
+
63
+ aligned = values.assign(
64
+ announcement_date = lambda x: pd.cut(
65
+ x['日時'],
66
+ (
67
+ list(announcement_dates)
68
+ ) + [np.datetime64(values['日時'].max() + pd.offsets.Day())],
69
+ labels = announcement_dates,
70
+ right=False
71
+ ).astype(
72
+ np.datetime64
73
+ )
74
+ )
75
+ temporary_list.append(aligned)
76
+
77
+ temporary_data_excess_returns = pd.concat(temporary_list)
78
+ temporary_data_excess_returns.rename(
79
+ columns = {'announcement_date':'決算発表日(日時)'},
80
+ inplace=True
81
+ )
82
+ del temporary_list
83
+
84
+ # 財務データを決算発表日について一意にする
85
+ financial_data = financial_data.groupby(
86
+ ['SC', '決算発表日(本決算)']
87
+ ).first().reset_index()
88
+
89
+ excess_returns_with_financial_data = pd.merge(
90
+ temporary_data_excess_returns,
91
+ financial_data,
92
+ left_on=['SC', '名称', '決算発表日(日時)'],
93
+ right_on=['SC', '名称', '決算発表日(本決算)'],
94
+ how='left'
95
+ )
96
+
97
+ excess_returns_with_financial_data.set_index(
98
+ ['SC', '日時'],
99
+ inplace=True,
100
+ verify_integrity=True
101
+ )
102
+
103
+ del temporary_data_excess_returns
104
+
105
+ # データを pickle で保存
106
+ excess_returns_with_financial_data.to_pickle(
107
+ f'{DATA_DIR}excess_returns_with_financial_data.pickle'
108
+ )
18
109
  ```

1

コード挿入

2020/02/09 12:45

投稿

gusachan3
gusachan3

スコア16

answer CHANGED
@@ -1,6 +1,7 @@
1
1
  [TensorFlowではじめる 株式投資のためのディープラーニング](https://www.amazon.co.jp/gp/product/4798055913/ref=ppx_yo_dt_b_asin_title_o02_s00?ie=UTF8&psc=1) ですね。(p.92)
2
2
  本の通りにやったらできましたよ。以下のコードが欠損してますが大丈夫ですか?
3
3
 
4
+ ```python3
4
5
  aligned = values.assign(
5
6
  announcement_date = lambda x: pd.cut(
6
7
  x['日時'],
@@ -13,4 +14,5 @@
13
14
  np.datetime64
14
15
  )
15
16
  )
16
- temporary_list.append(aligned)
17
+ temporary_list.append(aligned)
18
+ ```