私が株式投資をはじめて間もない頃なので、20年以上も前の話です。
「株のデイトレードは、始値で売って終値で買い戻すだけで利益がでる!」
そんな情報に出会いました。
はたして本当なのでしょうか?
それとも都市伝説か?
いわゆる、寄り天相場が相対的に多い事を想定した、デイトレード投資戦略です。
今でも通用するのでしょうか?
Pythonで分析してみました。
このブログ記事は、下のブログの続きです。
都市伝説か!?デイトレードは始値で売って終値で買い戻すだけで利益がでる!Pythonで株価分析[サンプルコード付き]Part1
約21年間の日経平均株価を分析します
個別銘柄をひとつひとつ分析するのは大変なので、約21年間の日経平均株価を分析します。
自分のPCに保存しているCSVデーターを取り込みました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#ライブラリーをインポート import pandas as pd #ここで日経平均株価を指定している Security_code = 'Nikkei 225' # 指定された銘柄コードのファイル名を作成 Security_code +_Longest_term_historical_data.csv csv_file_name = f"{Security_code}_Longest_term_historical_data.csv" # parse_dates=Trueで、インデックスの列をdatetime型に変換している df = pd.read_csv('./data/' + csv_file_name, header=0, index_col='Date', parse_dates=True) # データーを降順に並び替える df = df.sort_index() df |
取り込んだデーターは2001年01月05日から2022年08月19日まで。
当日始値からの上昇下降その他の値算出
当日始値からの、上昇下降その他の値を算出します。
※Part1のブログから続けてご覧になっている方へ。 この下のコードから一部追記・変更しています。
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#1日の上昇下降の値差を算出' df['Ascent_and_descent_of_the_day'] = df['Close'] - df['Open'] #1日の上昇・下降したかのフラグ設定 #まず初期値を入力 (undecided:未判定) df['Up_Down_day_flag'] = 'undecided' #当日 始値から上昇して終わったか 上昇していればUP 下降していればDOWN フラグを付与 df.loc[ df['Open'] < df['Close'], 'Up_Down_day_flag'] = 'UP' df.loc[ df['Open'] > df['Close'], 'Up_Down_day_flag'] = 'DOWN' ####後の検証で使用する#### ## 前日の価格変動のフラグ設定(上昇して終わったか下降したか) #まず初期値を入力 (未判定:undecided) df['Up_Down_day_before_flag'] = 'undecided' #前日の価格変動をフラグ付け 上昇ならUP 下降ならDOWN df.loc[df['Ascent_and_descent_of_the_day'].shift(1) > 0 , 'Up_Down_day_before_flag'] = 'UP' df.loc[df['Ascent_and_descent_of_the_day'].shift(1) < 0 , 'Up_Down_day_before_flag'] = 'DOWN' #1日の上昇下降率を算出して新しい列に格納 df['Ascent_and_descent_of_the_day_ratio'] = (df['Close'] - df['Open'])/df['Close'] ##当日の始値と前日の終値との比較 #まず初期値を入力 (undecided:未判定) df['Close_previous-Open'] = 'undecided' #前日終値と当日始値とのギャップ df['Close_previous-Open'] = (df['Open'] - df['Close'].shift(1)) #前日終値と当日始値とのギャップ率 df['Close_previous-Open_ratio'] = (df['Open'] - df['Close'].shift(1))/df['Close'].shift(1) #前日終値にタッチしたかのフラグ設定 #まず初期値を入力 (未到達) df['touch_Close_the_day_before'] = 'unreached' #前日終値と当日始値とのギャップがプラスの場合 gap_up 判定 df.loc[df['Close_previous-Open'] > 0, 'gap_from_the_previous_day'] = 'gap_up' #前日終値と当日始値とのギャップがマイナスの場合 gap_down 判定 df.loc[df['Close_previous-Open'] < 0, 'gap_from_the_previous_day'] = 'gap_down' ##条件分け #前日が上昇して終わったか #前日終値と当日始値の位置(価格差) # A:前日が上昇かつ前日終値よりも当日始値が高い df.loc[(df['Up_Down_day_before_flag'] == 'UP') & (df['Close_previous-Open'] > 0), 'Classify'] = 'A' # B:前日が上昇かつ前日終値よりも当日始値が低い df.loc[(df['Up_Down_day_before_flag'] == 'UP') & (df['Close_previous-Open'] < 0), 'Classify'] = 'B' # C:前日が下降かつ前日終値よりも当日始値が高い df.loc[(df['Up_Down_day_before_flag'] == 'DOWN') & (df['Close_previous-Open'] > 0), 'Classify'] = 'C' # D:前日が下降かつ前日終値よりも当日始値が低い df.loc[(df['Up_Down_day_before_flag'] == 'DOWN') & (df['Close_previous-Open'] < 0), 'Classify'] = 'D' #売り戦略の場合の損益金額を算出' Profit and Loss of Sell Strategy df['Profit_and_Loss_of_Sell_Strategy'] = df['Ascent_and_descent_of_the_day'] * -1 df df[['Open','High', 'Low', 'Close', 'Ascent_and_descent_of_the_day','Up_Down_day_flag', 'Up_Down_day_before_flag','Close_previous-Open','Classify']] |
ヒストグラムで頻度確認
ヒストグラムで取引が当日始値から上昇して終わったか、下降して終わったか。
その出現頻度をヒストグラムで見てみましょう。
UP、DOWNの判定が出来ていないデーターが含まれています。
不要なデーターを削除します。
※詳細を知りたい方はPart1のブログをご覧下さい。
1 2 3 4 5 6 7 |
#不要なデーターを削除して新しいデーターフレームに格納する df2 = df[df['Up_Down_day_flag'] != 'undecided'] df2 = df2[df2['Up_Down_day_before_flag'] != 'undecided'] df2[['Open','High', 'Low', 'Close', 'Ascent_and_descent_of_the_day', 'Up_Down_day_flag', 'Up_Down_day_before_flag','Classify']] |
もう一度ヒストグラムを表示させましょう。
1 |
sns.histplot(df2['Up_Down_day_flag']) |
不要なデーターが削除されています。
損益チャート
◇売り戦略
当日の始値で売り仕掛け
当日の終値で手仕舞い
下のチャートは売り戦略を採用した場合の損益を表しています。
(手数料・税金等は考慮していません)
「株のデイトレードは、始値で売って終値で買い戻すだけで利益がでる!」
この話を聞いたのは、今から20年以上前です。
損益チャートの左側部分(20年前の2003年頃)はキレイな右肩上がりに見えます。
その頃には機能していた投資戦略だったのかも知れません。
もう少し深掘り
「株のデイトレードは、始値で売って終値で買い戻すだけで利益がでる!」
この投資戦略は、今では使えない都市伝説だった。
このように結論づけるのは簡単です。
でも、ここで分析を終わらせたらもったいない気がしませんか?
もう少し深掘りしてみましょう。
前日株価が上昇して終わった日の翌日だけトレードしたら?
前日終値から、ギャップを開けて始まった時だけトレードしたら?
分析を進めましょう。
カテゴリー分け
カテゴリーを分けて考えます。
◇カテゴリー分けの条件
・前日が上昇して終わったか
・前日終値と当日始値の位置(価格差)
A:前日が上昇かつ前日終値よりも当日始値が高い
B:前日が上昇かつ前日終値よりも当日始値が低い
C:前日が下降かつ前日終値よりも当日始値が高い
D:前日が下降かつ前日終値よりも当日始値が低い
この4つに分けて分析を進めます。
ヒストグラムで頻度確認
ヒストグラムでカテゴリー別の頻度(上昇・下降)を確認しましょう。
1 |
sns.histplot(df2['Classify']) |
カテゴリー別の頻度
カテゴリー別の頻度を確認しましょう。
カテゴリー毎のデーターフレームを作ります。
1 2 3 4 |
df2_a = df2[df2['Classify'] == 'A'] df2_b = df2[df2['Classify'] == 'B'] df2_c = df2[df2['Classify'] == 'C'] df2_d = df2[df2['Classify'] == 'D'] |
A:前日が上昇かつ前日終値よりも当日始値が高い
1 2 |
# A:前日が上昇かつ前日終値よりも当日始値が高い sns.histplot(df2_a['Up_Down_day_flag']) |
B:前日が上昇かつ前日終値よりも当日始値が低い
1 2 3 |
# B:前日が上昇かつ前日終値よりも当日始値が低い sns.histplot(df2_b['Up_Down_day_flag']) |
C:前日が下降かつ前日終値よりも当日始値が高い
1 2 3 |
# C:前日が下降かつ前日終値よりも当日始値が高い sns.histplot(df2_c['Up_Down_day_flag']) |
D:前日が下降かつ前日終値よりも当日始値が低い
1 2 3 |
# D:前日が下降かつ前日終値よりも当日始値が低い sns.histplot(df2_d['Up_Down_day_flag']) |
カテゴリー別の特徴が見えてきました。
カテゴリー別の損益グラフ作成
カテゴリー別の損益グラフを作成します。
すべてのカテゴリーで売り戦略の場合
すべてのカテゴリーで売り戦略の場合
1 2 3 4 5 6 7 8 |
#売り戦略の場合の損益金額を算出' Profit and Loss of Sell Strategy df2['Profit_and_Loss_of_sell_all_strategy'] = df2['Ascent_and_descent_of_the_day'] * -1 #売り戦略の累積和を算出する df2['Accumulation_sell_all_Strategy'] = df2['Profit_and_Loss_of_sell_all_strategy'].cumsum() #df2[['Open','High', 'Low', 'Close', 'Profit_and_Loss_of_sell_all_strategy', 'Accumulation_sell_all_Strategy','Classify']] sns.lineplot(data=df2,x='Date',y='Accumulation_sell_all_Strategy') |
カテゴリA:前日が上昇かつ前日終値よりも当日始値が高い
カテゴリA:前日が上昇かつ前日終値よりも当日始値が高い場合
1 2 3 4 5 6 7 8 |
#売り戦略の場合の損益金額を算出' Profit and Loss of Sell Strategy df2_a['Profit_and_Loss_of_sell_all_strategy'] = df2_a['Ascent_and_descent_of_the_day'] * -1 #売り戦略の累積和を算出する df2_a['Accumulation_sell_all_Strategy'] = df2_a['Profit_and_Loss_of_sell_all_strategy'].cumsum() #df2_a[['Open','High', 'Low', 'Close', 'Profit_and_Loss_of_sell_all_strategy', 'Accumulation_sell_all_Strategy','Classify']] sns.lineplot(data=df2_a,x='Date',y='Accumulation_sell_all_Strategy') |
これは乱高下の損益曲線になっていますね。
カテゴリーB:前日が上昇かつ前日終値よりも当日始値が低い
カテゴリーB:前日が上昇かつ前日終値よりも当日始値が低い場合
1 2 3 4 5 6 7 8 9 |
#売り戦略の場合の損益金額を算出' Profit and Loss of Sell Strategy df2_b['Profit_and_Loss_of_sell_all_strategy'] = df2_b['Ascent_and_descent_of_the_day'] * -1 #売り戦略の累積和を算出する df2_b['Accumulation_sell_all_Strategy'] = df2_b['Profit_and_Loss_of_sell_all_strategy'].cumsum() #df2_b[['Open','High', 'Low', 'Close', 'Profit_and_Loss_of_sell_all_strategy', 'Accumulation_sell_all_Strategy','Classify']] sns.lineplot(data=df2_b,x='Date',y='Accumulation_sell_all_Strategy') |
おっと。 なめらかな右肩上がりの損益曲線を描いています。
カテゴリーC:前日が下降かつ前日終値よりも当日始値が高い
カテゴリーC:前日が下降かつ前日終値よりも当日始値が高い場合
1 2 3 4 5 6 7 8 9 |
#売り戦略の場合の損益金額を算出' Profit and Loss of Sell Strategy df2_c['Profit_and_Loss_of_sell_all_strategy'] = df2_c['Ascent_and_descent_of_the_day'] * -1 #売り戦略の累積和を算出する df2_c['Accumulation_sell_all_Strategy'] = df2_c['Profit_and_Loss_of_sell_all_strategy'].cumsum() #df2_c[['Open','High', 'Low', 'Close', 'Profit_and_Loss_of_sell_all_strategy', 'Accumulation_sell_all_Strategy','Classify']] sns.lineplot(data=df2_c,x='Date',y='Accumulation_sell_all_Strategy') |
これはひどい! 右肩下がりの損益曲線です。
でも、良く見ると滑かなチャートを描いています。
これは、お宝発見かも知れません。
詳細は後述します。
カテゴリーD:前日が下降かつ前日終値よりも当日始値が低い
カテゴリーD:前日が下降かつ前日終値よりも当日始値が低い場合
1 2 3 4 5 6 7 8 9 |
#売り戦略の場合の損益金額を算出' Profit and Loss of Sell Strategy df2_d['Profit_and_Loss_of_sell_all_strategy'] = df2_d['Ascent_and_descent_of_the_day'] * -1 #売り戦略の累積和を算出する df2_d['Accumulation_sell_all_Strategy'] = df2_d['Profit_and_Loss_of_sell_all_strategy'].cumsum() #df2_d[['Open','High', 'Low', 'Close', 'Profit_and_Loss_of_sell_all_strategy', 'Accumulation_sell_all_Strategy','Classify']] sns.lineplot(data=df2_d,x='Date',y='Accumulation_sell_all_Strategy') |
これも、右肩上がりの損益チャートと言って良いでしょう。
特に2021年以降の一直線なチャートに興味がもてます。(個人的な興味です)
逆転の発想 カテゴリーCの買い戦略:前日が下降かつ前日終値よりも当日始値が高い
今回のブログで分析を進めているのは、
「始値で売って、終値で買い戻す」この戦略が機能するかどうかです。
カテゴリーC:前日が下降かつ前日終値よりも当日始値が高い
このカテゴリーで売り戦略を採用した場合の損益チャートをもう一度見てみましょう。
これだけキレイな右肩下がりも珍しい。
ならば、売買を逆にしたら?
「始値で買って、終値で売る」 戦略が機能するかどうかです。
カテゴリーCの買い戦略:前日が下降かつ前日終値よりも当日始値が高い
1 2 3 4 5 6 7 8 9 10 11 |
df2_c_reversal = df2_c #売り戦略の場合の損益金額を算出' Profit and Loss of Sell Strategy df2_c_reversal['Profit_and_Loss_of_buy_all_strategy'] = df2_c_reversal['Ascent_and_descent_of_the_day'] * 1 #売り戦略の累積和を算出する df2_c_reversal['Accumulation_buy_all_Strategy_c'] = df2_c_reversal['Profit_and_Loss_of_buy_all_strategy'].cumsum() #df2_c[['Open','High', 'Low', 'Close', 'Profit_and_Loss_of_sell_all_strategy', 'Accumulation_sell_all_Strategy','Classify']] sns.lineplot(data=df2_c_reversal,x='Date',y='Accumulation_buy_all_Strategy_c') |
もちろん、売り買いを逆にしているのですから、損益チャートは右肩上がりです。
買い戦略なので、日経平均株価の推移もチャートに表示させます。
1 2 |
df2_c_reversal_2 = df2_c_reversal[['Accumulation_buy_all_Strategy_c','Close']] sns.lineplot(data=df2_c_reversal_2) |
2010年頃から2013年頃までの期間は、損益チャートはゆるやかに下降しています。
このチャートをどう見るか?
その判断は、投資家としてのご自身の判断におまかせします。
まとめ
20年以上も前に聞いた投資戦略。
「株のデイトレードは、始値で売って終値で買い戻すだけで利益がでる!」
下の4つのカテゴリに分けて分析をしました。
◇カテゴリー分けの条件
・前日が上昇して終わったか
・前日終値と当日始値の位置(価格差)
A:前日が上昇かつ前日終値よりも当日始値が高い
B:前日が上昇かつ前日終値よりも当日始値が低い
C:前日が下降かつ前日終値よりも当日始値が高い
D:前日が下降かつ前日終値よりも当日始値が低い
カテゴリーCの売り買いを逆転すればチャート上の損益は、3つのカテゴリーで右肩上がりを示しています。
この結果をどのように見るか?
その判断は、投資家としてのご自身の判断におまかせしたいと思います。
なお、今回の分析はブログ記事作成のために行いました。
システムトレードのロジック作成の過程で、出された結果ではありません。
回りくどい言い方になってしまいましたが、この分析結果は十分に検証されたものではありません。
誤りがあればご指摘ください。
エンターテイメントとして、このブログ記事をご覧いただけたら幸いです。
※注意事項
ブログ運営者は、このブログ記事を参考にした取引で発生した損失、その他の不利益に対して責任を負いかねますのであらかじめご了承ください。
このブログ記事は、特定の銘柄の売買を推奨・投資の勧誘を目的としたものではありません。
最終的な投資決定は、ご自身の判断でなさるようにお願いいたします。
この記事を書いた人
あしおゆたか
投資歴21年の個人投資家
机上の理論ではなく、実体験に基づいた記事作りをモットーにしています。
スポーツクラブに毎週2日~3日通い、サウナ後の暴飲暴食が趣味。(現在自粛中)
◇主な投資対象
日本株式
株式ETF(上場投資信託)
日経225先物
日経225先物オプション
◇運営者情報はこちら