PyLearn SCR 01: 株価データのスクレイピング

ここでは、株式投資メモから銘柄コード1301、2017年度の1日毎の株価データを取得する方法について述べます。 必ず、robot.txtを確認して、スクレイピングを許可されていることをチェックしてから使用してください。

0. HTMLソースの取得

はじめに、必要なライブラリをインポートします。bs4, BeautifulSoupとは、pythonでスクレイピングを行うためのライブラリ、requestsはpyhton側からwebへ接続するためのライブラリとなります。

In [1]:
from bs4 import BeautifulSoup
import requests as rq

続いて、株式投資メモのwebページを見にいって、銘柄コード1301、2017年のデータがどのページにあるのか確認に行きます。実際見に行くと、以下のページにあることが確認できました。

https://kabuoji3.com/stock/1301/2017/

stockディレクトリの1301/2017にhtmlページがあることがわかります。URLの後ろに、銘柄コード、年、この2つがくっついているようです。それではさっそく、スクレピングを開始します。

In [2]:
Year = 2017 # 取得したい年
Code = 1301 #銘柄コード
url = 'https://kabuoji3.com/stock/' + str(Code) +'/' + str(Year) + '/'
HtmlSource = BeautifulSoup(rq.get(url).content,'html.parser')

url変数はただ単に文字列の結合です。取得したいURLをなす文字列を作っていることになります。その下で、BeautifulSoup関数があり、ここにurlが渡されています。実はこれで、該当のページのhtmlソースが取得できます。実際にprintしてみましょう。

In [3]:
# print(HtmlSource) # <- 長くなるので、自分の環境で表示してください。

このように、HTMLソースがあることがわかります。そして、中間くらいのtrタグに対して、

  • 日付
  • 始値 Opening price
  • 高値 High price
  • 安値 Low price
  • 終値 Closing price
  • 出来高 Stock trading volume
  • 終値調整 Adj.Close

といったデータがあることが確認できます。trタグの開始・終了地点を取り出せばいいことになります。BeautifulSoupで取り出した変数は、find_all関数と呼ばれる、タグの開始・終了地点を取得する関数が用意されています。実際にこれを利用して、trタグのデータを取り出してみます。

In [4]:
TRtag2017 = HtmlSource.find_all('tr')
print(TRtag2017[0])
print(TRtag2017[1])
<tr>
<th>日付</th>
<th>始値</th>
<th>高値</th>
<th>安値</th>
<th>終値</th>
<th>出来高</th>
<th>終値調整</th>
</tr>
<tr>
<td>2017-01-04</td>
<td>2734</td>
<td>2755</td>
<td>2730</td>
<td>2742</td>
<td>31400</td>
<td>2742</td>
</tr>

こんな感じで取り出せました。0番目にヘッダ、1番目以降に一日毎の株価データが入っていることがわかります。とはいえ、htmlタグがたくさんついており、とてもではありませんがこのままでは使い物になるデータではありません。数字だけを取り出すために、データを整理していきます。試しに、TRtag[1]に格納されている2017-01-04のデータで行ってみましょう。

In [5]:
NewTag = TRtag2017[1]
NewTag = str(NewTag).replace("<tr>", "") # <- trタグの開始地点を削除
NewTag = str(NewTag).replace("</tr>", "") # <- trタグの終了地点の削除
NewTag = str(NewTag).replace("\n", "") # <- 改行コードの削除
NewTag = str(NewTag).replace("<td>", "") # <- 改行コードの削除

print(NewTag)
2017-01-04</td>2734</td>2755</td>2730</td>2742</td>31400</td>2742</td>

replace関数を使用して、様々なhtmlタグや改行コード\n)を除去していきます。これで、/tdタグによって区切られた数字データとなりました。

In [6]:
ValueDat2017 = NewTag.split("</td>")
print(ValueDat2017)
['2017-01-04', '2734', '2755', '2730', '2742', '31400', '2742', '']

split関数を使用して、/tdタグでデータを分割してみました。これで、一つ一つのデータを取り出すことができました。

1. 株価データの取り出し (2017年)

