Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
262
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

過去のデータからビッグデータ分析で株価を予測する

今日は 15 年ぶりに日経平均が 19,000 円台を一時回復し、 6 月末までには 2 万円に達するのではとの声も出ていますが、そんな中ビッグデータ (笑) 分析で株式の分析をする話です。

効率的市場仮説

金融の世界には効率的市場仮説というものがあり、どのような情報を利用しても他人よりも高いパフォーマンスを継続してあげることは不可能であるという説があります。これほど誤解されたりあるいは都合良く解釈されたものはないと筆者は考えます。

この辺は効率的市場仮説のパラドックスあたりを読んでいただくと良いでしょう。

普通に考えて、たとえばなぜ証券業界のディーラーやファンドマネージャーが現役で職を保っていられるのか、みんながみんなバフェットの真似をしてみんながお金持ちにならないのはなぜか、などなど考えていけばわかりそうなものです。

賛否両論はこのあたりを読んでいただくとして (ちなみに筆者はアンドリュー・ロー教授の考え方に近いです) 、いずれにせよテクニカル分析の有用性を否定するものではなく、むしろ取引市場の分析において基礎となりきわめて重要なものです。

みんなが血眼になって財務諸表を分析したり、テクニカル分析をしたりしているという中で、うまいこと本来の価格より安い株や証券を見つけ、本来の価格より高い状態で売るということができるか。これはみんな必死な中でなのでとても難しいことなわけです。しかし、だからといってテクニカル指標を見なくて良い、というわけではありません。

これは極論すればビジネスにおいて通用する一般的な話で、他のライバル企業に無い何かを強みとして持つことで差別化を図る (新規市場の開拓) 、次第にどの会社も同じやり方をするようになって競争が生まれたり激化したりする (コモディティ化) 、競争激化の果てには価格低下と疲弊が待っている (レッドオーシャン) というような話に通じるものが有り、一般化できるかと思います。

つまり、なぜデータ分析するのかといえば、ライバルに差を付けて勝利するための材料を見つけ役立てるためという目的であると言えます。

分析対象データの取得

ビッグデータという言葉がバズワード化して久しいですが、今は Yahoo! ファイナンスのようなサイトがありますから、過去の株価データを集めることは簡単です。しかも計算機の性能が発達し、無料の統計用言語 (R や Python など) を誰でも自由に利用できますし、また統計や機械学習といった知識もインターネットに情報があふれていますから、過去のデータに対して統計分析をおこない傾向を調べるといったこともどんどん敷居が下がって誰でもできるようになりつつあります。

実際に現役のファンドマネージャーやアナリストの中には、たとえば過去 15 年分の株式のデータから統計を調べ、どのような局面ではどのような傾向になる確率が高いかといったことを調べる人も増えてきています。このような時代に過去データを調査しないことは、それだけでたライバルに差を付けられていることになります。

とはいえテクニカル指標や統計は、絶対のものではありません。テクニカル指標はあくまで数値で対象を明らかにするもので、それがどのような因果関係になっているかは人間が考えるしかありません。この話は統計学において何が原因で何がその結果であるかそれが必ずしも現実社会では明らかではないという話にも共通するかと思います。

Ruby で日本国内の株価のデータを取得する話は以前にも書きましたが、分析は Python でおこないますのであらためて Python/Ruby 共に同じ形式でデータを取得するように共通化しておきましょう。

株価を取得するサンプルコードはこちらに用意しました。これを第一引数に銘柄コード、第二引数に日付 (2015-01-01 など) して実行すると株価のデータフレームを .csv ファイルにして以下のような形式で保存します。


,Open,High,Low,Close,Volume,Adj Close
2015-03-11,2300.0,2329.0,2289.0,2299.0,106100.0,2299.0

このうち重要なのは Adj Close (調整後終値) です。終値の時系列連続性を確保することは時系列データ分析において必須であるため、調整後終値を出力しないツールは使えないと言われるほど株式分析においては必須であり重要なデータ項目です。

テクニカル分析の主な指標と pandas による算出

株式分析をするにあたり、まずは基本的なテクニカル指標をおさえておきましょう。

これを解説しているサイトは多々ありますが、主観で選ぶとカブドットコム証券のサイトがわかりやすいです。

第1回 数多くあるテクニカル指標を体系的に解説
http://kabu.com/investment/guide/technical/01.html

テクニカル指標にはおおざっぱに言うと、トレンドを把握するための「トレンド系指標」、ふだんとちがう動きをすることを察知するための「オシレータ系指標」があります。このあたりどれを参考にするかは人にもよりますし、巷のツールを利用すれば表示してくれるのですが、どの数字がどういった根拠 (= 数式) で導き出されているかはきちんと頭にいれておいたほうが良いでしょう。何か疑問に思ったら自力で計算して検証するといった姿勢が求められます。

ローソク足と移動平均線

トレンド系指標のもっとも代表的なローソク足と移動平均については、ローソク足チャートと移動平均線のプロットとして以前に書きましたので、さっそく弊社と似た企業である NTT データ社の株情報をプロットしてみます。

stock_9613.png

今回は指数平滑移動平均を 5, 25, 75 日単位でプロットしてみました。

