matplotlibが思ったよりははるかに簡単だった件。
0 はじめに
久しぶりに書きます。最初は経緯と方法についてなので、純粋にmatplotlibの使い方について読みたい方は4から読んでいただければ。とはいうものの、データもってくるためのスクレイピングってどうやってやるの、とか、ボリンジャーバンドをpythonで計算するにはどうするの、とか疑問は尽きないと思うんだけど、それはまた別の機会に。
年末ずっとやっていたのが、「東証の適時開示サイトを5分おきに見に行って、『業績予想の変更』がXBRLで出てたら拾ってきて、XBRLの中身が良かったら株の発注する。」っていう取り組み。結果、うまくいったときもあったんだけど、うまくいかないときのほうが多かった。原因はたぶん、①秒の世界で負けていた。②同時間帯に出されたXBRLを上から順に一個ずつ、XBRL読ませる→内容よかったら証券サイトに行って価格チェックして買えたら買う、っていう構成のため、同時に出された有益情報もゴミも取捨選択できなかった、③時系列を全く無視して、つけている株価の1%ぐらいを上乗せして買っているので、売値も買値も適当になってしまった、というところに敗因があるのかな。
で、せっかく動いてるんだから東証動いてる間だけでも稼動させようかなとも思ったんだけど、いかんせん前述③の値動きを拾えてないところに敗因があったんだろうから、これもやめ。まったく新しい戦略に切り替えることに。それは、ニュースで失敗したんだから、ニュースを全く無視して株動かそうっていうもの。具体的には純粋にテクニカルだけで、ニュース性のある動きはまったく無視して、1週間ぐらいの期間で現物の売り買いしようっていう戦略を一週間前に思いついた。で、ついてはチャートかな、と思った次第。
1 matplotlibって何?
pythonでグラフ描画するライブラリです。
丁寧に説明すると、pythonっていうプログラミングする言語があるんだけど、それでグラフを書くためのツールです。
全てタダです。エクセルもいりません。
2 データの入手
さて、元データの入手なんだけど、ちゃんと検討してなくてグレーなところがあるので省略。少なくともヤフーファイナンスじゃないけど、サーバーの強そうな某サイトからのスクレイピング。直近2ヶ月分ぐらいの終値を取得してくることに。
3 指標からの粗選定
日々の終値を拾ってきて、①直近3日で25日移動平均が上昇していること(トレンドの判定)、②5日前より直前の5日移動平均が上昇していること(トレンドの判定)、③25日移動平均と5日移動平均を比べてまだ5日移動平均のほうが低いか(時期の判定)、④終値がボリンジャーバンド2σ以内か(時期の判定)、⑤たぶんここまでいけば当たり前だけど、終値は最終5日移動平均より高いか(時期の判定)、っていう条件でPythonで計算して、残ったものだけをリスト化。2ヶ月分の終値データだけのCSV(チャート作成用)と、①~⑤の検討項目だけのCSV(買い判定用)を作成。たぶん市況によっても変わってくるだろうけど、3%ぐらいまでふるいに掛けられる。
で、ボリンジャーバンド2σ以上の株価っていうのも今テスト中なんだけど、こっちのほうが成績がよかったら、というか1日単位だったらこっちのほうが強そうだなぁ。
4 素人がはじめて使うmatplotlib1:pip install matplotlib
この説明は省略。Pythonで初めて使うライブラリインストールするときのあれ。
ちなみにあたし一切対話型って一切やってない。たぶんmatplotlibに関してはshowとかでその場で開けるんでしょうから、ジュピターブック(つづり分からんぐらい知らない)とか使うといいんじゃないんでしょうか、やってないけど。
5 素人がはじめて使うmatplotlib2:そもそもどんなデータを使えるの?
調べ始めて、まずこれがわかんなくって困ったんだけど、結論は、「配列でもいいし、PandasのDataFrameでもいいしSeriesでもいい。初めて使ったんでよくわからなかったけどNumpyの配列でもいい」みたい。実際今、日付入れないで単純に日時の終値データを並べてる一行もののDataframeをグラフにしてるんだけど、この手の順番が決まってるものだったらy軸に持ってくるデータさえあればいいみたい。
選定用のコードだと、CSVをDataframeに読み込んでるんだけど、評価用のコードだとNumpy配列を読み込んでた。(手探りでやりすぎて、自分が何やってるのかよくわかってない。)
6 素人がはじめて使うmatplotlib3:え、そんな行数でいいんすか?
ちゃんとしている人のちゃんとしている解説を読んでいると、「サイズを決めましょう。単位はインチです。」とかっていう話になって、「ほほう、そうしないと先に進めないんだな」という気になるんだけど、設定しなくても勝手に作ってくれる。(サイズだけは設定したけど。)
前述の4のデータのところでデータを読み込んだ、配列だかデータフレームだかの変数が「data」で、その部分の設定は無視するとたぶん3行で最低限のグラフがかける。
①一行目:インポートします。
import matplotlib.pyplot as plt
書いてる人がポンコツなので写経です。なぜ「.pyplot」をつけるのかはちゃんとしたところで読んで頂ければ。
②二行目:プロットします。
plt.plot(data)
凡例入れたり線種線色変えたり、とか考えなければ、最低限これ。繰り返しになるけど、dataのところは前述4のとおりでなんでもよいし、一度作ってしまえばあとは見栄えの問題でどうにでもいじれるので、初めての人でなにやったらいいのかわかんなければとりあえずplt.plot(”グラフ化したい数値の配列等”)を入れればいい。
③三行目:表示します。
対話型の人:plt.show()
対話型じゃない人:plt.savefig("test.png")
これで表示されたり、test.pngがつくれたり。「対話型じゃない人」用情報が薄かったのでたぶんみんなジュピターブックなんだと思います。
って具合にほら3行で終わり。
7 素人がはじめて使うmatplotlib4:ループでまわすときはclose入れよう。
ここが一番言いたかったこと。どこにも書いてなかったので2時間ぐらい止まってたんだけど、ループでまわすときは
plt.clf()
plt.close()
を最後に入れるっていうのが重要。そうしないと、どんどんグラフに線が書き込まれていくことになるので。
8 結果
3行でできるとか言いながら、タイトル入れて、凡例入れて、ほかの線もガシガシ描画したのが以下のグラフ。でも最初の図さえできちゃって、あと「Pandas 移動平均」とか「pandas ボリンジャーバンド」とかでぐぐって線引けば、こんな感じになるです。
画像でチャートつくることで、チャート流し見して、「よく見たら下げトレンドだった」とか排除できるので、効率的に銘柄選びが進められる。
でも、いまのところ、チャート見る側の眼がそんなにたいしたことないので、全部の答えあわせが必要な段階。
最終的には、チャートの画像診断をpythonでやろうかなという陰謀も遠い未来にあるんだけれど、まだまだあたしにはAIは無理かな。