ログイン

「機械学習って何?どうやって使うの?」

 2020.2.28 グローバルゴリラー李 ゴリラーブログ ブログ

 

グローバルゴリラー李です。

 

大学院の卒業論文発表会で、初めてディープラーニングと機械学習と言う言葉を耳にしました。

とても興味深かったので、翌日それらに関する本をいっぱい買いましたが、2年半も経って、全然進んでなかったことを思い出し、今更ですけど、再度読んでみました。その際、自分に役立つ知識と見解をここで共有したいなと思ったので、今回は機械学習を中心に共有させていただきます。

 

そもそも機械学習は人工知能の一分野で、ディープラーニングは機械学習の一分野ですので、先に機械学習からやっていきたいと思います。

 

まず機械学習って何?

機械学習はデータのパターンや特徴を学習し、それをもとに未知のデータに対して何かしらの予測を出力することです。

 

では、どうやって使うの?

私はやっぱり株価予測で試してみたいと思います!

 

いきなりですが、githubから株価予測Twitterbotのソースコードを解析していきながら勉強したいと思います。

 

できること:

・東証一部上場企業上位50社の明日の株価を予測して自動ツイートするTwitterbot

・一定時間ごとに50社の中からランダムで企業を選定して予測株価をツイート

・過去1年間分の初値、終値、最安値、最高値、出来高の数値を教師データとして使用

・Google finance APIからデータを取得

・サポートベクタ回帰分析アルゴリズムを使用した統計的な予測

・ランダムでbotのコメントも付与

 

使った技術:

python 3.6.0

Anaconda 4.0

Paas:heroku

lib:scikit-learn,pandas,tweepy..etc

Twitter API

Google finance API

 

import numpy as np

import pandas as pd

from sklearn.model_selection import train_test_split

from sklearn.neighbors import KNeighborsRegressor

from sklearn.linear_model import LinearRegression

import urllib

import time

import requests

from datetime import datetime, timedelta

import tweet as tw

import random

from sklearn.svm import SVR

 

#データの準備

def dataset(get_data):

 data_all = pd.DataFrame(get_data)

    data_answer = data_all[‘CLOSE’]

    data_answer = data_answer.drop(0)

    data_answer = data_answer.reset_index(drop=True)

    data_answer = np.array(data_answer)

    data_answer = data_answer[::-1]

    data_answer = data_answer.astype(float)

    data_all = data_all.drop(len(data_all)-1)

    data_all = data_all.reset_index(drop=True)

    data_all = np.array(data_all)

    data_all = data_all[::-1]

    data_all = np.delete(data_all,0,1)

    data_all = data_all.astype(float)

    return data_all ,data_answer

 

#APIを読み込んでCSVデータに整える

def getData(url):

    url = url

    url_contents = requests.get(url)

    lines = url_contents.text.splitlines()

 

#カラムの取得—“=”で区切った後にindex[1]のカラムを”,”区切りの配列に変換–

    columns = lines[4].split(“=”)[1].split(“,”)

 

#価格の取得

    prices = lines[8:]

    first_cols = prices[0].split(“,”)

 

#一行目のタイムスタンプを日時表示に変換

    first_date = datetime.fromtimestamp(int(first_cols[0].lstrip(‘a’)))

    result = [[first_date.date(), first_cols[1], first_cols[2], first_cols[3], first_cols[4], first_cols[5]]]

 

#カンマ区切りでデータを追加

    for price in prices[1:]:

        cols = price.split(“,”)

        #timedeltaオブジェクトで表される1行目の日時との差分を加算して日付を表示

        date = first_date + timedelta(int(cols[0]))

        #先に追加した1行目に2行目以降を追加していく

        result.append([date.date(), cols[1], cols[2], cols[3], cols[4], cols[5]])

        df = pd.DataFrame(result, columns=columns)

    return df

 

code_list = [“7203″,”9432″,”9437″,”8306″,”9984″,”9433″,”2914″,”6861″,”7182″,”6178″,”8316″,”7267″,”6758″,”7974″,”7751″,”8411″,”4502”,

              “7201”,”6954″,”6902″,”4063″,”9020″,”8058″,”3382″,”6981″,”5108″,”9022″,”6594″,”6752″,”6098″,”6503″,”6501″,”9983″,”8766″,

              “4452”,”6367″,”7270″,”4661″,”8031″,”4689″,”8001″,”4503″,”7269″,”6301″,”8802″,”1925″,”4578″,”6971″,”5401″,”7741″]

 