先ほどの例で、ある特定日にちの株価データを取り出す簡単な方法を述べました。しかし1日おきに手作業で取り出すわけにはいかないので、for文を利用して1年間のデータを一括して取り出してみます。

In [9]:
ValueDat2017 = []
for i in range(1, len(TRtag2017)): # <- 0番目はヘッダなので1スタート
    NewTag = TRtag2017[i]
    NewTag = str(NewTag).replace("<tr>", "") # <- trタグの開始地点を削除
    NewTag = str(NewTag).replace("</tr>", "") # <- trタグの終了地点の削除
    NewTag = str(NewTag).replace("\n", "") # <- 改行コードの削除
    NewTag = str(NewTag).replace("<td>", "") # <- 改行コードの削除
    ValueDat2017.append(NewTag.split("</td>")) # appendでリストへ積む
    print(ValueDat2017[i-1]) # <- 表示
['2017-01-04', '2734', '2755', '2730', '2742', '31400', '2742', '']
['2017-01-05', '2743', '2747', '2735', '2738', '17900', '2738', '']
['2017-01-06', '2734', '2744', '2720', '2740', '19900', '2740', '']
['2017-01-10', '2745', '2754', '2735', '2748', '24200', '2748', '']
['2017-01-11', '2748', '2752', '2737', '2745', '9300', '2745', '']
['2017-01-12', '2745', '2747', '2703', '2731', '28700', '2731', '']
['2017-01-13', '2707', '2730', '2707', '2722', '19400', '2722', '']
['2017-01-16', '2725', '2725', '2696', '2704', '20100', '2704', '']
['2017-01-17', '2702', '2704', '2682', '2686', '18400', '2686', '']
['2017-01-18', '2689', '2695', '2681', '2694', '12100', '2694', '']
['2017-01-19', '2694', '2717', '2694', '2699', '13200', '2699', '']
['2017-01-20', '2724', '2737', '2705', '2737', '26000', '2737', '']
['2017-01-23', '2730', '2731', '2712', '2720', '12600', '2720', '']
['2017-01-24', '2718', '2728', '2718', '2727', '21300', '2727', '']
['2017-01-25', '2732', '2737', '2724', '2731', '15100', '2731', '']
['2017-01-26', '2738', '2739', '2729', '2733', '16200', '2733', '']
['2017-01-27', '2739', '2739', '2726', '2727', '19100', '2727', '']
['2017-01-30', '2726', '2734', '2725', '2734', '16500', '2734', '']
['2017-01-31', '2730', '2731', '2715', '2722', '16100', '2722', '']
['2017-02-01', '2717', '2735', '2717', '2735', '16600', '2735', '']
['2017-02-02', '2735', '2736', '2725', '2729', '17000', '2729', '']
['2017-02-03', '2722', '2733', '2720', '2720', '16300', '2720', '']
['2017-02-06', '2733', '2735', '2718', '2725', '17800', '2725', '']
['2017-02-07', '2725', '2736', '2724', '2731', '18600', '2731', '']
['2017-02-08', '2726', '2737', '2725', '2737', '16500', '2737', '']
['2017-02-09', '2725', '2747', '2725', '2737', '18200', '2737', '']
['2017-02-10', '2737', '2750', '2737', '2745', '28400', '2745', '']
['2017-02-13', '2760', '2789', '2756', '2782', '35900', '2782', '']
['2017-02-14', '2783', '2818', '2776', '2801', '47200', '2801', '']
['2017-02-15', '2820', '2826', '2807', '2824', '34600', '2824', '']
['2017-02-16', '2829', '2841', '2825', '2825', '27700', '2825', '']
['2017-02-17', '2825', '2833', '2811', '2826', '26600', '2826', '']
['2017-02-20', '2838', '2855', '2831', '2851', '35700', '2851', '']
['2017-02-21', '2853', '2883', '2850', '2882', '35900', '2882', '']
['2017-02-22', '2900', '2937', '2895', '2927', '54500', '2927', '']
['2017-02-23', '2903', '2939', '2903', '2928', '30100', '2928', '']
['2017-02-24', '2923', '2946', '2919', '2945', '32400', '2945', '']
['2017-02-27', '2950', '2978', '2931', '2946', '51600', '2946', '']
['2017-02-28', '2963', '2985', '2949', '2971', '45400', '2971', '']
['2017-03-01', '2984', '3015', '2977', '3015', '77000', '3015', '']
['2017-03-02', '3030', '3035', '3015', '3020', '52500', '3020', '']
['2017-03-03', '3030', '3045', '3020', '3040', '45200', '3040', '']
['2017-03-06', '3050', '3125', '3050', '3110', '117300', '3110', '']
['2017-03-07', '3120', '3150', '3105', '3115', '78700', '3115', '']
['2017-03-08', '3100', '3145', '3095', '3135', '77800', '3135', '']
['2017-03-09', '3135', '3175', '3130', '3155', '96100', '3155', '']
['2017-03-10', '3165', '3175', '3110', '3135', '110700', '3135', '']
['2017-03-13', '3135', '3180', '3125', '3165', '74000', '3165', '']
['2017-03-14', '3180', '3200', '3160', '3200', '75700', '3200', '']
['2017-03-15', '3210', '3210', '3135', '3140', '97200', '3140', '']
['2017-03-16', '3130', '3170', '3110', '3160', '55200', '3160', '']
['2017-03-17', '3170', '3195', '3165', '3195', '61400', '3195', '']
['2017-03-21', '3180', '3205', '3175', '3185', '74200', '3185', '']
['2017-03-22', '3155', '3175', '3145', '3150', '72800', '3150', '']
['2017-03-23', '3130', '3150', '3110', '3115', '78900', '3115', '']
['2017-03-24', '3115', '3140', '3115', '3125', '62700', '3125', '']
['2017-03-27', '3125', '3135', '3110', '3120', '89300', '3120', '']
['2017-03-28', '3120', '3150', '3110', '3115', '188500', '3115', '']
['2017-03-29', '3050', '3065', '2999', '3010', '166400', '3010', '']
['2017-03-30', '3005', '3010', '2936', '2942', '104000', '2942', '']
['2017-03-31', '2948', '2996', '2936', '2936', '62300', '2936', '']
['2017-04-03', '2946', '3025', '2942', '3010', '80800', '3010', '']
['2017-04-04', '3005', '3020', '2983', '3010', '77200', '3010', '']
['2017-04-05', '3015', '3030', '2994', '3005', '35800', '3005', '']
['2017-04-06', '2980', '2994', '2941', '2942', '34600', '2942', '']
['2017-04-07', '2960', '2980', '2942', '2944', '31500', '2944', '']
['2017-04-10', '2931', '2947', '2915', '2926', '26500', '2926', '']
['2017-04-11', '2906', '2928', '2905', '2911', '21800', '2911', '']
['2017-04-12', '2905', '2908', '2873', '2895', '29900', '2895', '']
['2017-04-13', '2861', '2898', '2860', '2883', '42400', '2883', '']
['2017-04-14', '2880', '2888', '2853', '2860', '19400', '2860', '']
['2017-04-17', '2860', '2903', '2859', '2896', '23400', '2896', '']
['2017-04-18', '2890', '2890', '2859', '2880', '27200', '2880', '']
['2017-04-19', '2880', '2899', '2880', '2897', '32000', '2897', '']
['2017-04-20', '2900', '2919', '2866', '2871', '27000', '2871', '']
['2017-04-21', '2890', '2890', '2871', '2888', '17500', '2888', '']
['2017-04-24', '2900', '2920', '2875', '2919', '31600', '2919', '']
['2017-04-25', '2936', '2936', '2908', '2913', '21100', '2913', '']
['2017-04-26', '2918', '2943', '2916', '2935', '39300', '2935', '']
['2017-04-27', '2940', '2951', '2933', '2951', '18500', '2951', '']
['2017-04-28', '2939', '2953', '2922', '2935', '23400', '2935', '']
['2017-05-01', '2930', '2948', '2919', '2935', '23800', '2935', '']
['2017-05-02', '2941', '2950', '2931', '2945', '28500', '2945', '']
['2017-05-08', '2973', '2987', '2961', '2985', '35700', '2985', '']
['2017-05-09', '2985', '2987', '2964', '2969', '27100', '2969', '']
['2017-05-10', '2965', '2996', '2965', '2990', '45600', '2990', '']
['2017-05-11', '2995', '3040', '2972', '3040', '69900', '3040', '']
['2017-05-12', '3050', '3070', '2974', '3010', '54000', '3010', '']
['2017-05-15', '3010', '3040', '2960', '3040', '48800', '3040', '']
['2017-05-16', '3050', '3065', '3025', '3060', '43500', '3060', '']
['2017-05-17', '3040', '3075', '3030', '3075', '46100', '3075', '']
['2017-05-18', '3040', '3085', '3020', '3085', '56400', '3085', '']
['2017-05-19', '3080', '3100', '3060', '3100', '40000', '3100', '']
['2017-05-22', '3105', '3145', '3100', '3145', '52200', '3145', '']
['2017-05-23', '3145', '3155', '3135', '3140', '44800', '3140', '']
['2017-05-24', '3150', '3175', '3150', '3175', '47500', '3175', '']
['2017-05-25', '3175', '3175', '3115', '3130', '23600', '3130', '']
['2017-05-26', '3120', '3120', '3075', '3080', '20700', '3080', '']
['2017-05-29', '3075', '3085', '3060', '3065', '15700', '3065', '']
['2017-05-30', '3055', '3065', '3005', '3025', '23100', '3025', '']
['2017-05-31', '3010', '3070', '3010', '3055', '28900', '3055', '']
['2017-06-01', '3070', '3075', '3045', '3055', '14100', '3055', '']
['2017-06-02', '3080', '3080', '3040', '3060', '32200', '3060', '']
['2017-06-05', '3035', '3075', '3035', '3065', '17000', '3065', '']
['2017-06-06', '3080', '3080', '3050', '3060', '22800', '3060', '']
['2017-06-07', '3060', '3070', '3040', '3050', '21500', '3050', '']
['2017-06-08', '3065', '3115', '3055', '3090', '47700', '3090', '']
['2017-06-09', '3090', '3090', '3045', '3055', '36800', '3055', '']
['2017-06-12', '3070', '3115', '3040', '3110', '30000', '3110', '']
['2017-06-13', '3095', '3130', '3090', '3110', '24700', '3110', '']
['2017-06-14', '3110', '3125', '3095', '3095', '20100', '3095', '']
['2017-06-15', '3095', '3130', '3090', '3110', '31300', '3110', '']
['2017-06-16', '3130', '3140', '3110', '3130', '25800', '3130', '']
['2017-06-19', '3125', '3175', '3120', '3150', '40700', '3150', '']
['2017-06-20', '3175', '3190', '3160', '3185', '50700', '3185', '']
['2017-06-21', '3185', '3215', '3175', '3205', '68000', '3205', '']
['2017-06-22', '3220', '3225', '3180', '3185', '30000', '3185', '']
['2017-06-23', '3160', '3160', '3110', '3125', '32300', '3125', '']
['2017-06-26', '3105', '3120', '3085', '3085', '16900', '3085', '']
['2017-06-27', '3080', '3115', '3050', '3110', '33100', '3110', '']
['2017-06-28', '3110', '3115', '3065', '3070', '17200', '3070', '']
['2017-06-29', '3080', '3080', '3050', '3060', '25100', '3060', '']
['2017-06-30', '3050', '3090', '3030', '3090', '33600', '3090', '']
['2017-07-03', '3105', '3125', '3095', '3125', '45300', '3125', '']
['2017-07-04', '3140', '3140', '3110', '3130', '39200', '3130', '']
['2017-07-05', '3110', '3135', '3105', '3130', '25400', '3130', '']
['2017-07-06', '3160', '3160', '3100', '3115', '40800', '3115', '']
['2017-07-07', '3125', '3130', '3085', '3110', '38700', '3110', '']
['2017-07-10', '3120', '3130', '3095', '3110', '19500', '3110', '']
['2017-07-11', '3120', '3140', '3100', '3140', '24700', '3140', '']
['2017-07-12', '3130', '3130', '3090', '3095', '17300', '3095', '']
['2017-07-13', '3105', '3110', '3090', '3090', '11600', '3090', '']
['2017-07-14', '3085', '3095', '3075', '3075', '12600', '3075', '']
['2017-07-18', '3060', '3080', '3050', '3060', '29600', '3060', '']
['2017-07-19', '3065', '3100', '3060', '3075', '22200', '3075', '']
['2017-07-20', '3090', '3105', '3070', '3105', '30800', '3105', '']
['2017-07-21', '3105', '3125', '3095', '3125', '17600', '3125', '']
['2017-07-24', '3130', '3130', '3105', '3125', '13900', '3125', '']
['2017-07-25', '3110', '3125', '3095', '3110', '14500', '3110', '']
['2017-07-26', '3105', '3120', '3085', '3100', '13600', '3100', '']
['2017-07-27', '3085', '3145', '3085', '3130', '32000', '3130', '']
['2017-07-28', '3130', '3130', '3110', '3125', '7900', '3125', '']
['2017-07-31', '3115', '3120', '3100', '3105', '11100', '3105', '']
['2017-08-01', '3110', '3125', '3090', '3120', '17200', '3120', '']
['2017-08-02', '3120', '3120', '3090', '3110', '12400', '3110', '']
['2017-08-03', '3095', '3115', '3090', '3115', '10900', '3115', '']
['2017-08-04', '3115', '3230', '3100', '3220', '106000', '3220', '']
['2017-08-07', '3250', '3280', '3170', '3270', '82800', '3270', '']
['2017-08-08', '3270', '3275', '3245', '3270', '36200', '3270', '']
['2017-08-09', '3265', '3265', '3210', '3235', '27000', '3235', '']
['2017-08-10', '3250', '3255', '3225', '3235', '23300', '3235', '']
['2017-08-14', '3220', '3230', '3180', '3210', '29100', '3210', '']
['2017-08-15', '3235', '3275', '3225', '3250', '37900', '3250', '']
['2017-08-16', '3280', '3370', '3275', '3350', '121900', '3350', '']
['2017-08-17', '3325', '3375', '3310', '3340', '58100', '3340', '']
['2017-08-18', '3300', '3335', '3290', '3330', '41000', '3330', '']
['2017-08-21', '3315', '3330', '3285', '3330', '31100', '3330', '']
['2017-08-22', '3295', '3320', '3285', '3290', '20800', '3290', '']
['2017-08-23', '3300', '3320', '3250', '3250', '37700', '3250', '']
['2017-08-24', '3280', '3285', '3255', '3280', '18400', '3280', '']
['2017-08-25', '3275', '3290', '3260', '3265', '19000', '3265', '']
['2017-08-28', '3265', '3310', '3265', '3310', '23400', '3310', '']
['2017-08-29', '3310', '3400', '3310', '3380', '47400', '3380', '']
['2017-08-30', '3400', '3400', '3360', '3385', '24700', '3385', '']
['2017-08-31', '3395', '3395', '3350', '3360', '29700', '3360', '']
['2017-09-01', '3355', '3375', '3325', '3360', '19100', '3360', '']
['2017-09-04', '3360', '3370', '3295', '3300', '25600', '3300', '']
['2017-09-05', '3300', '3300', '3240', '3240', '22300', '3240', '']
['2017-09-06', '3205', '3270', '3205', '3260', '19200', '3260', '']
['2017-09-07', '3265', '3280', '3250', '3255', '10800', '3255', '']
['2017-09-08', '3250', '3250', '3220', '3240', '18500', '3240', '']
['2017-09-11', '3245', '3280', '3230', '3240', '24800', '3240', '']
['2017-09-12', '3250', '3255', '3215', '3220', '21000', '3220', '']
['2017-09-13', '3225', '3245', '3220', '3235', '19500', '3235', '']
['2017-09-14', '3250', '3255', '3200', '3205', '26900', '3205', '']
['2017-09-15', '3200', '3340', '3200', '3335', '71700', '3335', '']
['2017-09-19', '3355', '3370', '3315', '3340', '29900', '3340', '']
['2017-09-20', '3340', '3340', '3285', '3295', '24700', '3295', '']
['2017-09-21', '3290', '3300', '3235', '3255', '34800', '3255', '']
['2017-09-22', '3260', '3280', '3215', '3220', '15400', '3220', '']
['2017-09-25', '3220', '3240', '3215', '3240', '14800', '3240', '']
['2017-09-26', '3250', '3275', '3240', '3275', '16500', '3275', '']
['2017-09-27', '3275', '3305', '3275', '3295', '9700', '3295', '']
['2017-09-28', '3300', '3300', '3250', '3265', '14200', '3265', '']
['2017-09-29', '3300', '3345', '3295', '3340', '36500', '3340', '']
['2017-10-02', '3370', '3415', '3335', '3400', '49000', '3400', '']
['2017-10-03', '3415', '3500', '3405', '3480', '83700', '3480', '']
['2017-10-04', '3490', '3510', '3430', '3510', '61600', '3510', '']
['2017-10-05', '3520', '3625', '3495', '3590', '107600', '3590', '']
['2017-10-06', '3585', '3615', '3510', '3605', '78100', '3605', '']
['2017-10-10', '3600', '3620', '3560', '3575', '46000', '3575', '']
['2017-10-11', '3565', '3665', '3530', '3645', '81700', '3645', '']
['2017-10-12', '3645', '3645', '3585', '3585', '33400', '3585', '']
['2017-10-13', '3585', '3595', '3555', '3570', '34800', '3570', '']
['2017-10-16', '3570', '3685', '3560', '3650', '63800', '3650', '']
['2017-10-17', '3650', '3715', '3605', '3695', '68800', '3695', '']
['2017-10-18', '3705', '3715', '3645', '3665', '26400', '3665', '']
['2017-10-19', '3645', '3675', '3605', '3660', '57800', '3660', '']
['2017-10-20', '3615', '3675', '3600', '3675', '51600', '3675', '']
['2017-10-23', '3680', '3710', '3620', '3635', '51700', '3635', '']
['2017-10-24', '3620', '3650', '3605', '3630', '32700', '3630', '']
['2017-10-25', '3610', '3635', '3590', '3600', '38400', '3600', '']
['2017-10-26', '3565', '3620', '3540', '3560', '45700', '3560', '']
['2017-10-27', '3560', '3605', '3560', '3600', '39800', '3600', '']
['2017-10-30', '3620', '3675', '3585', '3675', '78100', '3675', '']
['2017-10-31', '3675', '3685', '3645', '3665', '33800', '3665', '']
['2017-11-01', '3670', '3705', '3620', '3695', '86800', '3695', '']
['2017-11-02', '3675', '3700', '3620', '3700', '70200', '3700', '']
['2017-11-06', '3655', '3900', '3655', '3850', '142800', '3850', '']
['2017-11-07', '3810', '3810', '3690', '3710', '93900', '3710', '']
['2017-11-08', '3705', '3705', '3610', '3625', '96000', '3625', '']
['2017-11-09', '3635', '3680', '3610', '3640', '88900', '3640', '']
['2017-11-10', '3600', '3630', '3590', '3620', '35800', '3620', '']
['2017-11-13', '3600', '3610', '3590', '3605', '22200', '3605', '']
['2017-11-15', '3535', '3570', '3515', '3545', '47700', '3545', '']
['2017-11-16', '3550', '3705', '3550', '3675', '70100', '3675', '']
['2017-11-17', '3650', '3685', '3635', '3670', '40200', '3670', '']
['2017-11-20', '3695', '3735', '3680', '3735', '38100', '3735', '']
['2017-11-21', '3740', '3740', '3690', '3690', '25100', '3690', '']
['2017-11-22', '3695', '3695', '3645', '3645', '23900', '3645', '']
['2017-11-24', '3650', '3685', '3635', '3685', '19500', '3685', '']
['2017-11-27', '3685', '3690', '3630', '3635', '24900', '3635', '']
['2017-11-28', '3635', '3695', '3610', '3690', '33100', '3690', '']
['2017-11-29', '3695', '3820', '3690', '3790', '68900', '3790', '']
['2017-11-30', '3770', '3880', '3765', '3850', '50400', '3850', '']
['2017-12-01', '3870', '3885', '3815', '3815', '42100', '3815', '']
['2017-12-04', '3825', '3935', '3815', '3885', '63800', '3885', '']
['2017-12-05', '3885', '3885', '3835', '3860', '23400', '3860', '']
['2017-12-06', '3865', '3945', '3860', '3920', '72700', '3920', '']
['2017-12-07', '3880', '3970', '3880', '3940', '54600', '3940', '']
['2017-12-08', '3885', '4020', '3885', '3995', '79900', '3995', '']
['2017-12-11', '4020', '4050', '3945', '3975', '28300', '3975', '']
['2017-12-12', '3975', '4025', '3950', '4010', '46900', '4010', '']
['2017-12-13', '4020', '4020', '3945', '3970', '37300', '3970', '']
['2017-12-14', '3960', '3990', '3950', '3985', '33400', '3985', '']
['2017-12-15', '3985', '3985', '3960', '3970', '23300', '3970', '']
['2017-12-18', '3990', '4035', '3975', '4025', '24700', '4025', '']
['2017-12-19', '4040', '4070', '3995', '4065', '36100', '4065', '']
['2017-12-20', '4040', '4165', '4010', '4130', '59400', '4130', '']
['2017-12-21', '4100', '4185', '4090', '4175', '44200', '4175', '']
['2017-12-22', '4190', '4220', '4165', '4175', '30000', '4175', '']
['2017-12-25', '4220', '4295', '4215', '4275', '53400', '4275', '']
['2017-12-26', '4300', '4415', '4300', '4345', '75200', '4345', '']
['2017-12-27', '4385', '4400', '4250', '4270', '58200', '4270', '']
['2017-12-28', '4270', '4325', '4230', '4310', '58100', '4310', '']
['2017-12-29', '4310', '4315', '4280', '4295', '16400', '4295', '']

