ツイッターbot作成の道(その6): GoogleSpreadSheet
ツイッターbotを作る技術として、最後に残るは更新されるや否や呟く。
そのためには、更新されたかどうかを判定するために過去の情報をストックしとかないといけないわけです。
第4回ではjsonファイルに保存しようとして見事に失敗したわけですが(ツイッターbot作成の道(その4) - 栗’s diary)、アプリ外に保存場所を確保しないといけません。
GAE経由でデータを残す方法としてちょっとググった所、GQLとデータストアってのがありました。
GAEのデータストアを使ってみました - 主にプログラムを勉強するブログ
これら記事によると、GQLってのはSQLを使い慣れた人用、じゃない人はデータストアらしいです。
これらの技術は、後々使うかもしれません。ただ、使い慣れたもので容易にデータを確認したいと思った栗氏。またYahoo! Financeから金融関係の情報を引っ張ってこられるので使いこなしておきたいとも思った栗氏。
データの保存場所にGoogleSpreadSheetを使ってみる事にしました。
初期設定方法はPython3でGoogle SpreadsheetをDBのように利用するを参考に。思った以上に面倒。
スプレッドシート側で共有設定したり。
正直、何やってるかよくわからないまま言われるがままに設定したらとりあえず初期設定完了。(説明がなかった部分として、サービスアカウントは「App Engine default service account」で。メールアドレスもなかったのでJSONファイルをテキストエディタで開いてゲット。)
ソースコードはこんな感じに。
import gspread from oauth2client.service_account import ServiceAccountCredentials scope = ['https://spreadsheets.google.com/feeds'] credentials = ServiceAccountCredentials.from_json_keyfile_name('[ダウンロードしたJSONへのパス]', scope) gc = gspread.authorize(credentials)
doc_id = '[スプレッドシートのURLからコピーした文字列]'
gfile = gc.open_by_key(doc_id)
wsheet = gfile.worksheet(シート名)
records = wsheet.get_all_records()
指定シートのデータを無事に取得できました。
credentialsを取得する方法はUsing OAuth2 for Authorization — gspread 0.3.0 documentationを参考にして、.from_json_keyfile_nameを利用。
両サイトにある「from oauth2client.client import SignedJwtAssertionCredentials」は古いようで、python - ImportError: cannot import name SignedJwtAssertionCredentials - Stack Overflowの回答欄を参考に「from oauth2client.service_account import ServiceAccountCredentials」を使用。
具体的にデータをやり取りする方法は以下のサイトが参考になりました。
[Python] Google SpreadSheetをAPI経由で読み書きする - YoheiM .NET
gspread API Reference — gspread 0.3.0 documentation
GAE上でやる場合には、ImportError: No module named gspread から始まって色々なmoduleがないって言われるので都度追加してあげる。ラスボスとして前回記事のようなエラーに遭うかもしれないのでご注意を。
ツイッターbot作成の道(その5):Libraries
前回、アプリ内にデータを保存するためにjsonファイルの使用を試みた栗氏。GAEの仕様として書き込み不可である事を後で知ってショックを受けたわけですが、仕方なくデータベースの使用を考えます。
詳細はまた別の機会に書きますが、とりあえずGoogleスプレッドシートを使ってみる事にしました。どうにかこうにか通常のプログラミングではデータのやり取りに成功。次はローカルでのテスト。その時、また奴が現れたのです。
「ImportError: cannot import name RAND_egd」
ツイッターbot作成の道(その1) - 栗’s diaryで「Tweepy(失敗)」という所でも出てきた難攻不落の敵。(ググるとコメントアウトなどで上手くいくよという記述が見られるが、なぜかそれが通用しない。コメントアウトしてコードとしてはないはずなのに、エラーと注意される。わけわからん。)
どうやらtweepyもgspread(Google スプレッドシートを扱うのに便利なモジュール)も結局、requestsモジュールを使う際にエラーになってる模様。
前回は避けて通ったが、今はこいつをやっつけないと将来使うかもしれないいくつかの便利なモジュールも使えないだろう事に気付いてしまっていた。
Using Built-in Libraries in Python 2.7 | Python | Google Cloud Platform
You can add a third-party library to your app in one of two ways: requesting the library or installing the library.
GAEで標準では使えないモジュールを使えるようにする方法は二つあって、一つはapp.yaml内にlibraryとして登録する。ただし、これはGoogleが許可したものであってかなり限定されている。もう一つは、アプリフォルダにそのモジュールを機能させるために必要なファイルも一緒に入れてアップロードするという方法。この場合もCで拡張してるものは無理。
The library must be implemented as pure Python code with no C extensions.
この条件によれば、requestsはアップロードする形で導入できるはず。なのに出来ないのは何か解決策があるはず...。
結果から述べると「ImportError: cannot import name RAND_egd」はやっつけられませんでした。つまりローカルではエラー。ただし、無視してDeploy(アップロード)しアプリとしては上手くいく方法を発見できました。requestsに特化した解決方法ですが。
you must replace the following line in your requests/models.py file :
「ChunkedEncodingError」ってのはDeployしたアプリを実行した場合に発生するエラーでそれでググってみました。かなり強引な解決方法だな...。Python2系に限定しているからこう言うエラーが発生するんですかね、知らんけど。
とりあえず、GAE上でGoogleスプレッドシートとのデータのやり取りに成功しました。ローカル環境でテスト出来ないのが不便ですが。
「ImportError: cannot import name RAND_egd」の抜本的対策をご存知の方はご教授を(>人<;)
最近よく聞く利上げ確率
私が最近気にし出しただけかもしれませんが、米国の利上げ確率という文字を様々なメディアでよく目にするようになりました。
イエレンFRB議長:緩やかな利上げ見込む-具体的な時期触れず - Bloomberg
FF金利先物の動向に織り込まれた7月利上げの確率は5月末の時点で53%、今月3日は27%だったが、その後、約22%に低下した。
利上げ確率と一口に言っても様々なものがあるとは思いますが、ここでは記事中にあるFF金利先物から導出する利上げ確率について少々述べたいと思います。
ここでFF金利先物と言っているのは、正式名称は30日フェデラルファンド先物。各限月の先物の値はその月のフェデラルファンド(の実行)金利の平均値を予想しています。(各限月の先物の値はここで確認できます。)
いま現在、2016年6月物の値は99.6325。この値を用い、
100-99.6325=0.3675
が現段階での2016年6月FF実行金利の平均値予想となります。
この各限月の平均値予想の値が跳ね上がる(FF金利先物の値は下がる)月があるとします。それはその月にあるFOMCで利上げが実施されると市場が予想している、そういうことになるわけです。(FOMCの日程が月末とかだとそうも言えないんですが、詳しくは続く計算方法を理解して!)
さて、具体的な確率の計算方法ですが、
フェデラルファンド( FF )金利先物の FOMC 予想確率の計算(2010年4月)
CME Group FedWatch Tool – Fed Funds Futures Probability Tree Calculator
です!(手抜き)
要は直近のFOMC(現在に当てはめると6月15日)で利上げするかどうかは、その当月(直近は6月物)とその前(後)の先物の値の変化幅から確率を求める。値が全く一緒なら市場参加者全員が変更なしを予想、大幅に変化していればFF金利変更の可能性が高し、という事。(比較する相手はその月にFOMCがない事が求められ、7月にFOMCがあるために5月物と比較して確率を求めます。5月中はそれでよかったんですが、限月終わったらどうすれば...。)
それ以降に関しては、前回利上げしたか維持したかの場合分けを行い確率を計算します。(例えば、7月までに2回利上げが行われるのは6月・7月ともに利上げされる場合、7月までに1回利上げが行われるのは6月で利上げが行われ7月では維持される場合と、6月は維持され7月で利上げされる場合、7月までに利上げが全く行われないのは6月・7月ともに利上げが行われなかった場合としてその確率を求める。9月までに3回(以下略))
個人的感想ですが、直近のFOMCの利上げ確率の計算には英語版の方が、2回目のFOMCの利上げ確率の計算は日本語版がわかりやすかったです。それぞれ例示が。
(正直、日本語版はきみ何言ってるのって箇所が幾つかあって理解するのに苦労しました。)
このモデルの問題点は利上げ・利下げ一方通行でしか考えられないこと、利上げ(下げ)幅に一定の値(現状は0.25)を用いないといけないことでしょうか。
例えば、現状利下げを予想する人はさすがにいないとは思いますが、今後複雑な状況になった(例:利上げか維持か利下げかの三択が考えられる)時とかはこのモデルの枠内では無理。その可能性はかなりなさげだが...。
また、利上げ幅が0.25か0.50かを迷う局面(これは将来的にありそう)では、改良を求められます。
とはいえ、求めてみました。9月までしかないのは単に文字数制限...。
FFレート先物からの政策金利予測
— 栗bot (@yyy1980_bot) 2016年6月9日
6/15 : 0.5(96%), 0.75(4%)
7/27 : 0.5(73%), 0.75(26%), 1.0(1%)
9/21 : 0.5(60%), 0.75(34%), 1.0(5%), 1.25(0%)
答え合わせはCountdown to FOMC - CME Groupで。
(スクレイピングでこの値を持ってこればいいんだが、その技術はなかった。6月の利上げ確率は5月先物がなくなってどうしたもんじゃろの~と思ったが、逆算して5月平均を0.365として計算しています。)
おまけでどの月に行われると見てるのかも算出。正直、この値の算出にはやや問題がある事を自覚してまする。
各政策決定会合での利上げ確率
— 栗bot (@yyy1980_bot) 2016年6月9日
6/15 4%
7/27 24%
9/21 18%
11/2 2%
ツイッターbot作成の道(その4)
定期的にWeb情報を取得し呟く事は出来るようになりました。次はいよいよサイトの更新がされるや否や呟く、そういうこと。cronを知ってから薄々想像してましたが、次のサイトでやっぱりって感じでした。
つまり頻繁にサイトを訪れて、更新されたかどうかを調べるわけですね。なかなか迷惑(笑)GAEでは最短1分単位で対象サイトを訪れられます。
これならこれまでの知識の延長で出来るわけですが、ただ一つ、比較するためのログを残しておく必要があります。より壮大なことをやろうとするとそのうちデータベースとのデータのやり取りが必要になる事は覚悟してますが、今回はもっとお手軽にデータをやり取りしたいなと思いググってみました。そうして辿り着いたのがJSON (JavaScript Object Notation)
英語はサクサクッとクリア。でもやっぱり日本語...。プログラムは動くけど出力されたファイルが読めない、私が。そこでちゃんと見つけてきました。
テスト環境では成功。if文比較も出来ました。
さて、それではGAEにDeploy
IOError: [Errno 30] Read-only file system
も、もしかして・・・
ガーン #python > 「Appengine does not support any write operations to the filesystem」
— 栗(痩せたい) (@yyy1980) 2016年6月4日
Stack Overflow https://t.co/zq8kd0a0kW
書き込み不可かよ ><