投資quest:pyhtonでシステムトレードを作る(1)移動平均線


pythonでシステムトレード:移動平均線を描く

システムトレードの作戦

コロナで世の中大変ですが、株式は21年1月現在コロナ金融緩和バブルの様相を示しています。今はこのトレンドにのって、イケイケですが「節分天井,彼岸底」という格言通り、イケイケは後少しだと思います。その後は次のトレンドが来るまではしばらくレンジ相場が来るような気がします。レンジ相場、トレンド相場に対応できる機械学習を使ったシステムトレードを考えようと思います。
pythonのライブラリーとしては、TA-Libというライブラリーがありますが、勉強のために、なるべく使わずに検討してみようと思います。

今回の作戦としては、
1.etfの売買を行う
2.ボリンジャーバンドを指標として使う
3.ボリンジャーバンドのバンドの下限で買い、上限で売り

いろいろな指標はありますが、単純なボリンジャーバンド作戦です。
ボリンジャーバンドでpythonの勉強をしたら、他に良い指標(MACD,RSI)がないか、指標を組み合わせたらどうなるかと順番に作っていけたら良いなと思います。

最初にボリンジャーバンドのシステムトレードを作りながら
1.で、どのetfが良いか?topix、日経平均、その他の指標でどれが勝率がよいか。
2.3.で、ボリンジャーバンドの何σが勝率がよいか考える

を確認して、システムトレードを作ろうと思います。

データの入手

まずターゲットを1306の野村アセットのTOPIX連動型上場投信で検討します。
スクレイピング技術は後回しです。クリックして、このサイトから集めました。
https://kabuoji3.com/
少し面倒ですが、クリックするだけで2001年から毎年ののcsvファイルが入手できます。
1306_2001.csv ~ 1306_2021.csv


こういう日々のetfの値動きのファイルが入手できます。

データの結合

まずはデータの結合です。これは簡単にpandasで結合しました。
深く考えずに結合してますが、0行目に「1306 東証ETF TOPIX連動型上場投資信託(ETF)」が入っているので、data = pd.read_csv(file,encoding='Shift-Jis',header = 1)として、header=1で1行目の

column 名として読み込みました。
column 名が日本語なので、とりあえず適当な英語に直しました。

import pandas as pd
import matplotlib.pyplot as plt
import datetime

import matplotlib.dates as mdates

#read_csvですべてのデータを結合する。
#1306_2001から1306_2021

df = None

for i in range(2001,2021):

    file = '1306_' + str(i) + '.csv'
    print(file)

    data = pd.read_csv(file,encoding='Shift-Jis',header = 1)


    df = pd.concat( [df,data],ignore_index=True)

df.rename(columns={'日付': 'day', '始値': 'open_price',
                   '高値':'high_price', '安値':'low_price',
                   '終値': 'end_price', '出来高':'volume',
                   '終値調整値':'end_price_ad_value'}, inplace=True)

print(df.head())

とりあえずpandasのデータセットができました。

グラフを作ると、こんな感じです。今は10年間で最高値です。イケイケですね。

次にボリンジャーバンドの描き方です。

ボリンジャーバンドの描き方

ボリンジャーバンドとは、をMONEX証券のサイトから引用します。
https://info.monex.co.jp/technical-analysis/indicators/003.html
「移動平均線と標準偏差で構成されており、移動平均を表す線とその上下に値動きの幅を示す線を加えた指標で、「価格の大半がこの帯(バンド)の中に収まる」という統計学を応用したテクニカル指標のひとつです。」

つまり、株の価格から移動平均線と標準偏差を計算する必要があります。後、「統計学を応用したテクニカル指標」というところで、機械学習にも相性良いかも知れませんね。
最初に移動平均線を計算します。

単純移動平均線の計算

単純移動平均線は、一定期間の終値の平均価格になります。そこで、pandasrolling関数を使います。例えばrolling関数で、rolling(5).mean()とすると、5つの数値の平均を返します。そこで、df["end_price"].rolling(5).mean().round(1)で、計算をして、5日移動平均線を描いてみます。

#'day'をdatetimeタイプに変更
df['day'] = pd.to_datetime(df['day'])
#'day'をindexにして置き換える。
df.set_index('day', inplace=True)
#5日間移動平均線を計算
df["5day_ave"]=df["end_price"].rolling(5).mean().round(1)

#2019年の下期7月から12月を取り出す
df_temp = df['2019-07':'2019-12']

#グラフに描く
plt.plot(df_temp.index, df_temp["end_price"], label="daily")
plt.plot(df_temp.index, df_temp["5day_ave"],  label="sma5")
plt.xlabel("day")
plt.ylabel("price")
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%d-%b-%Y'))
plt.gca().xaxis.set_major_locator(mdates.MonthLocator(interval=2))
plt.gca().xaxis.set_minor_locator(mdates.MonthLocator(interval=1))
plt.gcf().autofmt_xdate()

plt.legend()
plt.show()

移動平均線が描けました。
次は、ボリンジャーバンドを描いていきます。
それは次の投資quest:pyhtonでシステムトレードを作る(2)で。