こんな感じでデータを取り出せました。TRtagを一つずつ見て、ゴミを除去し、/tdタグでsplitし、リストへスタックしているだけです。

2. データの可視化 (2017年)

それでは、データを可視化してみます。このため、リストにappendされたデータをnumpyに渡してみます。なお、ValueDatはstr型なので、int型にキャストしています。

In [10]:
import numpy as np
ValueDatNumpy2017 = np.zeros([len(ValueDat2017), 6])
for i in range(0, len(ValueDat2017)):
    for j in range(0, 6):
        ValueDatNumpy2017[i, j] = int(ValueDat2017[i][j+1])

これで、numpyのデータとして扱うことができます。また、int型にキャストしたので、統計や機械学習にもかけやすいデータ構造に変化しました。今回は、plot関数で可視化してみます。

In [12]:
import matplotlib.pyplot as plt

leg = ["Opening price", "High price", "Low price", "Closing price", "Stock trading volume", "Adj.Close"]
col = ["r", "g", "b", "k", "m", "c"]

fig = plt.figure(figsize=(5, 15)) # <-  描画サイズ
for i in range(0, len(leg)):
    plt.subplot(len(leg),1,i+1)
    plt.plot(ValueDatNumpy2017[:,i], color=col[i], label=leg[i])
    plt.xlabel("day")
    plt.ylabel("Value")
    plt.legend()

plt.show()

こんな感じで、グラフが可視化できました。銘柄コード1301、2017年度の株価は、値上がりし続ける株であることがわかりました。

3. 今後の方針

Webに転がっている株価データを取得する方法について説明しました。とはいえこれだけではつまらないので、何か改造を検討しましょう。

  • 株価チャートから特徴を取り出したい場合 - > 信号処理編
  • 上昇下降の予測を行いたい場合 - > 機械学習編
  • webサービス化したい場合 -> Webアプリケーション開発編