宇宙は究極のフリーランチ

マネジメント / 意思決定 / プログラミング

株価の値動きをかなり雑にモデリングしてrubyで実装した

2015/02/15追記: 以下の記事の内容は正しくありません。 以下の記事では私の勘で適当に株価の値動きモデルを考えて見ていたのですが、記事を書き終わった後に、実際に使われているモデルについて調べてみたところ、やはり私の適当なモデルは大いに誤っていると言う事が理解できました。興味がある方は「効率的市場仮説」 などのワードをお調べください。特に記事中の「株価に働く慣性の力と周波」については「効率的市場仮説 ウィーク型」として否定されている性質であると言う事が分かり、これはこれで勉強になりました・・・

ここまでのあらすじ

haskellの勉強のために、証券価格(株価とか)の値動きデータが欲しい。
しかし、インターネット上から入手できるデータは何かと制限が多い。

別に実際に証券取引や価格予測をしたい訳では無いので擬似的なデータで良い。
そこで、株価の値動きみたいな数列を擬似的に生成するプログラムをrubyで書いてみた。

なお、私は証券取引について何の専門知識も持っていない
生成の方法は完全にによるものなので注意していただきたい。

結果

最初に、これからこの記事で説明する方法によって得られる擬似値動きデータの一例を以下に示す。

なかなかそれっぽく見える。(と自分では思っている; )
この記事ではこのデータを生成した方法を説明していく。

f:id:Shinya_131:20141214211824p:plain

株価の値動きの構成要素を理解・分解・再構築

長期的な傾向/短期的な傾向

さて、株価の値動きらしき数列を生成するにあたって、
株価がどのような法則によって値動きを行うのか考えてみる。

その上で役に立ったのが、 テクニカルトレーディングの代表的な指標であるゴールデンクロス / デッドクロス という概念である。

移動平均#ゴールデンクロス(GC)とデッドクロス(DC)-- wikipedia

この指標は以下のように売り/買いのシグナルを発する。

長期的な値動きの傾向をあらわす長期移動平均線と、
短期的な値動きの傾向をあらわす短期移動平均線とが交わったタイミングが 売り(または買い)に最適なタイミングである

つまり、

  • 長期的に上がってる株が、短期的に値下がりしていれば買い時 (きっと買ったあと上がる!)
  • 長期的に下がっている株が、短期的に値上がりしていれば売りどき (きっと売らないと下がる!)

という訳である。

さて、この事から、ひらめきというか発見があった。

  • 株価は長期的な値上がり/値下がり傾向と、
  • 短期的な値上がり/値下がり傾向とを持つ

という事である。
ここで改めて株価の値動きグラフを見てみる。

google画像検索: 「株価 値動き」

確かに、そう思って見てみるとそのように見える。
この傾向は移動平均線付きのグラフで見てみるとより顕著だ。

google画像検索: 「株価 値動き 移動平均線」


株価に働く慣性の力と周波

また、一度上昇した株価は、その後下落するし、
ある程度下落した株価は、その後上昇しているように見える。

周波 があるように見える。

おそらく、このような法則が働いているのでは無いか?

1. 一度値上がりしはじめた株価は、上昇し続ける力が働く

値上がりする株は、さらに人気となり値上がりを続ける。
("株価に働く慣性の力"と勝手に名づけた)

2. 株価がある一定のラインを超えると、今度は株価が下落する

株価が上昇しつづけ、その時点の適正な価格を一定以上超えると、
下落が始まり1.と逆方向の力により値下がり続ける。

3. 株価がある一定のラインを下回ると、再び上昇し始め、1.に戻る

株価が下落しつづけ、その時点の適正な価格を一定以上下回ると、
上昇がはじまり1.に戻る。

このようにして 周波 が生まれるのでは無いか?


波長が異なる複数の周波

そして、2.で言うところの「適正な価格」が、

  • 長期的視点では、投資対象企業の実質的価値
  • 短期的視点では、株価の長期的な値動き(トレンド)

で決まる事により、波長の違う複数の周波が現れるのでは無いか?
これが株価が長期的な値上がり/値下がり傾向と、 短期的な値上がり/値下がり傾向を持つ原因ではないか? と考えた。

分解

株価を構成する法則

ここまでの考察により、私は株価の値動きについて以下のような仮説を立てた。

