ぽこひでブログ

ほのぼの大学4年をやってる [ぽこひで] の学生エンジニアブログ?

Rubyで超簡単に為替取得してみた

こんにちは。
Fxを去年の10月から始めていて、それなりに山(黒田バズーカーとかとか)を乗り越えてきて今に至る身なんですが、Rubyを勉強し始めたことだし、せっかくだから機械学習かなんかでシステムトレード的な予測システムを作ってみたいな!って思ったので、とりあえずはデータの取得方法を考えなくてはってことで為替取得してみました。

色々調べてみると、

といったブログが出てきたのでこれらを参考に、一番最適そうな取得方法を考えてみました。xcurrencyってやつは使いやすそうですたが、1日10回までらしくデータが少ないのなんのってことで却下。Googleファイナンスから取得するのもいいけど、一つずつURLを指定しなくちゃいけなくてめんどそうってことで却下。今回は一気にいろんな通貨を観れるこいつに決めました。

http://www.gaitameonline.com/rateaj/getrate

これがサイトなのかよく分かりませんが、常時最新の為替を表示してくれているような便利なサイト?だったので、こいつに決めた!実際に、正規のFxトレード会社の為替データとリアルタイムで見比べても1銭程度のズレはあったもののある程度正確そうでした。
このURLからHTMLを取得してみると明らかにjson形式だったのでJSONでパースしまくりんぐ。
ちなみに取得データはこんな感じ

puts JSON.parse(open(url))
 #=>
{"quotes"=>[{"high"=>"2.0089", "open"=>"2.0051", "bid"=>"2.0030", "currencyPairCode"=>"GBPNZD", "ask"=>"2.0047", "low"=>"1.9998"}, {"high"=>"99.35", "open"=>"99.28", "bid"=>"99.11", "currencyPairCode"=>"CADJPY", "ask"=>"99.16", "low"=>"99.05"}, {"high"=>"1.9407", "open"=>"1.9284", "bid"=>"1.9119", "currencyPairCode"=>"GBPAUD", "ask"=>"1.9128", "low"=>"1.9099"}, {"high"=>"95.03", "open"=>"94.12", "bid"=>"94.94", "currencyPairCode"=>"AUDJPY", "ask"=>"94.97", "low"=>"93.54"}, {"high"=>"1.0480", "open"=>"1.0393", "bid"=>"1.0473", "currencyPairCode"=>"AUDNZD", "ask"=>"1.0483", "low"=>"1.0358"}, {"high"=>"1.3494", "open"=>"1.3479", "bid"=>"1.3480", "currencyPairC...

こいつを一気に出力されるとこのようなプログラムになった。

require 'open-uri'
require 'json'

html = open('http://www.gaitameonline.com/rateaj/getrate').read
json = JSON.parse(html)['quotes']
puts Time.now.strftime("%Y/%m/%d %H:%M:%S")
json.each do |data|
  puts "通貨:#{data['currencyPairCode']} 最高値:#{data['high']} 最安値:#{data['low']} ASK:#{data['ask']} BID:#{data['bid']} 開始値:#{data['open']}"
end

驚いたことにたったこんだけ、これでこのプログラムを実行した時点での各通貨の為替データが出力できました。ただし、このサイトには時間は載ってなかったので、スクレイピングした時の時間も一緒に出力。ちなみに出力結果は以下のような感じになった。

2015/05/05 14:58:52
通貨:GBPNZD 最高値:2.0089 最安値:1.9998 ASK:2.0100 BID:2.0083 開始値:2.0051
通貨:CADJPY 最高値:99.35 最安値:99.05 ASK:99.10 BID:99.05 開始値:99.28
通貨:GBPAUD 最高値:1.9407 最安値:1.9099 ASK:1.9167 BID:1.9158 開始値:1.9284
通貨:AUDJPY 最高値:95.03 最安値:93.54 ASK:94.78 BID:94.75 開始値:94.12
通貨:AUDNZD 最高値:1.0481 最安値:1.0358 ASK:1.0489 BID:1.0479 開始値:1.0393
通貨:EURCAD 最高値:1.3494 最安値:1.3472 ASK:1.3492 BID:1.3485 開始値:1.3479
通貨:EURUSD 最高値:1.1151 最安値:1.1123 ASK:1.1131 BID:1.1130 開始値:1.1147
通貨:NZDJPY 最高値:90.73 最安値:90.32 ASK:90.41 BID:90.35 開始値:90.52
通貨:USDCAD 最高値:1.2119 最安値:1.2082 ASK:1.2121 BID:1.2115 開始値:1.2091
通貨:EURGBP 最高値:0.7372 最安値:0.7356 ASK:0.7361 BID:0.7357 開始値:0.7370
通貨:GBPUSD 最高値:1.5128 最安値:1.5107 ASK:1.5127 BID:1.5124 開始値:1.5117
通貨:ZARJPY 最高値:9.901 最安値:9.877 ASK:10.033 BID:9.883 開始値:9.884
通貨:EURCHF 最高値:1.0417 最安値:1.0402 ASK:1.0416 BID:1.0411 開始値:1.0409
通貨:CHFJPY 最高値:128.71 最安値:128.25 ASK:128.36 BID:128.31 開始値:128.52
通貨:AUDUSD 最高値:0.7917 最安値:0.7784 ASK:0.7894 BID:0.7892 開始値:0.7836
通貨:USDCHF 最高値:0.9361 最安値:0.9329 ASK:0.9358 BID:0.9354 開始値:0.9337
通貨:EURJPY 最高値:133.96 最安値:133.56 ASK:133.66 BID:133.64 開始値:133.85
通貨:GBPCHF 最高値:1.4150 最安値:1.4105 ASK:1.4156 BID:1.4147 開始値:1.4116
通貨:EURNZD 最高値:1.4798 最安値:1.4726 ASK:1.4791 BID:1.4779 開始値:1.4780
通貨:NZDUSD 最高値:0.7554 最安値:0.7519 ASK:0.7531 BID:0.7525 開始値:0.7535
通貨:USDJPY 最高値:120.19 最安値:120.02 ASK:120.07 BID:120.06 開始値:120.14
通貨:EURAUD 最高値:1.4276 最安値:1.4058 ASK:1.4106 BID:1.4098 開始値:1.4219
通貨:AUDCHF 最高値:0.7403 最安値:0.7282 ASK:0.7387 BID:0.7381 開始値:0.7316
通貨:GBPJPY 最高値:181.74 最安値:181.47 ASK:181.63 BID:181.60 開始値:181.65

これである時間における為替データを取得できたので、こいつを使って何日か分のデータを数分おきに取得したいけど、たしか

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

に書いてあった気がするから、また読み直して使ってみよう。今回使ったサイトは詳しくはわからないけど、1分おきくらいに更新されていたので、間隔を秒単位にすると変化してないかも。あと、スクレイピングはほどほどに