見出し画像

株式投資にプログラミングを使ってみる!ー パート❶「自分のためにプログラミング」第2弾、”新値買い”のタイミングをプログラミングで検知する!

本シリーズ(全5回)の概要

このシリーズ「自分のためにプログラミング」は、プログラミングで何ができるのかを理解するために、日常の興味や趣味などにプログラミングを利用する例を紹介していくのが目的です。

今回の第2弾では、株式投資にプログラミングを使ってみる例を紹介します。次のような方に是非読んでいただきたいです。

● プログラミングは全くの未経験だが、どんなことができるのか知りたい
● 最近、株式投資に興味が湧いてきている
● 株式投資はそこそこやっていて、プログラミングに興味が湧いてきている

本シリーズ各回の内容は次の通りです。

パート❶ 株式投資戦略の一つ、「新値買い」について勉強
パート❷ Visual Studioの基本的な使い方と、Yahoo FinanceのAPIの利用方法を紹介
パート❸ ”新値買いパターン”をプログラミングで検知する方法を、文系でもわかるように解説
パート❹ ”新値買い"の後、どの程度保有していると儲かるか、コーディングで解明する
パート❺ 勝率が高くなる”新値買いのカップパターン”を解明する

コロナ禍での金融緩和で株式市場が堅調ですが、これを機にプログラミングも株もやってみようという方は是非読み進めてください!

株式投資+プログラミングに挑戦!

プログラミングスキルを自分の趣味や興味に利用する「自分のためにプログラミング」企画として、Webスクレイピング技術を使った「TOEIC英単語1000本ノック」アプリの作り方を解説してきました。プログラミングを英語学習に利用する一例を紹介しています。

今回はそれに続く第2弾として、プログラミングを株式投資に活かしてみます 。具体的には、株価のAPIを利用して過去の株価パターンを分析して、これから値が上がる銘柄を見つけていきます・・・などと言うといかにも胡散臭いのですが、目的はあくまでプログラミングの勉強です。それを「株式投資」という土俵でやるだけのことです。今回のプロジェクトでは次の技術分野について詳しく解説していきます。

● WebAPIの概念と使い方
● 数値データの処理方法
● 簡単なアルゴリズム

WebAPIについては拙著『今すぐ書ける 1分間プログラミング』でも天気予報のWeb APIを使ったアプリ開発を解説しています。

本記事ではWeb APIの使い方については深く掘り下げるほか、株式アプリはデータ処理が中心になります。株をちょっとはやったことがある方は相当モーチベーションが上がると思いますが、株に興味がない方でも面白い話になると思いますので是非ともチャレンジしてみてください。

今回の記事はプログラミングの準備をするためのお話に終始しますが、次回からコーディングをしていくための重要な解説ですので最後まで読んでみてください。

”新値は買い”は本当なのか?

まず、一体株式投資にプログラミングをどう活かすかですが、ネタ元の話から始めましょう。元三洋証券の証券マンで、サンフランシスコやウォール街での経験も含め30年以上も株の世界で生きてきた広瀬隆雄さんという方がいます。現在はフロリダでリタイヤ生活を送る一方、ブログやYouTubeで株式投資に関する考え方やコツなどを惜しみなく披露されています。特に米国株の投資に興味がある方には必見です。

通称「じっちゃま」の広瀬さんが紹介している投資の格言の一つに、「新値は買い」というのがあります。これは、ある銘柄の株価が、過去に記録した高値を更新したというのが「新値」です。特にじっちゃまが強調しているパターンが「コーヒーカップ」のような値動きになった時です。つまり、株価がある時からずるずると下がっていき、低い水準で一定期間推移した後、元の水準まで値が上がっていき、そこからまたさらにちょっと値が下がるというパターンです。

これは決して”じっちゃま”理論ではなく、海外でも広く語られている値が上がっていくパターンで、Cup and Handle(カップと取っ手)と呼ばれています。

画像1

”新値買い”が有効な理由

じっちゃまが言うには、低迷期を脱して新値を付けるというのは、その会社の業績に対する新たな評価が始まったということで、そこから新たな上昇気流が始まるということ。ところが新値を更新したということで損を取り戻そうと1か月程度売り浴びせられる期間があり、それが”取っ手”の形をつくることになります。その後は新たな局面が本格的にスタートし、そこから株価が上がっていくというストーリーです。

つまりこの取っ手期間が終わったあたりで買いを入れると儲かるというのが”新値買い”理論です。