1. 株価は上昇と下降を一定周期で繰り返す(周波)。
2. 波長の違う複数の周波の組み合わさった物が株価である。

さて、このモデルによって擬似的な株価を生成してみよう。


ちなみにこのモデルでは、株価の暴落、暴沸について全然説明出来ないし、
波長の異なる周波数の組み合わせと言っても、どんな形のどんな波長の波で構成されるのか 全然考察されていない。
それどころか、株価のランダム性も全く説明出来ない。
こんな単純なモデルで株価が生成されていたら、株価の完全な予想が可能になってしまう

と、まあ、ハイパー穴だらけモデルであるが、
もともとhaskellでテクニカルトレード指数を計算するプログラムを書くときに、 (そもそもそれだってhaskellの学習のためなのだ!) 転載禁止などの制限が全くなくて、Webサイトからのスクレイピングなどのだるい作業を行わずにデータを用意するための物なのでかまわないのだ。

再構築

さて、上記のモデルにより株価を生成するプログラムを書く。
haskellで書きたい所だがまだ慣れないので使い慣れたrubyで書く。

実装の概要

このプログラムは、以下の3種類の波形を生成できる。
そしてこれらの要素を足しあわせて擬似株価を生成する。

長期周波

f:id:Shinya_131:20141214212938p:plain

短期周波

f:id:Shinya_131:20141214212953p:plain

ランダム要素

f:id:Shinya_131:20141214213011p:plain

このような要素は先ほどのモデルには出てこなかったが ランダム性が無い株価は明らかに不自然なので足しておく ; )

合成

以上を組み合わせて以下のようなデータが得られる。
どうだろうか…? まあまあそれっぽい。

f:id:Shinya_131:20141214213038p:plain

実装

実装を以下に示す。上に書いてある事がプログラムで実行されているだけである。
なお、周波数の幅、高さ、波形などはそれっぽく見えるように恣意的に設定している(;´Д`)

class PriceMovementDummy
  def initialize
    # 生成する値動きの期間
    @steps = 1..100 # 1..100なら、100回分の値動きを生成

    # 長期周波の設定
    @wave_width_coefficient = 15.0 # 波長を決める係数
    @long_wave_scale = 20 # 波高を決める係数

    # 短期周波の設定
    @short_wave_width_coefficient = (15.0 * 0.25) # 波長を決める係数
    @short_wave_scale = 10 # 波高を決める係数

    # マイクロな値動き要因の設定
    @micro_factor_scale = 10
  end

  # 生成
  def generat
    price_move = @steps.map{|step| price(step) }
    to_positive(price_move)
  end

  private

  # ある時点の株価
  def price(step)
    long_wave(step) + showt_wave(step) + micro_factor
  end

  # ある時点の波高を求める(長期周波要因)
  def long_wave(step)
    Math.sin(step / @wave_width_coefficient) * @long_wave_scale
  end

  # ある時点の波高を求める(短期周波要因)
  def showt_wave(step)
    Math.sin(step / @short_wave_width_coefficient) * @short_wave_scale
  end

  # ある時点の波高を求める(ランダム要因)
  def micro_factor
    rand(1..@micro_factor_scale)
  end

  # グラフ全体が正の数になるように切片を加算
  def to_positive(number_list)
    return number_list unless number_list.min < 0

    number_list.map{|i| i + number_list.min.abs }
  end
end

price_movement = PriceMovementDummy.new.generat
p price_movement
#=> [21.327959399617633, 22.654385953596055, 23.969000117050996,...] # ウェーイという感じで100回分の値動きが出力される

まとめと感想

非常に適当ではあるが株価の値動きについてモデリングを行い、それっぽいデータを生成する事ができた。

「株価がどのようなモデルで決定するのか」というテーマについては金融関係の企業や大学などで、 のように研究されている事と思う。

今回はそれらの研究を全く参照せずに素人の勘でやったが、 それらの機関が出している論文などを読んでもう少し理解を深めたいと思った。
(重要な研究成果は公開されていないだろうが、ごく初歩的な情報だけでも、 私の知らない知識でぎっしりに違いない)

また、このテーマに取り組むにあたって、実際の株価とこのモデルの乖離度を定量的に測りたい。という気持ちが湧いてきた。 これについては、そのような事が可能かどうかなのかすら分からないが気が向いたら調べてみたい。