質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1555閲覧

Python、scikit-learnの線形回帰について

Kaikoko

総合スコア14

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/02/20 07:37

初心者です、よろしくお願い致します。
Pythonのライブラリscikit-learnのLinearRegressionを使ってFX(ドル円)の翌日の価格予想を行ってみたのですが、予測結果が明らかにおかしいのですが、その理由が理解できません。

利用したデータ
https://stooq.com/q/d/?s=usdjpy&c=0
こちらのサイトで2018-01-02から2020-02-19までのドル円のデータを取得

実装したコード

import pandas as pd import numpy as np from sklearn import linear_model price = pd.read_csv('usdjpy_d.csv') #データ数を揃えるのと目的変数に翌日の価格を入れる為にyを一日ずらしています num = len(price) x = price.loc[0:num-2, ["Close"]] y = price.loc[1:num, ["Close"]] #データを7:3で分ける import math cut = math.ceil(num * 0.7) x_train = np.array(x[:cut]) x_test = np.array(x[cut:]) y_train = np.array(y[:cut]) y_test = np.array(y[cut:]) model = linear_model.LinearRegression() model.fit(x_train, y_train) y_pred = model.predict(x_test)

matplotlib.pyplotで実際の価格と予測価格を比べてみると一番最初と一番最後のデータが大幅に違い、それ以外は殆ど同じになりました。
イメージ説明

なにか根本的に考え方や流れが間違っていると思うのですが、理解できません。
書き方の流れや書いた内容に間違いなどありますしょうか。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

予測した結果は、1つ前の値をそのまま出力しているだけです。
一見よく予測できているように見えますが、よく見ると、予測の赤の折れ線は入力の青の折れ線を1時刻ずらしただけであることがわかり、実際は正しく予測しているとは言えません。
質問に対して、答えを知ってから、それを答えているようなもので、一番はじめのデータはその答えがわからないのでデタラメな値が出てきます。

例:
|時刻|1|2|3|4|5|6|7|8|9|10|
|:--|:--:|--:|
|入力|2|4|3|7|5|2|1|8|0|2|
|予測|3|2|4|3|7|5|2|1|8|0|

線形回帰の仕組みは実測値と予測値の誤差を少なくする最小二乗法なので、アルゴリズムとしては意図どおり動いているわけです。

なにか根本的に考え方や流れが間違っていると思うのですが、理解できません。

株価を回帰で予測することがそもそも無理です。
株価は企業の業績や政治、国際情勢などの要因の結果なので、騰がる株を予測したいのであれば、株価のデータから株価を直接予測するのではなく、その要因を分析する方向にシフトしたほうがいいかと思います。(企業の業績データを集めて、分析するソフトを作るとか)

投稿2020/02/20 08:05

編集2020/02/20 08:06
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kaikoko

2020/02/20 09:00

ご丁寧にありがとうございます。 綺麗に予測できているように見えたのは単に答えをずらして表示させていただけだったんですね。 そもそもlinear_model.LinearRegression()の使い方を間違えているという事なんでしょうか? それとも株価の回帰予測というのはこういうものなのでしょうか? よろしくお願いします。
tiitoi

2020/02/20 09:14 編集

LinearRegression() の使い方はあっており、株価を回帰予測しようとすると、LinearRegression() 以外の方法を使っても同様の結果になります。 つまり、「株価そのものを予測する」というアプローチが間違いといえます。 株価を予測するのではなく、株価が変動する要因 (企業の業績など) を分析し、上がりそうな株を探すといった方向を検討されるとよいでしょう。 以下の記事なども参考になると思います。 https://qiita.com/blog_UKI/items/25dc1c2559c61890a449
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問