目次。
なんかどっかの高級料理の名前みたいなタイトルをつけてしまった。○○と××に△△を添えて、みたいな。
株式自動売買プログラムの開発が一段落したので、出力結果をTwitterに自動投稿するプログラムもついでに書いた。これだけでは、話がすぐに終わってしまうので、Twitter botの話をざっくりとした。また実は、botの話と関係があるので一時期、流行ったTwitterアカウントの乗っ取りの仕組みについての話もちょっと織り交ぜた。
この文章を読んで、面白い!役に立った!...と思った分だけ、投げ銭していただけると嬉しいです。
【宣伝】ギターも歌も下手だけど、弾き語りをやっているので、よければ聴いてください。
株式売買シグナルを投稿するbotの取扱説明書。
Twitter APIのラッパーであるtweepyというPythonライブラリを使った。昔、Twitter APIを直接ゴリゴリするコードを書いたことがあるのだが、直接いじくるのは面倒くさかったので。アカウントのアイコンは、株式自動売買のプログラム開発に使っているVAIO A12というノートパソコンの写真(以下の記事、実はGoogle検索経由で結構読まれている)。
買いシグナルを知らせるツイートはこんな感じ。
売買は自己責任で!
— 株式 売買シグナル (@AutoStockRepo1) August 10, 2019
【買い注文】 ver:X.X.X
●●●●年●●月●●日 ●●時●●分
×××× ○○○○○
△△△,△△△円(100株)#株式自動売買プログラム開発#シストレ
一方、売りシグナルを知らせるツイートはこんな感じ。対応する買いツイートに返信する形でツイートしている。
売買は自己責任で!
— 株式 売買シグナル (@AutoStockRepo1) August 10, 2019
【売り注文】 ver:X.X.X
●●●●年●●月●●日 ●●時●●分
×××× ○○○○○
△△△,△△△円(100株)
利益: ■■,■■■円(100株)#株式自動売買プログラム開発#シストレ
買いシグナル、売りシグナルの双方にあるver:X.X.Xというのは、売買アルゴリズムのバージョン。小規模なアップデートを行ったら末尾の番号、大規模な場合、2番目の番号を1つ増やす。根本的なアルゴリズムが全く違う場合、一番左の番号を変えてそれを表す。
2019年8月時点の進捗等々。
とりあえず、株価データの取得、解析、それをもとにして株を買うか否かの判断をするところまで開発を進めた。この文章を書いている今は、自動売買の一歩手前の段階。
株の売買注文を証券会社のサーバーに送りつけるコードを書く前に今まで開発したプログラムが安定的に動作するかどうか検証し、どのようなエラーを吐くか情報を集めようと思う。ついでに出力結果をTwitterに投稿したら、僕の試みが世間に知れ渡って、何かしら面白い化学反応がおきるんじゃないかと思い、Twitter botも開発した。
今まで、自動売買のプラットフォーム開発に注力していて、肝心の売買アルゴリズム開発には、あまり力を割いていない。今のところ前のブログで紹介した移動平均線を使って、株の売買のタイミングを決めている。
そんなわけで、見てもらえれば分かる通り、現在のプログラムはひたすら損失を出し続けている。売買アルゴリズムは、ものすごく単純で上手くいかないと思っていたが、ここまで上手くいかないとは思っていなかった。ぐぬぬ。。。
Twitter botを作るには。
Twitterで自動投稿する話をしたので、ついでにTwitter botを作るにはどうすればよいかというざっくりした話を。僕がTwitter botのプログラムを初めて書いたのは、高校2年生のとき。使用言語は、PythonではなくJava。そして、Twitter botが僕が初めて開発したプログラム。その話をし始めると、自動株式売買とは関係ない方向へ進んでしまうので割愛。また別の機会に文章を書こうと思う(以下の記事でちょろっと書いたが、今度またいつかしっかり書きたい)。
自動投稿サービスを使う。
これが一番手っ取り早い方法。「Twitter 自動投稿」とかで検索すれば、たくさん無料のサービスが出てくる。ただし、これらはTwitterの公式が提供しているサービスではない。僕も昔、一瞬だけ使ったことがある。投稿したい内容と時間をあらかじめ、設定しておけば、自動でその内容が投稿されるというもの。
ただ、できることに制約がある。あらかじめ設定した時間にあらかじめ設定した内容しか投稿することができない。今回みたいに自分が開発したプログラムの出力結果を結果が得られ次第、ツイートするといったことは、一般的な自動投稿サービスではできないと思う。あとは、自動フォローにも制限がある。一日、何人までしかフォローすることができない。もっと自動フォローしたかったら金を払えと言った感じ。
自分でプログラムを開発する。
昔、一瞬だけ自動投稿サービスを使ったことがあると言ったが、あまりにもできることに制約があって、イライラしたので高2の頃、自分でプログラムを書き始めた。
Twitter botのプログラム開発に関する細かい情報は、ネットに大量に溢れているので、ここでは、ざっくりとしたことだけ。これから説明するのは、OAuth認証+Twitter APIを使ったTwitter botの話。
Twitter developer。
Twitterを利用したプログラムを組む場合、通常、Twitter API(プログラミングを楽にする魔法の道具)というものを使う。APIを使うためには、まずTwitter developerのページから利用申請を行わないといけない。一度申請を行えば、後は好きにAPIを使える。
僕が申請を行ったのは高校生の頃なので、手順はほとんど覚えていない。この文章を書くために申請方法などを調べていたのだが「あれ、こんなに申請って厳しかったっけ」ていうのが、正直な感想。昔より申請がものすごく面倒くさくなっているような気がする。
僕が高校生の頃、OAuth認証+Twitter APIを悪用したアカウント乗っ取りが流行った。きっとそのせいで申請がものすごく面倒になったのだと個人的には思う。厳しくなったおかげで最近はTwitterアカウントの乗っ取りはかなり減った。
僕は、Twitterのアカウントを20個以上持っていたので、高校の頃、リンク付き英文ダイレクトメッセージを大量に受け取っていた。リンクは、OAuth認証の許可画面に続いており、何も考えずに承認ボタンを押すとアカウントが乗っ取られるという仕組み。
僕が申請したプログラムは以下の2つ。
xcharbotというのは、僕が初めて開発したプログラム。二つ目は、高校生の頃、ネット転売していた時に開発したプログラムの出力結果をTwitterに自動投稿する目的で開発したプログラム(高校の頃、あまり深く考えずにつけたプログラム名が商標的にアウトな気がしてきたのでモザイク)。
ちなみに株式自動売買プログラムの結果は、初めて行った申請(xcharbot)で手に入れたOAuthのkey、token(後で説明)を使って投稿している。
新たにAPIの利用申請をしようと思ったのだが、面倒くさそうだったので、大昔に申請したやつを使い回した。
OAuth認証。
実は、IDとパスワード(Basic認証)以外でもTwitterにログインできる。それがOAuth認証。OAuth認証に必要なのは、Consumer key, Consumer secret key, Access token, Access token secretの4つ。実は、スマホでTwitterを見るときは、OAuth認証を使っている。OAuth認証は別にTwitter特有のものではない。FacebookとかInstagram とかGmailとか、他の諸々にもOAuth認証でアカウントにアクセスする仕組みがある。
OAuth認証の利点は、アカウントを制御する権限を制限して渡せるということ。例えば、自動投稿サービスを利用するためには、自分のアカウントで勝手にツイートしてもいいですよ、という権限を自動投稿サービスに与えないといけない。すぐに思いつくのは、IDとパスワードを渡す方法。IDとパスワードを渡せば、自動投稿サービスの人は、アカウントにアクセスして自動投稿することができる。けれども、IDとパスワードを渡すということは、アカウントの全権限を渡すようなもの。最悪の場合、パスワードを変えられて乗っ取られてしまう。自動投稿サービスに必要なのは、勝手にツイートする権限だけ。じゃあ、全権限(ID、パスワード)を渡すんじゃなくて、勝手にツイートする権限だけ渡せばいいんじゃないかという話になる。そして、それがOAuth認証。
とまあ、こんな感じのOAuth認証だが、認証に必要なのがIDとパスワードではないというところを逆手にとって、Twitterのアカウント乗っ取りに悪用されまくっていた。ユーザーをOAuth認証の許可画面に誘い込んで、何もわからないユーザーはとりあえず「連帯アプリを認証」というボタンを押す。そしてアカウントが乗っ取られるといった具合。勝手にツイートされているユーザーは焦ってパスワードを変えるも、そもそもIDとパスワードを使ってアクセスしているわけじゃないので効果なし。OAuth認証のAccess tokenとAccess token secretを無効にすれば解決するが、そんなものを知っている人はほぼいない。ということで、アカウント乗っ取りは流行った。今は、色々厳しくなったような気がするので、アカウント乗っ取りはものすごく減った。
Twitter API。
APIは、Application Programming Interfaceの略。APIとは、Twitter側が用意している、プログラマとTwitterをつなぐ窓口のようなもの。Twitter側からTwitterの○○を使いたい場合、××をしてくださいといった約束事が一覧としてプログラマに提示されていて、プログラマはそれに従ってTwitterを利用するプログラムを作成する。
OAuth認証じゃないとTwitter APIが使えない。ゴリゴリと書くと面倒くさいので、Twitter APIを使いやすくしたラッパーを使うのがおすすめ。JavaでTwitter botを開発したときは、Twitter4j、Pythonでは、tweepyを使った。
と言っても、一回だけゴリゴリと書いたことがあるので、ついでにその話(読み飛ばした方がいいかも)。
Twitter APIはHTTPのPOSTメソッドを使って送る。最低限の要求ヘッダだとTwitterは受け付けてくれないので、それに加えてoauth_consumer_key(さっき出てきたConsumer keyのこと。ここら辺は、用語が統一されていない)、oauth_token(さっき出てきたAccess tokenのこと)をはじめとして、色々と必要なパラメータを揃えないといけない。要求ヘッダのパラメータが揃ったら、それらをアルファベット順に並べて、パーセントエンコーディング。Consumer secret keyとAccess token secretを&で繋げたものを秘密鍵として要求ヘッダからHMAC-SHA1でハッシュ値を計算。計算したハッシュ値はバイナリなのでBase64でエンコーディングし、それを署名として、要求ヘッダに張り付け、サーバーに送る。そして、やっとTwitterは言うことを聞いてくれる。Consumer keyはAPIを使うプログラムを識別し、Access tokenはプログラムによって操られるアカウントを識別し、それぞれに対応するsecretは特定のプログラム×特定のアカウントのペアに固有の秘密鍵となっている。この秘密鍵を使ってハッシュ値(暗号みたいなもの。ただ厳密には復号できないので暗号ではない)を計算することによって、悪意のある人によるリクエストの改ざんを防いでいる。秘密鍵を知っているのは、プログラマとTwitter側のみ。第三者は、秘密鍵を知らないので、改ざんしても改ざんしたメッセージから正しくハッシュ値を計算することができない。リクエストがTwitterのサーバーに届くと、Twitter側でもう一度、ハッシュ値の計算が行われ、出てきた値が署名の値と一緒であれば、リクエスト改ざんされてないとされ、ちゃんと受け取ってくれる。
と色々書いたが、あなたがスマホでTwitterを見ている傍らで、こんなややこしくて面倒くさいことが毎回、何回も行われている。こんなことを考えなくて済むのでAPIラッパーはおすすめ。
僕が書いた内容は、公式のTwitter developerのサイトに書いてあるので興味のある方はどうぞ。
この文章を読んで、面白い!役に立った!...と思った分だけ、投げ銭していただけると嬉しいです。