アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2020年08月19日

【Pythonで株価予測 (3)】株式分割・併合データの適用

株価予測プログラムの続きです。株価予測プログラム(1)でProphetに株価を渡しますが、持っているデータが分割・併合の修正がされていないものでした。例えばNTTドコモ(9437)ですと、そのままプロットすると以下のようになります。
9437_old.png
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')

これでプロットした図は次のようになります。
9437.png
うまくいきましたので、これで予測に適用できそうです。ここしばらくは長期的に株価が上がっていますね。

↓こちらの本を参照しています。SciPy, NumPy, Pandasなど、一通りの照会がなされていて便利です。

科学技術計算のためのPython入門ーー開発基礎,必須ライブラリ,高速化【電子書籍】[ 中久喜健司 ]

価格:3,520円
(2020/8/19 09:34時点)
感想(0件)



2020年08月15日

【Pythonで株価予測 (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というデータになります。

処理時に上記ファイルを読み込んで、分割適用前までを分割数で割ればよいことになります。





入門Python3 [ ビル・ルバノビック ]

価格:4,070円
(2020/8/15 11:10時点)
感想(2件)


株価予測プログラム(2)

2020年08月11日

【Pythonで株価予測 (1)】Pythonの勉強がてら、株価予測プログラムを作ってみる

pythonは全く使っていませんが、さすがにそろそろ覚えないと色々と不都合が生じてきました。
そこで、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 pandasas pd
from fbprophet import Prophet
import matplotlib.pyplotas 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)

2331.png
うーん、予想できているのか、いないのか。8月中はパッとしないが、9月から上がるのかな。

自分で作っているデータは出来高0の日は終値が0となっていたり(そんな銘柄は無視してもよいかとも思いますが)、株式分割・併合で不連続が生じてしまっていますので、それを修正する処理を今後加えたいと思います。











ファン
検索
<< 2024年11月 >>
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
最新記事
写真ギャラリー
最新コメント
タグクラウド
カテゴリーアーカイブ
プロフィール
2日ぼうずさんの画像
2日ぼうず
プロフィール
日別アーカイブ
×

この広告は30日以上新しい記事の更新がないブログに表示されております。