はじめに
今回ラクスの株価を使用して仮説検定を行いました。
ラクスはさまざまなクラウドサービスを開発・運用している会社になります。株価もチャートを見てみると右肩上がりになっていました。今回はそんなラクスの株価を使用して仮説検定を行ってみたいと思います。
仮説
今回「株価が前日に下落した時、当日の株価は上がりやすい」という仮説を立て検証していきたいと思います。
なぜこのような仮説を立てたのかというと、株は安いときに買い、高いときに売るというのが儲かる法則の一つであります。この法則にもとづき前日に株価が下がったときは、当日買いが増え株価が上がり、逆に前日に株価が上がったときは当日売りが増え株価が下がると考えたため、このような仮説を立てました。
帰無仮説
続いて仮説を検証していくために、帰無仮説を、「前日の株価の上昇もしくは下落は当日の株価の増減率に影響を与えない」とします。
もっと砕けた言葉でいうと「前日の株価が上昇したグループと前日の株価が下落したグループの当日の株価増減率の平均は同じである」というのが帰無仮説になります。有意水準5%で検定していきたいと思います。
この帰無仮説が棄却されれば、仮説が成り立つということになります。
データ
今回使用しているデータは2019年1月~2020年10月までのラクスの株価データになります。
データ元→https://kabuoji3.com/stock/
df_2019 = pd.read_csv("3923_2019.csv" ,header=1, encoding="shift-jis")
df_2019 = df_2019.drop("終値調整値" , axis=1)
df_2020 = pd.read_csv("3923_2020.csv" ,header=1, encoding="shift-jis")
df_2020 = df_2020.drop("終値調整値" , axis=1)
df = pd.concat([df_2019, df_2020],ignore_index = True)
df.head()
データの生成
分析するにあたって、必要なデータの生成を行っていきたいと思います。
・当日株価が上昇したか下落したかのフラグを作成(上昇→1、下落→0)
df["Rise or fall"] = [ 1 if df["終値"][i] - df["始値"][i] >= 0 else 0 for i in range(len(df))]
・当日の株価上昇率の算出
株価増減率=(当日の終値 - 当日の始値)÷ 当日の始値
df["rate"] = (df['終値'] - df['始値']) / df['始値']
・前日に上昇したか下落したかのフラグ
df["before rise or fall"] = df['Rise or fall'].shift(1)
・これを前日に株価が下落したグループと前日に株価が上昇したグループに分けます。
df_rise = df[df["before rise or fall"] == 1]
df_fall = df[df["before rise or fall"] == 0]
df_riseに入っているデータが前日に株価が上昇したデータであり、df_fallに入っているデータが前日に株価が下落したデータになります。
ヒストグラムによる可視化
df_rise,df_fallのデータをヒストグラムで可視化していきたいと思います。
横軸に株価増減率、縦軸に縦軸がそれぞれの株価増減率の頻度を表しています。
・df_riseのヒストグラム
sns.distplot(df_rise["rate"], kde=False, rug=False, bins=20)
plt.vlines([0], 0 , 40, "red", linestyles='dashed')
plt.show()
sns.distplot(df_fall["rate"], kde=False, rug=False, bins=20)
plt.vlines([0], 0 , 40, "red", linestyles='dashed')
plt.show()

今、このヒストグラムを見てみると上の図(df_rise)のほうがrateの低いほうに分布の中心があるようにも思えます。仮にそうであるとするならば、前日の株価の上昇・下落によって当日の株価の値動きも変化が起こるということが言えそうです。
箱ひげ図による可視化
箱ひげ図による可視化も行っていきたいと思います。
plt.figure(figsize=(8,16))
sns.boxplot(x='before rise or fall', y='rate', data=df)
plt.show()

