Help us understand the problem. What is going on with this article?

pythonを使った株価の自動収集

はじめに

最近、株価を予想するAIを作って欲しいということで、全くいい精度がでる期待もなかったが作ることにした。

過去にkerasやtensorflowを使ってAIを作ったことがあったが、株価を集めることはしたことがなかったのでやり方をまとめておく。

ビックデータを使いこなすにはスクレイピングやAPIの扱いになれなくてはと思ったりおもってみたり。

Quandl

流石に手動では絶命するので自動で収集する方法がないかと調べていたら、Quandlをみつけた。
銘柄コードを指定してAPIのURLにアクセスすればCSVでダウンロードできる。

会員登録

まずはここから会員登録をして、API keyをもらう必要がある。

ライブラリ経由で取得

$pip3 install quandl

使用方法

株価取得

データの取得は、quandl.get()でできる。引数は銘柄コードのみでOK。
TSEは株式会社東京証券取引所らしい。

import quandl
import pandas as pd
import  matplotlib.pyplot as plt

# SONYの株価を取得
brand = "TSE/6758"
# quandlに登録して得られたAPI keyを指定する。
quandl.ApiConfig.api_key = 'your API key'
# 株価の取得
quandl_data = quandl.get(dataset=brand, returns='pandas')
# CSVへ保存
quandl_data.to_csv('stock_price_data.csv')

取得したデータの中身をちらっとみてみると、こんな感じ。
2007-01-04から2017-12-22までの始値(Open)、高値(High)、安値(Low)、終値(Close)、出来高(Volume)が取得できた。

Date Open High Low Close Volume
2007-01-04 5140 5240 5120 5190 3682300
2007-01-05 5200 5280 5180 5210 8322200
2007-01-09 5400 5630 5390 5550 22357200
2007-01-10 5440 5470 5400 5440 12788100
2007-01-11 5450 5470 5380 5430 5196400

移動平均の計算

せっかくなので終値の30日移動平均も計算。windowを変えてやることで任意の移動平均を計算することができる。

## 移動平均を計算
quandl_data['30MA'] = quandl_data['Close'].rolling(window = 30, min_periods=0).mean()

グラフに表示

fig = plt.figure()
axes = fig.add_axes([0.1, 0.1, 0.8, 0.8])
axes.plot(quandl_data['Close'], 'black', lw = 1,label="close")
axes.plot(quandl_data['30MA'],label="30MA")
axes.set_xlabel('Time')
axes.set_ylabel('Price')
axes.set_title(brand)
axes.legend()
plt.savefig('stock_price_data.png')
plt.pause(0.001)

実行してみるとこんな感じ。
stock_price_data.png

複数の銘柄から株価を取得

株価の学習をする上で、一つの銘柄より複数の銘柄で学習するのもいいのでは?と思いました。
ということで、複数の銘柄を一度に取得する方法も記載。

銘柄code listを作成

前もって銘柄code list(code.csv)を作成しておきます。
主要な銘柄である日経225から10件だけを対象にします。

code brand company name Industry Deemed face amount
4151 協和キリン 協和発酵キリン(株) 医薬品 50
4502 武田 武田薬品工業(株) 医薬品 50
4503 アステラス アステラス製薬(株) 医薬品 10
4506 大日本住友 大日本住友製薬(株) 医薬品 50
4507 塩野義 塩野義製薬(株) 医薬品 50
4519 中外薬 中外製薬(株) 医薬品 50
4523 エーザイ エーザイ(株) 医薬品 50
4568 第一三共 第一三共(株) 医薬品 50
4578 大塚HD 大塚ホールディングス(株) 医薬品 50
3105 日清紡HD 日清紡ホールディングス(株) 電気機器 50

株価取得

# get data
print('Getting stock price...')
import quandl
import pandas as pd
import  matplotlib.pyplot as plt
quandl.ApiConfig.api_key = 'your API key'
# 銘柄codeをcsvから読み出し
code = pd.read_csv('code.csv')
# DataFrameからのDataをlist型かつ文字列として変換
code = ["TSE/"+str(n) for n in code['code'].values.tolist()]
# 複数銘柄の株価取得
quandl_data = quandl.get(dataset=code, returns='pandas')
# quandl_dataのcolumnsにあるstr(文字列)でCloseが含まれているcolumnsのみを抽出します。
quandl_data = quandl_data.loc[:,(quandl_data.columns.str.contains('Close'))]
# 銘柄ごとに終値の移動平均を算出
for  k in range(len(code)):
    quandl_data[code[k] + '_30MA'] = quandl_data.rolling(window = 30, min_periods=0).mean().iloc[:,k]
quandl_data.to_csv('dataset.csv')

取得したデータを確認するとこんな感じ。
TSE/4578はなかったようです。

Date TSE/4151 - Close TSE/4502 - Close TSE/4503 - Close TSE/4506 - Close TSE/4507 - Close TSE/4519 - Close TSE/4523 - Close TSE/4568 - Close TSE/4578 - Close TSE/3105 - Close TSE/4151_30MA TSE/4502_30MA TSE/4503_30MA TSE/4506_30MA TSE/4507_30MA TSE/4519_30MA TSE/4523_30MA TSE/4568_30MA TSE/4578_30MA TSE/3105_30MA
2007-01-04 1026 8180 5420 1382 2335 2470 6530 3820 1239 1026 8180 5420 1382 2335 2470 6530 3820 1239
2007-01-05 1004 8010 5270 1387 2300 2445 6420 3720 1231 1015 8095 5345 1384.5 2317.5 2457.5 6475 3770 1235
2007-01-09 1009 7950 5290 1401 2345 2470 6460 3710 1243 1013 8046.66666666667 5326.66666666667 1390 2326.66666666667 2461.66666666667 6470 3750 1237.66666666667
2007-01-10 1001 7760 5230 1377 2285 2430 6340 3570 1229 1010 7975 5302.5 1386.75 2316.25 2453.75 6437.5 3705 1235.5
2007-01-11 988 7760 5190 1372 2230 2395 6270 3550 1239 1005.6 7932 5280 1383.8 2299 2442 6404 3674 1236.2

まとめ

今回は、pythonを使って株価を自動収集した。
AIの学習には大量のデータが必要であるが手作業であつめるとなると大変。
この自動収集のやり方は、FXでも適応できますのでぜひ試してください。
AIもすでに作成して精度評価しているのでもしかしたら投稿するかも??
1銘柄のデータセットと255銘柄のデータセットどちらを使うと精度がよくなるとか、AI学習前の前処理の仕方とか、どうすれば勝率があがるかなどなど。
ちなみに、移動平均の予測値は1銘柄2007~2017年のデータセットでAccuracy84~85%、誤差16円。
工夫することで勝率96%、儲からないという検出力96%まで向上させることができた。
詳しくはAI(Deep Learning)作成編で。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした