【願】Pythonを使って株価の予測プログラムを作りたい(移動平均)

自動化

はぁ~。楽してお金を稼ぎたい…。hanabeです。

大好きな外出を絶賛控え、龍が如くをプレイしているのですが、これがまたすんごい貯まるんですよお金!!

そこらのチーマーやっつけただけで、自分の月収をはるかに超えていく…。

話が逸れましたが、今回は不景気の中、「今株買って将来まで持ってれば儲かるんじゃねぇ?」という安易なザ初心者的考えのもとで株運用を初めてみた私が、買った株をいつ頃売ればいいか、Python を使って単純な予測モデルを作りたいと思います。

とは言っても、株、プログラミング初心者の私なので参考にさせて頂いたサイトを以下に載せておきます。

Pythonで株価予測・分析
この記事では、プログラミング言語Pythonを用いて、株価を分析・予測する方法をソースコード付きで解説します。

1.目次

  • データ収集について
  • Numpyについて
  • サンプルコード

データ収集について

今回は楽天証券さんのMarketspeedを用いて、csvデータをダウンロードしていきたいと思います。SBI証券さんだとごそっと取れるらしいんですが、楽天証券さんは1回あたり300日ごとしか取れないので、複数回に分けてちまちま取っていきます。

楽天証券Marketspeed ↓

マーケットスピード | 楽天証券のトレーディングツール
楽天証券が提供する、最先端の機能、直感的な操作性、圧倒的な情報量、投資家たちが渇望した夢をカタチにした“究極のトレーディングツール。

ログイン後、「投資情報」タブから「時系列情報」を選択することによって、期間指定で情報が受け取れます。1回あたり300日が限界なので、1年ごとにちまちまcsvで吐き出していきます。吐き出したcsvファイルはPythonの実行環境に保存していきます。

Numpyについて

僕もよく分かっていないですが、Pythonの数値解析的な部分の拡張モジュールらしいです。行列計算などもお手の物なので、かなり優れています。

Numpyについての詳しい説明はほかのブログマスターの詳しいご説明をご参照ください。

サンプルコード

今回は楽天証券さんを使用したので、楽天さんの銘柄でグラフを作成したいと思います。参考にしたブログ通り25日、75日について移動平均を出しています。



# -*- coding: utf-8
import numpy as np
import matplotlib.pyplot as plt
import datetime
import pandas as pd
import matplotlib.dates as mdates

# 移動平均線の計算(データ, 日数)
def move_average(data, day):
    return np.convolve(data, np.ones(day)/float(day), 'valid')
    
def main():
     # CSVのロード(2015年と2016年のデータ)
    data10 = np.genfromtxt("rakuten10.csv", delimiter=",", skip_header=1, dtype='float')
    data11 = np.genfromtxt("rakuten11.csv", delimiter=",", skip_header=1, dtype='float')
    data12 = np.genfromtxt("rakuten12.csv", delimiter=",", skip_header=1, dtype='float')
    data13 = np.genfromtxt("rakuten13.csv", delimiter=",", skip_header=1, dtype='float')
    data14 = np.genfromtxt("rakuten14.csv", delimiter=",", skip_header=1, dtype='float')
    data15 = np.genfromtxt("rakuten15.csv", delimiter=",", skip_header=1, dtype='float')
    data16 = np.genfromtxt("rakuten16.csv", delimiter=",", skip_header=1, dtype='float')
    data17 = np.genfromtxt("rakuten17.csv", delimiter=",", skip_header=1, dtype='float')
    data18 = np.genfromtxt("rakuten18.csv", delimiter=",", skip_header=1, dtype='float')
    data19 = np.genfromtxt("rakuten19.csv", delimiter=",", skip_header=1, dtype='float')
    data20 = np.genfromtxt("rakuten20.csv", delimiter=",", skip_header=1, dtype='float')
    
    # 5列目の終値だけを日付古い順に並び替えて取り出し
    f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20 = data10[:,4], data11[:,4], data12[:,4], data13[:,4], data14[:,4], data15[:,4], data16[:,4], data17[:,4], data18[:,4], data19[:,4], data20[:,4]
    f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20 = f10[::-1], f11[::-1], f12[::-1], f13[::-1], f14[::-1], f15[::-1], f16[::-1], f17[::-1], f18[::-1], f19[::-1], f20[::-1]
    
    # 移動平均線(25日線)の計算
    day = 25    # 日数
    data = np.r_[f10, f10[len(f10)-day+1:len(f10)], f11, f11[len(f11)-day+1:len(f11)], f12, f12[len(f12)-day+1:len(f12)], f13, f13[len(f13)-day+1:len(f13)], f14, f14[len(f14)-day+1:len(f14)], f15, f15[len(f15)-day+1:len(f15)], f16, f16[len(f16)-day+1:len(f16)], f17, f17[len(f17)-day+1:len(f17)], f18, f18[len(f18)-day+1:len(f18)], f19, f19[len(f19)-day+1:len(f19)], f20]    # 2015年の終値の一部と2016年の終値を結合
    
    ma_25d = move_average(data, day)

    # 移動平均線(75日線)の計算
    day = 75    # 日数
    data = np.r_[f10, f10[len(f10)-day+1:len(f10)], f11, f11[len(f11)-day+1:len(f11)], f12, f12[len(f12)-day+1:len(f12)], f13, f13[len(f13)-day+1:len(f13)], f14, f14[len(f14)-day+1:len(f14)], f15, f15[len(f15)-day+1:len(f15)], f16, f16[len(f16)-day+1:len(f16)], f17, f17[len(f17)-day+1:len(f17)], f18, f18[len(f18)-day+1:len(f18)], f19, f19[len(f19)-day+1:len(f19)], f20]    # 2015年の終値の一部と2016年の終値を結合
    
    ma_75d = move_average(data, day)
    
    f = np.r_[f10, f11, f12, f13, f14, f15, f16, f17, f18, f19, f20]
    
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    
    x = pd.date_range('2010/05/01', periods=2447, freq='d')
    # 日付ラベルフォーマットを修正
    days = mdates.DayLocator() 
    daysFmt = mdates.DateFormatter('%y-%m')
    ax.xaxis.set_major_locator(days)
    ax.xaxis.set_major_formatter(daysFmt)
    
    # グラフにプロット
    ax.plot(x,f,  label="f")
    #ax.plot(ma_25d, "--", color="r", label="MA 25d")
    #ax.plot(ma_75d, "--", color="g", label="MA 75d")
    plt.ylim([500,2300])
    
    # ラベル軸
    plt.title("Stock of Rakuten")
    plt.xlabel("Day")
    plt.ylabel("f")
    # 凡例
    plt.legend(loc="4")
    # グリッド
    plt.grid()
    # グラフ表示
    plt.show()

    
if __name__ == "__main__":
    main()

実行して出してみたグラフがこちら

まとめ

素人の私でも、コードを引用するだけで、結構簡単に出来ました。この単純なプログラムが当たるとは思っていませんが、一種の遊び感覚で書いてみてはいかがでしょうか。今回も勉強になりました。

コメント

Copied title and URL