左の箱ひげ図が前日の株価増減率が下がったデータ(df_fall)を表し、右の箱ひげ図が前日の株価増減率が上がったデータ(df_rise)を表しています。
今、箱ひげ図でのそれぞれの分布を見てみたが若干前日株価が下がったグループのほうがrateの中央値が上であることが分かります。
統計的解析
ここから統計的解析を行っていきたいと思います。
今回、仮説の検証方法として母平均の差の検定を行っていきます。
母平均の差の検証を行う前に母分散に関して調べる必要があります。
まず母分散が分からない場合、母平均が等しいかどうかを検定するには2つのパターンに分けられます。
・ケース1:2つの母分散はわからないが、等しいとみなせる場合
・ケース2:2つの母分散の値が分からず、等しいとも限らない場合
まず、母分散が等しいかどうかを検定します。
母分散が等しいかどうかを調べる。
帰無仮説を「前日の株価が上昇したグループと前日の株価が下落したグループの当日の株価増減率の分散は等しい。」とします。
まずそれぞれの不偏分散を求めてみます
rise_var = np.var(df_rise["rate"].values, ddof=1)# riseの不偏分散
fall_var = np.var(df_fall["rate"].values, ddof=1)# fallの不偏分散
print("前日の株価が上昇したグループの不偏分散:{}".format(rise_var))
print("前日の株価が下落したグループの不偏分散:{}".format(fall_var))
それぞれの不偏分散は以下のようになりました。
・前日の株価が上昇したグループの不偏分散:0.0007510446313052848
・前日の株価が下落したグループの不偏分散:0.0008536790740697306
続いて統計量F値を求めていきます。
F = rise_var / fall_var
print("統計量F:{}".format(F))
統計量Fは以下のようになりました。
統計量F:0.8797739737543779
続いて95%信頼区間と、p値を算出していきます。
rise_m = len(df_rise) - 1 # rise_rateの自由度
fall_n = len(df_fall) - 1 # fall_rateの自由度
rv = stats.f(rise_m,fall_n)
print(rv.interval(0.95))#95%の信頼区間
# 片側検定の場合
# 有意水準を5%とした場合
# p_value <= 0.05であれば棄却出来る。
pval1 = stats.f.cdf(F, rise_m, fall_n) # 片側検定のp値・その1
pval2 = stats.f.sf(F, rise_m, fall_n) # 片側検定のp値・その2
p_value = min(pval1, pval2) * 2 # 両側検定のp値
print(p_value)
そうすると、信頼区間とp値は以下のようになりました。
信頼区間:(0.763899281203145, 1.312513508173752)
p値:0.3506067389305114
結果として今回、検定統計量Fは棄却域に含まれません。またp値を算出してみても有意水準5%以下になっていませんでした。そのため帰無仮説である「前日の株価が上昇したグループと前日の株価増減率と下落したグループの当日の株価増減率の分散は等しい。」は棄却されません。ということは、2つの母分散は等しくないとは言えないことが分かる。
以上の結果から、母分散が等しいと仮定して母平均が等しいかどうかを検定していきます。
ここでは2つの母平均が等しいものと仮定します。
従って、帰無仮説は「前日の株価が上昇したグループの当日の株価増減率の平均と前日の株価が下落したグループの当日の株価増減率の平均は同じである」として考えていきます。
帰無仮説を検証するために
・検定統計量Tを算出していきます。
U_rf = (rise_var * rise_m + fall_var * fall_n) / (rise_m + fall_n)#分散の加重平均
rise_mean = df_rise["rate"].mean()
fall_mean = df_fall["rate"].mean()
T = (rise_mean - fall_mean)/np.sqrt((1/(rise_m + 1) + 1/(fall_n + 1))*U_rf)
算出した結果、
検定統計量T:-1.9940683268497252
となりました。
続いて95%信頼区間とp値を算出していきます。
rv = stats.t(424)
rv.interval(0.95)#95%の信頼区間
t, p = stats.ttest_ind(df_rise["rate"].values, df_fall["rate"].values, equal_var=True)
信頼区間とp値は以下のようになりました。
95%信頼区間:(-1.9655746975220503, 1.9655746975220503)
p値:0.04678459533154817
このような結果から、帰無仮説は有意水準5%で棄却されます。
そのため、「前日の株価が上昇したグループと前日の株価が下落したグループの当日の株価増減率の平均は同じである」という帰無仮説は棄却され、前日に株価が上昇したか下落したかが当日の株価に影響を与えているということが言えます。
まとめ
今回、ラクスの株価データを用いて前日に株価が上がったか下がったかどうかで当日の株価に影響があるかについて分析を行ってみました。結果としてラクスの場合は、前日に株価が下がったのなら当日は株価が上がりやすいという傾向がみられました。ラクスの株価を見てみると右肩上がりに上がってはいるのでこの仮説が成り立ったのではないかと思います。しかしながらこれは過去の傾向が前日の株価増減率が当日の株価に影響を与えているのであって未来も同じようになるかというとそうとは言い切れません。なので株式投資をする際は自己責任で行いましょう。。。。
<参考資料>
https://kabuoji3.com/


