数学がわからない

日々の勉強をアウトプットする。

Pythonで銘柄ピックアップ①下落日数

株価が十分に下がっている銘柄をピックアップするスクリプトを書く。
株価に関する参考文献は下記。

世界一やさしい 株の練習帖 1年生

世界一やさしい 株の練習帖 1年生

はじめに

株価が十分に下がっている「上昇1回目の買いをしていい条件」を参考文献から引用する。

① 2~3カ月以上下げ続けたか?
② 3回以上安値切り下げ(3段下げ完成)があったのか?
③ 株価が直近になって75日移動平均線に近づいてきたか?
No.247/2268

ここでは、条件①を満たしている銘柄を取得するコードをPythonで書く。

コード

銘柄別株価データ

株価データはたとえば次のようなcsvファイルで銘柄別に持っているものとする。

f:id:rettouseinosugakubenkyo:20190109064308p:plain

上記は銘柄コード9997の2015/9/9から2019/1/8までの始値、高値、安値、終値出来高、売買代金を記載したcsvファイルであり、[9997.csv]という名前で保存されている。

csvファイルからの読み込みは次のように行い、pandasパッケージのDataFrame形式に変換する。

import pandas as pd
import codecs

def get_dataframe_from_csv(csvname):
    """
    csvファイルからデータフレームを取得する。
    :param csvname: csvファイル名
    :return df: データフレーム 
    """
    try:
        with codecs.open(csvname, "r", "utf_8") as file:
            df = pd.read_table(file, delimiter=",", index_col=0)
        return df
    except:
        with codecs.open(csvname, "r", "shift_jis", "ignore") as file:
            df = pd.read_table(file, delimiter=",", index_col=0)
        return df

jupyter notebookで実行すると次のようになる。
f:id:rettouseinosugakubenkyo:20190109064808p:plain

ここまでが事前準備。

条件① 2~3カ月以上下げ続けたか?

条件①を以下のようにもう少し詳細に定義する。

  1. 終値が75日移動平均線を割り込んだ日を下落開始日とする。
  2. 下落開始日から60営業日(約3カ月)以上、終値が75日移動平均線を一度も上回っていない。

コードでは次の通り。

まず、終値から75日移動平均を計算する。

import numpy as np

def get_aveline(data, day):
    """
    day日移動平均線を求める。
    :param data: float []
        移動平均する対象。
    :param day: int               
        移動平均する日数
    :return aveline: float []
        移動平均結果(移動平均線)
    """
    # 日数day分、数値配列をずらしながら加算する。
    aveline_d = np.array(data[(day-1):])
    for n in range(day-1):
        aveline_d += np.array(data[n:-(day-1)+n])

    # 平均を計算
    aveline_d /= day

    # dataとaveline_dの要素数が同じになるように先頭の値をコピー
    while len(aveline_d) < len(data):
        aveline_d = np.insert(aveline_d, 0, aveline_d[0])

    return aveline_d

jupyter notebook上で実行すると、次のようになる。

f:id:rettouseinosugakubenkyo:20190109065142p:plain

続いて、下落開始日を取得する。

# 終値が75日移動平均よりも上となっている要素の番号リスト
ids = np.where([a75<df.終値][0])[0]

# 終値が75日移動平均よりも上となっている直近の日付、終値、75日移動平均
print(ids[-1])
print(df.index[ids[-1]], df.終値[ids[-1]], a75[ids[-1]])

# 次の日(下落開始日)の日付、終値、75日移動平均
print(ids[-1]+1)
print(df.index[ids[-1]+1], df.終値[ids[-1]+1], a75[ids[-1]+1])

jupyter notebook上で実行すると、次のようになる。

f:id:rettouseinosugakubenkyo:20190109065546p:plain

この銘柄は2018/12/04の終値で75日移動平均線を割り込み、それから一度も終値が75日移動平均線を上回っていない。つまり、下落開始日2018/12/04から株価が下がり続けている。

この下落開始日が2~3カ月以上前であれば、条件①を満たしていることになるが、1カ月前であり、この銘柄は条件①を満たしていない。

実験

以上の操作を手元に持っているすべての銘柄データに対して行い、下落開始日から下げ続けた日数(営業日の数)を求め、条件①を満たす銘柄をピックアップする。なお、下落開始日から下げ続けた日数は次のように計算する。

declining_days = len(df) - (ids[-1] + 1)

結果

下落開始日から下げ続けた日数のlist: xを作り、ヒストグラム表示すると次のようになる。
f:id:rettouseinosugakubenkyo:20190111051941p:plain
ヒストグラム表示してみると次のようになる。

上記は、2019/1/10を調査日として、調査日まで下げ続けた日数を求めている。
しかし、他の日を調査日としてもよく、たとえば100営業日前(2018/08/10)を調査日としてヒストグラム表示してみると次のようになる。

f:id:rettouseinosugakubenkyo:20190111053209p:plain

比較すると、ここ最近の地合いの悪さが良く分かる。

まとめ

参考文献器才の「上昇1回目の買いをしていい条件」のうち一つ目「① 2~3カ月以上下げ続けたか?」を満たす銘柄を取得するコードをPythonで書いた。手元にある3079データのうち条件を満たす銘柄の数は933銘柄であり、かなり多くの銘柄が75日移動平均を割って下げ続けていることになる。

次は、この中からさらに条件②⓷をピックアップし、買うべき銘柄を絞っていく。