今回は株価のデータを用いて
株の売買シミュレーションを
行ってみたいと思います。
解説動画はこちら
株の鉄則をそのまま考えてみたいと思います。
まずは日経平均の株価の
データを見てみることとします。
ここから先のコード群は
Google Colabで試すことのできる
コードになっているので
試したい方はコピペしてどうぞ。
直接pandasのデータフレームに取り込むか
データをダウンロードしてから
データフレームに取り込むコードです。
まずはライブラリをインポート
データの読み込みは次のコードです
データが「日付、時間、始値、高値、安値、終値」
となっていてヘッダーが無いので英名を付けておきます。

次にこのデータには不整合があるようなので
前処理することにします。

これで不整合を取り除いて、データも綺麗にしました。
次に、安い時 or 高い時を探りたいので
朝9時の価格を基準にして終値を取得します。
日単位で終値を取りました。
集計してみましょう。

これだと数字だけなので
よく分からないですよね。
数値だけだと分かりづらいので
グラフ化しましょう。
箱髭図にしてみます。

次に時間帯ごとに集計をしてみることとします。
平均、中央値を出してみます。

これで見ると
平均的に上がっている or 下がっている
中央値でも上がっている or 下がっている
と言うのが分かります。
朝9時に売って
両方ともが下がっている時間帯に買い戻せば
その差額分儲けられるのではと
仮説を立てました。
時間帯ごとに9時の終値から
上がったのか下がったのかの回数も
見てみることにしましょう。

これで見ると9:20は終値が9:00時点よりも
下がっている回数が多いことが分かります。
平均値や中央値も下がっていましたね。
ということで9時に売って9:20に買い戻すというのを
シミュレーションしてみたいと思います。
これをコードにしてみると

さてシミュレーションの結果は
どうなったでしょうか?
売買シミュレーションの結果は??????
そもそもの株価の動きは
どうだったのでしょうか???
結果としては2020年は年初からコロナの影響で
ガツっと下がり、その後は上がり続けています。
売って買い戻すというルールなので
値が下がった方が良くなるのですが
値が上がってもいる状況でも
そこまで酷い成績にならない結果となりました。
この結果は2020年だけなので
なんとも言えないものですが
こう言うルールを検証していけば
自動売買で適応出来るルールが
発見できるかもしれません。
そうしたらシステム化して
ほっぽって置こうかなと
思っています。
今回は株価のデータを使った
売買シミュレーションついて
お送りしました。
それでは。
株の売買シミュレーションを
行ってみたいと思います。
解説動画はこちら
自動売買で儲けられるルールを探したい!!!
ということで、株価データを見て
適当なルールを作って売買シミュレーションを
行ってみたいと思います。
こちらのデータを参考にしています。
適当なルールを作って売買シミュレーションを
行ってみたいと思います。
こちらのデータを参考にしています。
今回やりたい事としては
高い時に売って安い時に買う
or
安い時に買って高い時に売る
or
安い時に買って高い時に売る
株の鉄則をそのまま考えてみたいと思います。
まずは日経平均の株価の
データを見てみることとします。
ここから先のコード群は
Google Colabで試すことのできる
コードになっているので
試したい方はコピペしてどうぞ。
直接pandasのデータフレームに取り込むか
データをダウンロードしてから
データフレームに取り込むコードです。
まずはライブラリをインポート
import pandas as pd
import numpy as np
import warnings
warnings.simplefilter('ignore')
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
データの読み込みは次のコードです
データが「日付、時間、始値、高値、安値、終値」
となっていてヘッダーが無いので英名を付けておきます。
# 直接読み込む場合
df = pd.read_csv('https://atmtech.net/main/n225/Y2020-all.csv',header=None,names=['day','time','open','high','row','close'])
# 手元にダウンロードしてから行う場合
df = pd.read_csv('Y2020-all.csv',header=None,names=['day','time','open','high','row','close'])
# プレビュー
df.head()
次にこのデータには不整合があるようなので
前処理することにします。
df['time'] = df['time'].str.replace('0.395833333','9:30:00')
def time_sep(d):
l = d['time'].split(':')
return '{0:02}:{1:02}:{2:02}'.format(int(l[0]),int(l[1]),int(l[2]))
def day_sep(d):
l = d['day'].split('/')
return '{0}-{1:02}-{2:02}'.format(int(l[0]),int(l[1]),int(l[2]))
df['time'] = df.apply(time_sep,axis=1)
df['day'] = df.apply(day_sep,axis=1)
df.head()

これで不整合を取り除いて、データも綺麗にしました。
次に、安い時 or 高い時を探りたいので
朝9時の価格を基準にして終値を取得します。
df_9 = df[df['time']=='09:00:00'][['day','close']] df_9 = df_9.reset_index(drop=True) df_9.columns = ['day','stand'] df_9.head()
日単位で終値を取りました。
集計してみましょう。
# 集計してみる pd.pivot_table(merge_df,index='day', columns='time', values='rate')

