この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
広告
posted by fanblog
2020年08月19日
【Pythonで株価予測 (3)】株式分割・併合データの適用
株価予測プログラムの続きです。 株価予測プログラム(1)
でProphetに株価を渡しますが、持っているデータが分割・併合の修正がされていないものでした。例えばNTTドコモ(9437)ですと、そのままプロットすると以下のようになります。
NTTドコモは2013年9月26日から1:100の分割がされています。
これでは予測ができませんので修正を施します。株価の分割・併合データの取得は 株価予測プログラム(2) 株式分割・併合情報データの作成 で作成したものです。これを読み込み、必要な株価コードの部分を探して分割前の日までを分割(この場合は100)で割ります。
これでプロットした図は次のようになります。
うまくいきましたので、これで予測に適用できそうです。ここしばらくは長期的に株価が上がっていますね。
↓こちらの本を参照しています。SciPy, NumPy, Pandasなど、一通りの照会がなされていて便利です。
NTTドコモは2013年9月26日から1:100の分割がされています。
これでは予測ができませんので修正を施します。株価の分割・併合データの取得は 株価予測プログラム(2) 株式分割・併合情報データの作成 で作成したものです。これを読み込み、必要な株価コードの部分を探して分割前の日までを分割(この場合は100)で割ります。
import sys
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
# 分割・併合データの読み込み
bunkatsu_data = pd.read_csv( 'bunkatsu.dat' , sep= ' ' , names=[ 'code' , 'ds' , 'ratio' ])
bunkatsu_data[ 'ds' ] = bunkatsu_data[ 'ds' ].str.replace( '/' , '-' )
# 株価の読み取り
code = 9437 # 株価コード
str_code = str(code)
filename = str_code + '_1'
read_data = pd.read_csv(filename, sep= ' ' , \
names=[ 'ds' , 'hajime' , 'takane' , 'yasune' , 'y' , 'dekidaka' , 'NaN' ])
analysis_data = read_data.loc[:, [ 'y' , 'ds' ]]
analysis_data[ 'ds' ] = analysis_data[ 'ds' ].str.replace( '/' , '-' )
# 株価コードの分割データのみ取り出す
bunkatsu_data = bunkatsu_data[bunkatsu_data[ 'code' ] == code].reset_index(drop=True)
# 分割データの適用
for i in range(len(bunkatsu_data)):
date = [int(s) for s in bunkatsu_data.at[i, 'ds' ].split( '-' )] # 分割日
analysis_data.loc[pd.to_datetime(analysis_data[ 'ds' ]) <= dt.datetime(date[0], date[1], date[2]), 'y' ] \
= analysis_data[ 'y' ] / bunkatsu_data.at[i, 'ratio' ]
# プロット
x = pd.to_datetime(analysis_data[ 'ds' ])
fig = plt.figure(figsize=(20,5))
plt.plot(x, analysis_data[ 'y' ][:],label= 'with split (' +str_code+ ')' )
plt.legend()
plt.show()
fig.savefig(str_code + '.png' )
これでプロットした図は次のようになります。
うまくいきましたので、これで予測に適用できそうです。ここしばらくは長期的に株価が上がっていますね。
↓こちらの本を参照しています。SciPy, NumPy, Pandasなど、一通りの照会がなされていて便利です。
科学技術計算のためのPython入門ーー開発基礎,必須ライブラリ,高速化【電子書籍】[ 中久喜健司 ]
価格: 3,520円
(2020/8/19 09:34時点)
感想(0件)
2020年08月15日
【Pythonで株価予測 (2)】株式分割・併合情報データの作成
つくり始めた株価予想プログラム
で、私の持っている株価データは株式分割・併合が考慮されたものではありません。そこで、株式分割・併合のデータ作成のプログラムをつくります。
株式分割・併合のデータはカブドット・コムによいのがありました。(リンクは付けませんが、「株式分割 カブドットコム」とかで検索できます)
データ自体はJavascriptが走ってテーブルを作成するようですので、Pythonのrequestsではデータがとれませんでした。seleniumでソースを取得したいと思います。
tableタグのtbody内がデータですので、そこの各行からデータを取得します。分割は 1:3 のような形の場合は 3/1 = 3 というデータにしておきます。
あとは、併合も同様にして作っておけばよいですね。5株→1株なら0.2というデータになります。
処理時に上記ファイルを読み込んで、分割適用前までを分割数で割ればよいことになります。
株価予測プログラム(2)
株式分割・併合のデータはカブドット・コムによいのがありました。(リンクは付けませんが、「株式分割 カブドットコム」とかで検索できます)
データ自体はJavascriptが走ってテーブルを作成するようですので、Pythonのrequestsではデータがとれませんでした。seleniumでソースを取得したいと思います。
#!/usr/bin/python3
import sys
from selenium import webdriver
from bs4 import BeautifulSoup
import requests
options = webdriver.ChromeOptions()
options.add_argument( '--headless' )
browser = webdriver.Chrome(options = options)
browser.get( '上記、カブコムのURL' )
http_src = browser.page_source
browser.quit()
tableタグのtbody内がデータですので、そこの各行からデータを取得します。分割は 1:3 のような形の場合は 3/1 = 3 というデータにしておきます。
rows = soup.find( 'tbody' ).find_all( 'tr' )
f = open( 'bunkatsu.dat' , mode = 'w' )
for row in rows:
cols = row.find_all( 'td' )
f.write(cols[1].text + ' ' ) # コード
f.write(cols[4].text + ' ' ) # 分割適用前の最終日
bunkatsu_data = cols[3].text.split( ':' )
f.write(str( float(bunkatsu_data[1])/float(bunkatsu_data[0]) ) + '\n' ) # 分割比
f.close()
あとは、併合も同様にして作っておけばよいですね。5株→1株なら0.2というデータになります。
処理時に上記ファイルを読み込んで、分割適用前までを分割数で割ればよいことになります。
価格: 4,070円
(2020/8/15 11:10時点)
感想(2件)
株価予測プログラム(2)
2020年08月11日
【Pythonで株価予測 (1)】Pythonの勉強がてら、株価予測プログラムを作ってみる
pythonは全く使っていませんが、さすがにそろそろ覚えないと色々と不都合が生じてきました。
そこで、pythonの勉強がてら、株価予想のプログラムを作ってみます。というか、色々なウェブサイトから引っ張ってきて、貼り付けているだけですが。
時系列予想のライブラリとしては、Prophetを使います。
持っているデータはこんな感じ。綜合警備保障(2331)です。
左から、日付、始値、高値、安値、終値、出来高です。最後に空白がはいっているため、pandasで読み込んだ際、NaNの列が出来てしまいます。使うのは日付と終値だけです。
うーん、予想できているのか、いないのか。8月中はパッとしないが、9月から上がるのかな。
自分で作っているデータは出来高0の日は終値が0となっていたり(そんな銘柄は無視してもよいかとも思いますが)、株式分割・併合で不連続が生じてしまっていますので、それを修正する処理を今後加えたいと思います。
そこで、pythonの勉強がてら、株価予想のプログラムを作ってみます。というか、色々なウェブサイトから引っ張ってきて、貼り付けているだけですが。
時系列予想のライブラリとしては、Prophetを使います。
持っているデータはこんな感じ。綜合警備保障(2331)です。
2006/1/4 1810 1822 1806 1815 74000
2006/1/5 1830 1834 1810 1815 314000
2006/1/6 1845 1859 1835 1847 317900
:
2020/8/5 5010 5040 4970 5020 171600
2020/8/6 4970 5010 4940 4960 160600
2020/8/7 4975 5050 4975 5010 119500
左から、日付、始値、高値、安値、終値、出来高です。最後に空白がはいっているため、pandasで読み込んだ際、NaNの列が出来てしまいます。使うのは日付と終値だけです。
import os
import sys
import pandas as pd
from fbprophet import Prophet
import matplotlib.pyplot as plt
code = str(2331)
read_data = pd.read_csv( 'data/' +code, sep= ' ' , \
names=[ 'ds' , 'hajime' , 'takane' , 'yasune' , 'y' , 'dekidaka' , 'NaN' ])
# 直近500日ぐらいのデータを使用する
analysis_data = read_data.loc[:, [ 'y' , 'ds' ]].iloc[-500:, :].reset_index()
analysis_data[ 'ds' = analysis_data[ 'ds' ].str.replace( '/' , '-' )
Maximum_value = analysis_data[ 'y' ].max()
analysis_data[ 'cap' ] = Maximum_value
model = Prophet(growth= 'logistic' )
model.fit(analysis_data)
future = model.make_future_dataframe(periods=60, freq = 'd' )
future[ 'cap' ] = Maximum_value
future = future[ future[ 'ds' ].dt.weekday < 5 ]
forecast = model.predict(future)
# 図を作成
fig = plt.figure(figsize=(20,5))
plt.plot(forecast[ 'yhat' ][:],label= 'Prediction (' +code+ ')' )
plt.plot(analysis_data[ 'y' ][:],label= 'True (' +code+ ')' )
plt.legend()
fig.savefig(code + '.png' )
# 直近30日の平均株価に対し、予想値の上昇率を計算
Mean = analysis_data[ 'y' ].iloc[-30:].mean()
Fct_value = forecast[ 'yhat' ].iat[-1]
Rate = (Fct_value - Mean)/Mean*100
output_string = code+ ': ' \
+str(int(Mean))+ ' -> ' + str(int(Fct_value)) + ' (' + str(int(Rate)) + '%)'
if Rate > 10.0:
print( '!!! ' , output_string)
elif Rate > 5.0:
print( '!! ' , output_string)
else:
print(output_string)
うーん、予想できているのか、いないのか。8月中はパッとしないが、9月から上がるのかな。
自分で作っているデータは出来高0の日は終値が0となっていたり(そんな銘柄は無視してもよいかとも思いますが)、株式分割・併合で不連続が生じてしまっていますので、それを修正する処理を今後加えたいと思います。