ちなみにじっちゃまはかつて新値更新で株を売っていて、先輩トレーダーにこっぴどく怒られたそうです。高値を更新してここが売り時だと思うのが素人判断で、本当はそこが買いのタイミングであるということを身に染みて勉強したそうです。じっちゃまは様々な数値分析(これをチャート分析と言います)で投資をしてみた結果、どれもうまくいかず、唯一信頼できたのがこのCup and Handleパターンだったそうで、今でもこの値動きには注目しているそうです。

どんなプログラミングをするのか?

ここまで聞くと明日にも何かに投資したいと思うかもしれませんが、ちょっと考えてみて下さい。

❶ そのCup and Handleになっている銘柄って何?
❷ そもそもその理論って本当なの?
❸ 本当だとしてもどうやってCup and Handleを見つけるの?カップの期間はどれくらい?どの程度の深さだといいの?ハンドル期間はどれくらい?取引高とかは見なくていいの?…などなど

そこでプログラミングを使って過去のカップパターンを調べ、本当にその後に買うと儲かったのかを検証します。そこでどのようなカップパターンを定義すると勝率が上がるかも見てみます。

導入技術1:Web APIを使う (Yahoo Finance API)

では何はともあれ過去の株価というのは一体どうやって取得するかですが、サイトには株式データが数多くあるので前回のようにWebスクレイピングを使ってはどうかと考えるかもしれません。ただ、サイトによってはスクレイピングを禁止しているところがあるほか、そもそも10年くらいさかのぼってデータを一気に取得できるようなサイトデータはありません。もっとシステマティックにデータを持ってくるようにしないといけません

そこでここではYahoo FinanceのAPIを利用します。APIの探し方はちょっと複雑で、日本語で提供されているものもありますが、やはり海外のサイトに行けば膨大な数のAPIが利用できます。例えばRapidというAPIサイトをチェックしてみてください。

https://rapidapi.com/

ここはサインアップが必要で、当然英語なのですが、あらゆるAPIが検索できます。その中で株価のデータ取得に便利なのがYahooo FiananceのApIです。

画像2

一つ断っておくと、今回の株価分析は米国の株式を見ていきます。日本の株価をAPIで提供しているところもありますが、そもそも日本の株式市場でCup and Handleのパターンが通用するものなのかどうか不明です。もちろん今回の話で株に興味を持つようになっても、日本で米国株は自由に取引できますのでご安心を。今回勉強したことを日本株に応用してみるのも面白いプロジェクトですよね。

YahooFinanceのAPIを呼び出すサンプルはいくつもありますが、このWeb APIを一からたたく方法をやるとそれだけで大きな企画になってしまうので、ここでは既存のサンプルコードを活用します。C#のサンプルとしてはDennis LeeさんのコードがGitHubで公開されています。

この中から過去の株価データを取得するために必要なメソッドとコードだけを使っていきます。

とりあえずこれで過去のデータを調べる準備はばっちりです。

導入技術2:数値データ処理

過去データが手に入ったところで、次はどうやってカップパターンを見つけるかです。もう一度そのCup and Handleのパターンを見てみます。

画像3

まずAPIからは毎日の株価データを取得できます。株価と一言で言っても場が開いたときのOpening Priceもあれば、その日に引けた時のClosing Priceもあります。さらにその日の最高値というのもあれば、最安値もあります。APIはいろんなデータを出してくれます。とりあえず話を単純にするために終値(Close)を見ることにします。

数値パターンをどう考えるか

まず全体の処理の流れは単純で、過去のある日から毎日の株価終値を見ていきます。例えばGoogleの株価を例にとってみましょう。Googleの銘柄コード(Ticker Symbol)はGOOGです。そこでAPIにこんなことを頼みます。

グーグル(GOOG)の株価を過去3年にさかのぼって毎日の終値を教えて!

するとAPIは、場が開いていない日を除いた二百数十日分の株価を返してきます。それを一日一日読み込んでいき・・・でどうするの?

導入技術3:簡単なアルゴリズム

634, 632, 622, 623, 619, 623, 610, 611 ...

200以上の数字の羅列を見ながらどうするかですが、まずカップパターンとはどんな規則で読んでいけば検知できるのかです。

カップ検知アルゴリズムをどう考えるか?

ではカップの探し方の一例を紹介します。自分の頭の中で上のような数字の羅列を左から右にズズーっと読み込んでいくイメージを頭に浮かべながら読んでいってください。

① まずはカップの左側になっているかどうか見る