これだと数字だけなので
よく分からないですよね。
数値だけだと分かりづらいので
グラフ化しましょう。
箱髭図にしてみます。
# 箱髭図を作ってみる fig = plt.figure(figsize=(16,10)) ax = fig.add_subplot(1, 1, 1) sns.boxplot(x='time', y='rate', data=merge_df, ax=ax) plt.xticks(rotation=90) plt.show()

次に時間帯ごとに集計をしてみることとします。
平均、中央値を出してみます。
# 時間帯ごとに集計する calc_df = merge_df[['time','rate']][merge_df['time']!='00:00:00'].groupby(['time']).agg([np.mean,np.median,np.std]) calc_df.columns = ['mean','median','std'] calc_df.head()折れ線グラフにしてみましょう。
# 折れ線グラフにしてみる plt.figure(figsize=(16,10)) plt.plot([1 for i in range(len(calc_df['mean']))]) plt.plot(calc_df['mean'],color='red',label="mean") plt.plot(calc_df['median'],color='green',label="median") plt.xticks(rotation=90) plt.legend(fontsize=20) plt.show()

これで見ると
平均的に上がっている or 下がっている
中央値でも上がっている or 下がっている
と言うのが分かります。
朝9時に売って
両方ともが下がっている時間帯に買い戻せば
その差額分儲けられるのではと
仮説を立てました。
時間帯ごとに9時の終値から
上がったのか下がったのかの回数も
見てみることにしましょう。
# 価格差でフラグ値を付ける merge_df['flg'] = merge_df['rate'] >=1 calc2_df = pd.crosstab(merge_df['time'], merge_df['flg']) calc2_df.columns = ['down','up'] calc2_df = calc2_df.reset_index() calc2_df = calc2_df[calc2_df['time']!='09:00:00'] calc2_df = calc2_df[calc2_df['time']!='00:00:00'] merge_df.head()
# 100%棒グラフを作る
plt.figure(figsize=(16,6))
plt.plot([121 for i in range(len(calc_df['mean']))])
height1 = np.array(calc2_df['down'])
height2 = np.array(calc2_df['up'])
p1 = plt.bar(calc2_df['time'], height1, color="red")
p2 = plt.bar(calc2_df['time'], height2, bottom=height1, color="green")
plt.xticks(rotation=90)
plt.legend((p2[0], p1[0]), ("UP","DOWN"))
plt.show()

これで見ると9:20は終値が9:00時点よりも
下がっている回数が多いことが分かります。
平均値や中央値も下がっていましたね。
ということで9時に売って9:20に買い戻すというのを
シミュレーションしてみたいと思います。
売買ルール
資金は1000万円
朝9:00に売って、9:20に買い戻す
売れる株分だけ売って、その分を買い戻す
これをコードにしてみると
money = 10000000
sel_close , buy_close = 0,0
sel_value , buy_value = 0,0
result , quantity = 0,0
result_df = pd.DataFrame()
for row in merge_df[(merge_df['time']=='09:00:00')|(merge_df['time']=='09:20:00')].iterrows():
data = row[1]
date = data[0]
times = data[1]
close = data[5]
if times=='09:00:00':
sel_close = close
quantity = money//sel_close
sel_value = quantity * sel_close
elif times=='09:20:00':
buy_close = close
buy_value = quantity * buy_close
result = (sel_value - buy_value)
money = money + (sel_value - buy_value)
tmp_df = pd.DataFrame([[date,sel_close,buy_close,sel_value,buy_value,result,money]],
columns=['date','sel_close','buy_close','sel_value','buy_value','result','money'])
result_df = pd.concat([result_df,tmp_df])
result_df = result_df.reset_index(drop=True)
result_df.head()

さてシミュレーションの結果は
どうなったでしょうか?
売買シミュレーションの結果は??????
plt.figure(figsize=(16,3)) plt.plot(result_df['money'],color='red') plt.show()

そもそもの株価の動きは
どうだったのでしょうか???
plot_df = df[df['time']=='09:00:00'] plot_df = plot_df.reset_index(drop=True) plt.figure(figsize=(16,3)) plt.plot(plot_df['close'],color='blue') plt.show()

結果としては2020年は年初からコロナの影響で
ガツっと下がり、その後は上がり続けています。
売って買い戻すというルールなので
値が下がった方が良くなるのですが
値が上がってもいる状況でも
そこまで酷い成績にならない結果となりました。
この結果は2020年だけなので
なんとも言えないものですが
こう言うルールを検証していけば
自動売買で適応出来るルールが
発見できるかもしれません。
そうしたらシステム化して
ほっぽって置こうかなと
思っています。
今回は株価のデータを使った
売買シミュレーションついて
お送りしました。
それでは。

コメントする