COMPANY

PAGE TOP

BLOG

機械学習で株価予測の最初の一歩 ~RapidMinerのwindowing株価データ扱い~

初めに

こんにちは、株式会社KSKアナリティクスの周です。

最近、機械学習が様々な領域に活かされており
時系列データを使って予測する事例もとても多くなっています。

こうなると、最も面白い、もしくはたくさん儲けられる時系列データが株価でしょうか。

時系列データを分析するにあたり、難しいPython等を使うイメージがあるかもしれません。
プログラミングの学習が大変だと思っている人にとっては非常に難しく感じられるでしょう。

しかし、ノンプログラミングで分析ができるツールがあります!
それがRapidMinerです!

さぁ、RapidMinerでノンプログラミング機械学習を始めましょう!
  
本記事では記事の都合上株価の予測までいくことができません。
しかし、株価データを扱う最初の一歩をまずは踏み出してみましょう。
  
また随時Python言語の方法と比較しながら、紹介していきたいと思います。

まずは株価のトレンドの確認をし、短期と中勢的な株価動向をさぐる25日移動平均線と中期的な株価動向をみる75日移動平均線を求めます。
そして最後に、この基本的な2本の線を可視化してみましょう。

Pythonプログラミングの扱い

データの準備

株式投資メモ
https://kabuoji3.com/stock/

こちらから簡単にcsv式の株価データをダウンロードできます。
例えば:1321 東証ETF 日経225連動型上場投資信託(ETF)の2017~2019年9月の年ごとデータをダウンロードします。

前処理

  • 必要なライブラリーをインポートします。
    import glob
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    import datetime
    %matplotlib inline
  • データを読み取り、結合します。
dflist = glob.glob("*.csv")
data = pd.DataFrame()
for i in dflist:
    name = pd.read_csv(i,header=0, nrows=1, encoding='cp932') # 日本語を表記する
    stock_name = name.columns[0]
    df = pd.read_csv(i,header=1, encoding='cp932')
    df["日付"] = pd.to_datetime(df["日付"], format="%Y-%m-%d")
    data = data.append(df)
    # 日付、終値を取ります
    date = data.iloc[:,0]
    price = data.iloc[:,4]
  • データを確認します。(15行まで)

  • データのinfoについて

    データ可視化

    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.figure(figsize=(15,6))
    plt.plot(date,price)
    plt.title(stock_name,fontsize=20)
    plt.xlabel('年月',fontsize=18)
    plt.ylabel('株価',fontsize=18);

    👇

    移動平均を求めます

では、移動平均を求めましょう。Pythonならライブラリーpandasのrollingで求めます。

sma25 = price.rolling(window=25, center=False,axis=0).agg(["mean"])
sma75 = price.rolling(window=75, center=False,axis=0).agg(["mean"])

移動平均2線を追加しましょう

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize = (15,6))
plt.plot(date, price, color="b")
plt.plot(date, sma25, color="y")
plt.plot(date, sma75, color="g")
plt.legend(["Everyday","SMA25", "SMA75"])
plt.title(stock_name,fontsize=20)
plt.xlabel('年月',fontsize=18)
plt.ylabel('株価',fontsize=18);

ここまで見てくれてありがとうございます。
やっぱりコードを書くのが嫌でしょう。
RapidMinerを使うと、もっと効率的かつ楽に出来ますよ。
では、やり方を一緒に見ていきましょう。

RapidMinerの扱い

データ読み込み

オペレーターread_csvでデータを読み込み、結合します。

データをインポートする時、二つ注意すべきところがあります。

前処理

一つ目:元データの一行目が銘柄になっています。

これを削除するために、Header rowとStart rowを2に設定します。

二つ目:日付の型をdateに変換します。

そうすると、 Finishをクリックします。

早速確認!可視化

繋がって、実行すると、結合したデータを確認することができます。

いよいよwindowingで移動平均を求めよう

オペレーターProcess WindowsとExtract Aggregatesを使うと、簡単に移動平均を取ることができます。
まずはExtract AggregatesをProcess Windowsの中にいれます。

Extract AggregatesはWindowしたいカラム、とそ取りたい値を選択することができます。
オペレーターの設定は以下のようになっています。


RapidMinerのWindowingで他の項目を取ることもできます。右側のパラメータ欄をみると、mean、min、max。。。なども用意されています。

Process WindowsはWindowサイズの設定、カラムのタイプ、カラム名を選べます。

また25日移動平均を求めたい場合は、windows sizeを25で記入します(75日間なら、75を記入します。)
creat horizon(labels)にチェックし、日付を選びます。

●Rollingについては以下のブログもぜひ参考にしてください。
▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
https://www.ksk-anl.com/blog/time-series-as-supervised-learning-rolling-statistics/
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲

最後にAppendオペレーターを入れます。Appendでスライスした全てのWindowsのを結合します。

これを実行すると、以下のようになります。

なぜAppendを入れるでしょうか?それはWindowingできた結果が一つ一つのファイルになっています。

結合すると全ての結果がまとめます。

今回で2線をWindowingしたいので、プロセスが下のようになっています。

早速確認!

実行すると、結果は以下になっています。

2線それぞれの結果を確認出来ます。

Visualizationsから楽に移動平均の変動もみえます。

マウスを図で移動すると、各点の値も簡単に確認できます。

今回は平均値、最小値、と標準偏差もWindowingしました。

可視化してみると、すぐ見えますね。

どうでしょうか、非常に便利でしょう。
ぜひ、可視化の機能も活かしてデータ分析を始めましょう。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

もしRapidMinerに興味を持ちましたら、
是非今度のハンズオンに参加してみましょう!
またご質問とかありましたら、下の連絡先まで連絡してください。

https://ksk-anl.smktg.jp/public/application/add/43

1日で機械学習の基礎が学べる!無償ハンズオンセミナー随時開催中
https://www.ksk-anl.com/event/

RapidMinerをもっと知りたい方はこちら
https://www.rapidminer.jp/

早速使ってみたい!RapidMinerの体験版の無償DL
https://www.rapidminer.jp/download/

導入を検討中!わかりやすい詳細なQ&A
https://www.rapidminer.jp/faq/

$$ \begin{aligned} \newcommand\argmin{\mathop{\rm arg~min}\limits} \boldsymbol{\beta}_{\text{ridge}} & = \argmin_{\boldsymbol{\beta} \in \mathcal{R^p}} \biggl[ ||\boldsymbol{y}-\boldsymbol{X\beta}||^2 + \lambda ||\boldsymbol{\beta}||^2 \biggr] \\ & = (\boldsymbol{X}^T\boldsymbol{X} + \lambda\boldsymbol{I_{p+1}})^{-1}\boldsymbol{X}^T\boldsymbol{y} \end{aligned} $$
PAGE TOP