company_list = [“トヨタ自動車”,”NTT”,”NTTドコモ”,”三菱UFJフィナンシャル・グループ”,”ソフトバンクグループ”,”KDDI”,”JT”,”キーエンス”,”ゆうちょ銀行”,”日本郵政”,”三井住友フィナンシャルグループ”,

                “ホンダ”,”ソニー”,”任天堂”,”キヤノン”,”みずほフィナンシャルグループ”,”武田薬品工業”,”日産自動車”,”ファナック”,”デンソー”,”信越化学工業”,”JR東日本”,”三菱商事”,”セブン&アイ・ホールディングス”,

                “村田製作所”,”ブリヂストン”,”JR東海”,”日本電産”,”パナソニック”,”リクルートホールディングス”,”三菱電機”,”日立製作所”,”ファーストリテイリング”,”東京海上ホールディングス”,”花王”,”ダイキン工業”,”SUBARU”,

            “オリエンタルランド”,”三井物産”,”ヤフー”,”伊藤忠商事”,”アステラス製薬”,”スズキ”,”コマツ”,”三菱地所”,”大和ハウス工業”,”大塚ホールディングス”,”京セラ”,”新日鐵住金”]

 

#ランダムで企業を選定

counter = random.randint(0,49)

search_code = code_list[counter]

search_company = company_list[counter]

url = “https://www.google.com/finance/getprices?p=1Y&i=86400&x=TYO&q=” + str(search_code)

 

#APIからデータを取得

get_data = getData(url)

data_all ,data_answer = dataset(get_data)

 

#訓練用データとテスト用データに分離

X_train, X_test, y_train, y_test = train_test_split(data_all, data_answer, random_state=0)

 

#モデルを生成して訓練を実行

lr = SVR()

lr.fit(X_train, y_train)

 

#モデルの精度を算出

score = lr.score(X_test, y_test)

print(“テストデータ正解率:”+str(1+score))

 

#予測を実行

newest = np.array([data_all[0]])

prediction = lr.predict(newest)

 

#前日データを格納

lastday = round(data_answer[0],1)

 

#予測データを格納

result = prediction[0]

nextday = round(result,1)

 

#変化率を算出

rate = nextday / lastday 

rate = round(rate,3)

rate = str(rate)

rate_comment = “”

prediction_comment = “”

 

#前日データと比較してコメントを格納

if prediction > lastday:

    rate_comment = “前日比:”+rate+”pt上昇すると予測します!”

    counter1 = random.randint(0,10)

    up_comment_list = [“もしかしたら買い時かもしれません…(*´ω`*)”,”予測が外れたらごめんなさい…!( ;∀;)”,”今がチャンス!?…かもしれません…(; ・`д・´)”,”結果が楽しみですね…!(*^-^*)”,”当たるといいなぁ…(;’∀’)”,”上がったらハッピーですね(*^-^*)”,

                       “今日も一日いい日でありますように(/・ω・)/”,”今日は何かいいことあるといいですね(*^^*)”,”塩漬けになった銘柄ってどうしたらいいかわからない( ;∀;)”,”自分の頭で考えることが大事です…!(; ・`д・´)”,”どんな情報も鵜呑みにするのは禁物です!( ゚Д゚)”]

    prediction_comment = up_comment_list[counter1]

else:

    rate_comment = “前日比:”+rate+”pt下落すると予測します!”

    counter1 = random.randint(0,10)

    down_comment_list = [“もしかしたら売り時かもしれません…!(; ・`д・´)”,”我慢の時かもしれません…!(+_+)”,”明日はもしかしたら上がるかも…!?(/・ω・)/”,”あくまで参考の一つにしてくださいね…!(;・∀・)”,”買うか売るかはあなた次第です…!(。-`ω-)”,

                    “株って難しいですね…(^-^;”,”決断は慎重にしてくださいね(;゚Д゚)”,”株価を完璧に予測するのは中々難しいです(;・∀・)”,”もっとデータをたくさん食べて精度を上げます(;゚Д゚)”,”アホールドにならないよう気を付けてください(/・ω・)/”,”株価依存症には気を付けてください( ;∀;)”]

    prediction_comment = down_comment_list[counter1]

 

#ツイート内容を格納

tweet_contents = “【本日の株価予測】”+”\n”+”コード:”+str(search_code)+”\n”+”銘柄名:”+str(search_company)+”\n”+”予測終値:”+str(nextday)+”円”+”\n”+”前日終値:”+str(lastday)+”円”+”\n”+rate_comment+”\n”+”\n”+prediction_comment+”\n”+”#投資”+” “+”#株価”+” “+”#株価予測”+” “+”#人工知能”+” “+”#機械学習”

print(tweet_contents)

 

#ツイート実行

tw.postTweet(tweet_contents)

 

© 2020 Mountain Gorilla Co., Ltd. 

プライバシーポリシー

%d人のブロガーが「いいね」をつけました。