RSI(Relative Strength Index)

次にトレンドの変化を察知するためにオシレータ系指標の中でも特に代表的な RSI を求めてみます。計算方法はリンク先に解説がありますので省略します。

def calc_rsi(price, n=14):
    gain = (price - price.shift(1)).fillna(0)

    def rsiCalc(p):
        avgGain = p[p > 0].sum() / n
        avgLoss = -p[p < 0].sum() / n
        rs = avgGain / avgLoss
        return 100 - 100 / (1 + rs)

    return pd.rolling_apply(gain, n, rsiCalc)

rsi_9613.png

このような形になりました。この指標は一般的に 70 を越えると買われすぎ、 30 を下回ると売られすぎと見ます。こういった指標は基本となるローソク足チャートとあわせてサブプロットを利用して上下 2 段組みにするなどするとより見やすいでしょう。

銘柄の値動きと日経平均株価との移動相関を求める

ここまではごく代表的なテクニカル指標を求めてみました。単にこれらを計算して表示するだけであれば、巷にたくさんある便利な株式ソフトウェア等をインストールして使うだけでたやすくできます。

大切なのは前述したようにライバルである数多くの投資家に無い目線でさまざまな角度から対象を分析していこうという視点です。

たとえば、本日は日経平均が 267 円も上がったわけですが、あらゆる銘柄が日経平均と相関関係が高いわけではありません。そこで、自分の関心のある銘柄がどれくらい日経平均と連動しているか気になることもあるでしょう。これを調べるために各銘柄の騰落率と日経平均との移動相関を計算してみることにします。

def rolling_corr_with_N225(stock, window=5):
    d1 = pd.read_csv("".join(["stock_", stock, ".csv"]), index_col=0, parse_dates=True)
    d2 = pd.read_csv("stock_N225.csv", index_col=0, parse_dates=True)
    s1 = d1.asfreq('B')['Adj Close'].pct_change().dropna()
    s2 = d2.asfreq('B')['Adj Close'].pct_change().dropna()
    rolling_corr = pd.rolling_corr(s1, s2, window).dropna()

    return rolling_corr

まずはソーシャルゲームで一躍大躍進したことでも知られるガンホーの株価と日経平均との移動相関を求めて可視化してみます。

stock_3765.png

corr_3765.png

1 に近いほど相関があるわけですが、このようにソーシャルゲームの銘柄はどうも日経平均との相関はそれほど高くないとわかります。

一方 NTT データ社の場合はどうか同じく試してみましょう。

corr_9613.png

なるほど、こちらはだいぶ相関が高いようですね。

銘柄ごとの特色が少しだけ分析できました。

ビッグデータ分析による株価変動予測の例

ここでケーススタディ的に、あるアナリストの予測とその結果を掲載させていただこうと思います。大日本住友製薬 (4506) の 3 月 9 日 (月) の例です。

大日本住友製薬:15年間で4,057回、合計5149.70%も値下がりしたチャート形

この銘柄は先週末にあたる 3 月 6 日 (金) に 1 日で 12.49% の株価が上昇し値上がり率トップランクに躍り出るといった値動きをしました。この日、野村証券がこの株の投資判断を最高位として目標株価の引き上げをおこないました。

このアナリストは過去 10 数年分の株式データから統計的手法で分析することを得意とされているようですが、上記リンク先の紙面にある通り、似たチャート形は 4,057 回中、 2,517回も値下がりし、日中に株価が下落した確率が 62.04% ということから危険視をしました。

(紙面の掲載は 8 時 44 分であり 3 月 9 日の寄り付き前)

実績としては果たして 3 月 9 日には初値でいきなり 1,600 円の高値を付けた後、終値は 1,488 円まで下げましたから、予想は大正解だったというわけです。

stock_4506.png

このように過去のデータから傾向を分析し、目先の値動きを予測して当てるのも、ある意味ビッグデータ分析と言えるでしょう。

余談

証券業界は 96 年に当時の橋本首相が提唱した「日本版ビッグバン」、その後 99 年に規制緩和により株式の仲介手数料が完全自由化となりました。とくに、この完全自由化にともなってネット証券が台頭し、手数料が先進諸国の中でも最低水準にまで下がってきたということもあり、いまや個人をはじめとする多くの投資家はネット取引が主流です。

また計算機資源も安価になり、かつては高価だった統計分析ソフトウェアもいまや R や Python など誰でも無料で使えるプログラミング言語で代用ができるようになってきています。

資産運用でよく言われるのは自分の運用スタイルを持てという話なのですが、自分の運用スタイルとは何か迷いが生じた時に考えの拠り所となる柱があるということです。このようなときに、その場の局面で右往左往せず、冷静な判断を下すためにはテクニカル分析が非常に有用になります。感情的な判断を排し、冷静に数値を見ることで、予想外の失敗を抑えることもできます。

もちろんデータ分析はどんな不測の事態をも防ぐ銀の弾丸では無いのですが、このような時代においてデータ分析をしない理由はありません。そしてこれは単に株式分析だけにとどまらず、経営戦略の策定であるとか、さまざまなビジネスにおいても同様に言えることではないかと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
262
Help us understand the problem. What are the problem?