自作の株式売買システムの指示に従い、4日前(8月13日(木))、「フリュー」というアーケードゲーム機等の会社の株を買ったら、今日はこれが非常に高騰している。現在値952円で、1割以上の儲けだ。
表でご覧の通り、過去5年以内に15回取引して1回も損をしていないわけであるから、まず安心な指標パラメータに基づくものの、さすがにたったの2営業日でこんなにリターンが来るのは、ちょっと嬉しいことである。
オッサンは生きている。
東証の時価総額上位300社と、自分の気に入った銘柄70社あまりを売買シミュレーションにかけてみていたが、ふと気づいてスクリーニングしてみると、私が採用している「過去5年で10回以上の売買実績があり、その勝率が95%以上であるもの」が70社そこいらしかないことがわかった。
そこで意を決し、東証の時価総額上位1000社の株価データを持ってきて、計算機の性能が激速になったのを生かしてシミュレーション、その中から残ったものを日常シミュレーションにかけることにした。
昨夜18時51分に株価の取得をはじめて、今13時間あまり。残り2百数十社だ。普段は差分だけをダウンロードする仕組みなのでこんなにはかからないのだが、さすがに初回はものすごく時間がかかる。シミュレーションと違って、株価のダウンロードはデータ提供元である「Yahoo!ファイナンス」の性能に依存しているからである。
シミュレーションは3時間強ほどで終わるだろうと見積もっている。
十何年動かしてきた標記システム。
先日、古いサーバを見限って、セキュリティの堅いデスクトップマシン上の仮想マシンに「Fedora 31」を導入し、その上に移設したところだ。
さすがはCerelonの32ビットから「Devil’s Canyon」ことCore i7-4790Kへの移設だけあって、性能には目を見張るものがある。
前記した通り、前はマシンの性能上の限界から、自分が着目した49個の銘柄を分析の対象としていた。
ところがどうだ。目を見張るようなスピードでカッ飛ぶようになったこのシステム、東証1部上場の時価総額上位銘柄から300社を持ってきて、自分が気になる銘柄71社を合わせた371社合わせてシミュレーションしても、1時間余りで終わってしまう。前のマシンでは20時頃からスタートさせて、23時~24時頃までかかってしまっていたのだ。
これはもう、大幅に手を広げて、株式の売買に励むよりほかない。
自宅で10年以上の間、株式の売買シミュレーションシステムを運用してきた。Linux上で作動する。
以前、このブログでも少し書いたことがあるが、これで多少儲けても来ている。
このシステムは、株価をネットからダウンロードするプログラムをPerlで、これを格納するRDBはPostgreSQL、シミュレーションはCで、ユーザインタフェースはPHPで、というハイブリッド(笑)なつくりである。プラットホームは古いIntel Cerelon D “Prescott-V” 2.66GHzのマシン上に最初Fedora Core 5をインストール、順次アップグレードし、最後はFedora 9となっていた。
2年ほど前からだったろうか、株価をネットからダウンロードするプログラムがうまく動かなくなってしまっていた。株価は「Yahoo!ファイナンス」の時系列データから無料で頂戴してくるのだが、これはデータではサービスされておらず、htmlの中から特徴的なタグに正規表現でマッチングさせて株価を取り出してくる仕組みになっていた。なので、うまく動かなくなっていたのは、さしずめYahoo!ファイナンスの仕様が変わり、htmlのフォーマットなどが変わったのだろう、と思っていた。実際、正規表現でマッチングさせて目的のデータを切り出すコードになっているから、わずかでもhtmlが変わると、途端に消化不良を起こすのである。
原因究明や修理が面倒で、また、しばらく株式も値動きがあまりなくて面白くなかったから売買もしておらず、シミュレーションシステムも放りっぱなしになってしまっていた。
そんな折も折、ここへきて、新型コロナウイルス蔓延により外出の自粛が推奨される事態となった。ために、やむなく家に垂れこめている。平日は仕事に
そこで、意を決して上述のシステムを修理することにした。多分、Yahoo!ファイナンスの仕様、
ところが、その推量は全然違っていた。
株価ダウンロードプログラムは、htmlをダウンロードするのに、CPANの「LWP」ライブラリ等は使わず、Perl内から「wget」を呼び出して使っていた。そうしないとSSLの部分が面倒だからだ。
問題は、このSSL部分にあった。Yahoo!全体の仕様が、TLS1.2未満のSSLを拒絶するよう変更されていたのだ。Fedora 9は、OpenSSL0.9.8までしか対応しておらず、そしてOpenSSL0.9.8はTLS1.0までしか対応していない。
そこまで確かめて、やっと思い出した。私のシステムが動かなくなった2年ほど前というと、ちょうどSSLのセキュリティホールやSHA-1アルゴリズムの
私はその頃、仕事が非常に忙しく、自宅のPC環境など
原因は、wgetとOpenSSLが古い、ひいてはプラットフォームOSが古いことにあった。
最新のFedoraシリーズのバージョンは「31」になっており、そもそも平成17年(2005)発売のCerelon Dのような32ビットCPUには対応していないから、もう、古いLinuxマシンはそろそろお払い箱だろう。
私のデスクトップマシンはCore i7 4790K 4GHzにメモリは32GBをブチ込み、ストレージは1TBのHDDから、先日2TBのSSDに換装したところだ。されば、ここはもう、仮想化しかあるまい。
VMWare Playerをダウンロードしてインストール。非営利であれば無料である。これにFedora 31のisoイメージを本家サイトから貰ってきてインストールする。
動かしてみてびっくりした。私のような商用のSystem V育ちの者にとって、Linuxの「init」システムは長年慣れ親しんだシステムなのだが、Apache2を動かそうと/etc/rc.d/init.d/の下を覗いてビックリ仰天!何も入っていなくて、空っぽではないか!(笑)
こ、これは……!とGoogle先生にお尋ね申し上げ、今は「init」は否定の憂き目にあい、「systemd」というものに置き換わっているということを知る。
「systemctl」というサービス・コマンドの操作を調べ、これでhttpdを動かす。PostgreSQL、PHP、wgetなど必要なものをyum改め、「dnf」で次々とブチ込む。
それから
phpで作られたユーザインタフェースについては、POSTやGETの引数を直接グローバル変数として扱うことのできるかつてのPHPの仕様が廃止されてしまっており、そのままでは動かなくなってしまっていたが、そこは
SELinuxを調整しないとPostgreSQLとPHPが協調動作しないなど、多少ひっかかったところもあったが、元の通り株価売買シミュレーションシステムは作動するようになった。
さすがは Core i7 だ。生マシンから仮想マシンへの移設とはいえ、もはや
もともとこのシステムでは、過去5年分の株価データに対し、8900通り×49銘柄の売買シミュレーションを行っていた。Yahoo!ファイナンスに株価の整理値が出揃う20時50分頃から「cron」でこのシステムを起動していたのだが、これだけの組み合わせのシミュレーションを行うと、全部終わるのは23時くらいにはなってしまっていた。
ところが今回の移設で、それらシミュレーションがなんと10分ほどで完了するようになった。かつて誰かが言っていたが、「稚拙で鈍足なアルゴリズムでも、意外にマシンパワーの進歩で解決されてしまう」ということの実例を目の当たりにした次第である。
さて、そのようにしてシミュレーション結果を見てみると、やはり、新型コロナウイルスの影響で、相場は鉄火場と化している。大変な勢いで売買指標が出ている。これは大変だ。
今この鉄火場に飛び込むのは危険である。ウイルス禍が一段落し、上昇相場になったところからが勝負だろう。
もう10年以上くらいにもなるだろうか、株式売買の指標表示を自動化し、「小魚を釣る」ようにして株を売買している。ところが、先週頃から、その自動化システムが動かなくなってしまった。
私の株式売買は、夜に自作の株式売買シミュレータを作動させ、そのシミュレーション結果に従って手動で翌日の注文を出すという方法だ。注文そのものの自動化もやればできるだろうが、証券会社がAPIを公開してでもくれない限り、多少技術的な敷居が高いので、そこまではしていない。
株式売買にはいろいろな指標があるが、その指標を使うのに必要な日数などのパラメータは、銘柄ごとに違う。また、指標ごとにも違うので、色々な組み合わせが出てくる。サラリーマンの場合、何十もの銘柄について、銘柄ごとに手作業でそんな組み合わせ作業を毎日している時間など、あるはずがない。
そこで、色々なパラメータを組み合わせて、過去のデータを使って売買のシミュレーションを行うのだ。トレーディング用語では「バックテスト」と言う。私のシミュレータでは、現在は1銘柄につき約1万通り程度の組み合わせで売買を試す。
そのシミュレーション結果で、「90%~100%成功するパラメータの組み合わせ」を抽出して表示するのである。実際のところ、そのパラメータの組み合わせで売買サインが出た時に売買すれば、まず9割は儲かる。1割の確率で損をするのだが、これは10銘柄を束にして注文しておけば、「1銘柄はハズレでも、残り9銘柄は当たり」になる。つまり、期待値として「9割は儲かる」理屈になるわけである。
だが、私が最も工夫した点は実はそこではない。
私は勤めており、職務に専念する義務がある。これはサラリーマンなら誰でも同じだと思う。仕事中に株式の売買などすれば、免職になってしまう。そこで、このシミュレーションは、売買サインをリアルタイムの株価で出すのではなく、「前日までの株価でシミュレーションし、翌日約定の注文を出した場合で最適なパラメータの組み合わせ」をシミュレーションにより求める。こうすることで、「前日の夜から当日の朝にかけて、自宅で注文しておく」ことができる。つまり、「サラリーマンが職務外の余暇に自宅で自分の金融資産の管理をしているだけ」という形を整えることができるのだ。
多くのサラリーマンは株で損をするが、それは、株式の必勝本などには、「今の株価」で売買しなければならないような方法しか書かれていないからだ。これだと、例えば、ある日の経済ニュースなどでその日の株価について知り、夜帰宅して、翌日の注文などを出しても、もう手遅れなのだ。だが、私のシミュレータは翌日の注文で十分なように計算するので、サラリーマン向けなのだ。
シミュレーションに必要な日々の時系列データは、「Yahoo!ファイナンス」から無料で拝借してくる仕組みである。夜にその日の終値が確定した頃、自動的に株価をダウンロードしてくる。無料で済ませるため、生のhtmlを持ってきて株価データをその中から切り取り、データベースに格納する仕組みだ。
システムはLinux上で動作する3層クライアントサーバシステムである。ユーザインターフェイスはphpで書かれており、Webサービスだ。株価データは、Perlで書かれたスクリプトを定期起動して、前述のようにしてネットから無料で持って来る。データベースはPostgreSQLを使用している。シミュレーションは高速化を図るためCで書いてある。
ここ数年、何ら不調なく快調に作動していた。ところが、先週から急に動かなくなってしまった。
短期の株式売買は毎日の値動きに注意していなければならない。私はこの値段の監視を自動化していたわけだ。ところがこれが動かなくなるとお手上げだ。自分で毎日株価を見なければならなくなってしまう。私もそれなりに忙しいので、何十銘柄もの株価チェックを自分でするなんて馬鹿々々しいことは御免である。
早く原因を調べなければならなかったが、春の人事異動で職場が変わったりして、手が付けられないでいた。ようやく、今日になって原因を調べることができた。
調べてみると、どうやら、株価データの拝借先である「Yahoo!ファイナンス」の仕様が変わったようだ。これまで非SSLでもサービスしていたのだが、先週頃完全にSSLに改まったらしい。他方、私の「株価データ拝借スクリプト」はPerlで書いてあり、内部で「wget」を呼び出し、これを用いて「時系列株価ページ」を持って来て、その中からデータを切り出す仕組みなのだが、ハードコーディングしてあるURLのスキームは「http」なのである。
なるほどよしきた、とばかり、これを「https」に変えて試したが、wgetはブラウザのように簡単にはSSL証明書を扱うことができない。
ググッてみると、「そういう時にはwgetのオプションに『––no-check-certificate』って書いとけ!」と、どなたかが既に調べて書いておられる。ありがたや。
そこで、作動させるwgetのコマンドラインは次のようになるわけだ。
$ wget --no-check-certificate -q -O - https://info.finance.yahoo.co.jp/history/?sy=1983&sm=1&sd=1&tm=d&code=銘柄コード&p=1 | nkf -w
URLのスキーム部分を「https」にし、「––no-check-certificate」にするだけである。
株価時系列データのページの作りが変わってしまっているとこれだけでは駄目なのだが、どうやらページの作りは同じらしく、今のところうまく行っているようだ。
今度の大暴落、さすがに少々損をした。一つは20%、もう一つは17%。
自作の「株式売買ユーティリティ」は、澄まして損切りメッセージを出してくる。
7年前の「リーマン・ショック」の時は、このメッセージに従わず、大損をしてしまった。システムが自作であるため、かえって自分のプログラムを信じることができず、ニュースや新聞の記事などから「ここは過敏に行動すべきではない」などと考え、つい買い建玉を持ったままにしてしまったのだ。失敗だった。
今回はその時の教訓を守り、無情に損切り。冷徹に自作プログラムを信じ、その指示にのみ従う。損切りにあたって、新聞やニュースの論評は一切参考にしないことだ。ブン屋より私のプログラムのほうが正しい。
今回の暴落では「売り」から入ったので、その分の儲けもあり、傷は浅い。