カップパターンの第一条件は株価が下がっていくことです。毎日の株価が下がっていく下降トレンドになっているかどうか。そのために毎日の株価が前日より低いかどうかを確かめます。ただ、毎日下がり続けなくても構いません。今日の株価が昨日よりも高くなってもよいのです。株価は普通ジグザグで推移しますから。ただ、最初の起点よりも高くならないことがポイントです。

② 起点より高くなったらリセット

例えば634ドルからスタートして、数日後にポンと635ドルになったらこれはもう新高値です。そう、とても小さいカップです。でもたった数日のカップとしてとらえることはできません。なぜならカップは一定の低迷期を経て徐々に上がって高値更新するのがパターンだからです。そこで、起点から高値を更新し、それがあまりに短い期間だとその部分の値動きを無視し、その一瞬高値を更新した日を新たな起点としてリセットし、そこからまた株価を見ていきます。これを繰り返していくのが今回の基本処理パターンです。

③ カップの底を見極める

カップの左側を見つけるために毎日の終値の推移を見ていく中で、最安値というのも確認していきます。カップ左側では全体的にどんどんと値が下がっていくので、最安値も更新されていきますよね。この最安値が更新されている間はカップの左側から底であるということです。ですから毎日の値を見る時に最安値を更新したらその値も記録しておきます。

④ カップの右側を見極める

こうして安値をチェックしながらどんどんと進んでいくと(繰り返しますが起点の高値は決して更新しません)ある段階でカップの右側に入っていくはずです。その場合、そこからは最安値は更新されないはずです。これがカップ右側に来た証拠です。そこから起点の高値を更新するまで読み続ければよいのです。

もちろん株には「二番底」というのがあります。つまり一度底を打ったかと思いきやまたそこからどーっと下がるような現象です。

画像4

引用:https://tsubame104.com/archives/6819

その場合は再度最安値が更新されることになり、また底の部分を読み続けることになります。この最安値と高値更新ポイントがカップの右側です。

⑤ 最高値を更新したらカップ期間をチェック

カップの左⇒底⇒右という推移がわかってきて、ついに高値を更新したらそこがカップである可能性があります。ただ、今のところ条件が一つ。カップの長さが一定期間以上であることです。そこで大問題はカップの長さはどの程度なのか。それを調べるのも今回の目的です。カップの長さの定義次第で勝率が変わるかもしれません。例えば最低30日とすると、ある銘柄では過去に10回のカップパターンがあり、カップ後に買って儲かるのは10回中7回とします。ところがカップを120日以上とするとカップは過去に7回、そして勝率は100%(つまり全勝)ということもあるかもしれません。ここは慎重に調べてみないといけません。

⑥ ”取っ手”はどうする?

Cup and Handleのカップ部分がわかったらあと一息、Handle部分があるかどうか探します。ただ、これは意外に簡単。カップが検視された段階で起点高値をリセットし、そこから「小カップ」があるかどうか見ればよいのです。もちろんその期間がどれくらいかも大きなポイントとなるかもしれません。本体のカップ期間に比べてどの程度がよいのか、これも勝率との関係からみていく必要がありそうです。

「アルゴリズム」ってそんなものなんです

ここまで話してきたことは大体わかれば十分です。実際にコーディングしていくともっとはっきりと理解できるようになるはずです。ただ、カップをどうやってキャッチするかを考えたわけですが、こうしたものがアルゴリズムというものです。Cup and Handleの検知アルゴリズム。アルゴリズムと聞くとなんだかさっぱり想像すらつかなかった方も、こうして目的をもって数字を見ていく作業をすると、結果的にそれがアルゴリズムだったりするわけです。こうしたデータの見方に対する考えをプログラミングで実際に実行していくところが難しいところで、また楽しいところなのです。今はちんぷんかんぶんでもがんばってついてきてください。

次回のPart 2では

このように、Web APIを使ってデータにアクセスし、アルゴリズムを使ってデータ分析をしていくのが今回の大きな目的です。次回はまずYahooFinanceのAPIが使えるようになるところまで進みます。具体的には次のような関数を作ります。

var history = Historical.GetPriceAsync("GOOG", new DateTime(2009, 1, 1), new DateTime(2020, 6, 25));

GetPriceAsyncというメソッドにGoggleのシンボルGOOGを入れ、いつからいつまでの株価がほしいか、その日付を入れるだけです。これで株価のListデータが取得できます。ものすごく簡単ですよね。まずはこの株価取得の基礎作りをして、そしてPart3からカップ検知のコードを書いていきます。

乞うご期待!

Part 2はこちらです!


この記事が気に入ったらサポートをしてみませんか?