2015年05月05日
Pan Active Market Databaseの利用3
RubyによるPan Active Market Databaseからの株価データ取得を試みている。
”Rubyではじめるシステムトレード”ではRuby2.0や2.1でもサンプルコードを動かせるということになっているが、WindowsにインストールされているRubyのバージョンは2.2であった。念のために本で使用されているバージョンである1.9.3に合わせてみる。
本をよく読んでみるとPricesクラスのメソッドとして
Read 四本値と出来高を読み出します
Begin 日付位置の最小を取得します
End 日付位置の最大を取得します
IsClosed 指定した日付位置が休場日かどうか調べます
Open 指定した日付位置の始値を取得します
High 指定した日付位置の高値を取得します
Low 指定した日付位置の安値を取得します
Close 指定した日付位置の終値を取得します
Volume 指定した日付位置の出来高を取得します
がある。
irbを起動して日付と株価をPan Active Market Databaseから取得するクラスを作成する。
> require "win32ole"
> calendar = WIN32OLE.new("ActiveMarket.Calendar")
> prices = WIN32OLE.new("ActiveMarket.Prices")
日経平均の証券コード(1001)を用いる。
> prices.Read(1001)
これは"nil"が返ってくるが、続けてBeginとEndメソッドを試す。
> prices.Begin
=> 5632
> prices.End
=> 8191
これが株価を利用できる日付位置だと思われる。試しに、Calendarクラスから日付を調べると期間はほぼ10年になり、最新の日付は2015年の5月1日で、5月1日にPanデータ管理で手動でデータを更新した事実と辻褄があう。
> calendar.Date(5632)
=> 2005-06-20 00:00:00 +0900
> calendar.Date(8191)
=> 2015-05-01 00:00:00 +0900
株価を取得するためにOpenメソッドを使うと、
> prices.Open(5632)
=> 11539.0
と株価が返ってくるようになった!どうやら株価の日付指定で、不正な値を指定していたようだ。一気に株価を取得するためにループを使うと、
> (5632 .. 8191).each {|i| puts prices.Open(i)}
11539.0
11474.0
11487.0
11539.0
11480.0
11445.0
11421.0
11567.0
11573.0
11573.0
11664.0
11645.0
11648.0
11586.0
11563.0
11676.0
11737.0
11705.0
11715.0
11825.0
WIN32OLERuntimeError: (in OLE method `Open': )
OLE error code:C1010018 in ActiveMarket.Prices.1
*****************文字化け?****************************
HRESULT error code:0x80020009
Exception occurred.
from (irb):45:in `method_missing'
from (irb):45:in `block in irb_binding'
from (irb):45:in `each'
from (irb):45
from C:/Ruby193/bin/irb:12:in `< main >'
と良くわからないエラーが出力され、終了する。
とりあえず株価は取得できるようになったが何かおかしい。エラーが出るところは日付位置が5652の場所だ。試しにこの場所だけ以下のように株価取得を試みるも、
> prices.Open(5652)
同じエラーがでる。これは本で説明されているエラーコードC1010010(日付位置としてあり得ない値を引数とした場合)とは異なる。日付位置5632から8191の間で適当に区間を決めてprice.Open(..)を実行してみると、やはり同じエラーが出る日付位置がある。不思議なことに全記事のExcelのサンプルVBAでPan Active Market Databaseから株価を取得すると、日付位置5652でも株価が存在する。しかしExcelのデータを良く見ると、問題が起きる日付位置とその次の日付位置の株価が同じになっている。さらにエラーが出る日付位置を調べていくと、どうも休日に該当するように見える。
そこでメソッドIsClosedを試してみる。
> prices.IsClosed(5652)
=> -1
> prices.IsClosed(5651)
=> 0
となり、おそらくIsClosedメソッドは休日に当たる日は-1を返すのではないだろうか。そうすると上記のエラーが出力される日は休日にあたり、株価がないということでエラーの原因が納得できる。
IsClosedが-1になる日付位置を除去する以下の簡単なスクリプトを書いて実行してみると、一気に株価が取得できた!日付をチェックしてみる必要があるが、とりあえずはこれで良さそう。原因はRubyのバージョンではなかったので、最新版に戻そう。
require "win32ole"
calendar = WIN32OLE.new("ActiveMarket.Calendar")
prices = WIN32OLE.new("ActiveMarket.Prices")
prices.Read(1001)
for i in 5632..8191
if prices.IsClosed(i) == 0 then
puts prices.Open(i)
else
next
end
end
”Rubyではじめるシステムトレード”ではRuby2.0や2.1でもサンプルコードを動かせるということになっているが、WindowsにインストールされているRubyのバージョンは2.2であった。念のために本で使用されているバージョンである1.9.3に合わせてみる。
本をよく読んでみるとPricesクラスのメソッドとして
Read 四本値と出来高を読み出します
Begin 日付位置の最小を取得します
End 日付位置の最大を取得します
IsClosed 指定した日付位置が休場日かどうか調べます
Open 指定した日付位置の始値を取得します
High 指定した日付位置の高値を取得します
Low 指定した日付位置の安値を取得します
Close 指定した日付位置の終値を取得します
Volume 指定した日付位置の出来高を取得します
がある。
irbを起動して日付と株価をPan Active Market Databaseから取得するクラスを作成する。
> require "win32ole"
> calendar = WIN32OLE.new("ActiveMarket.Calendar")
> prices = WIN32OLE.new("ActiveMarket.Prices")
日経平均の証券コード(1001)を用いる。
> prices.Read(1001)
これは"nil"が返ってくるが、続けてBeginとEndメソッドを試す。
> prices.Begin
=> 5632
> prices.End
=> 8191
これが株価を利用できる日付位置だと思われる。試しに、Calendarクラスから日付を調べると期間はほぼ10年になり、最新の日付は2015年の5月1日で、5月1日にPanデータ管理で手動でデータを更新した事実と辻褄があう。
> calendar.Date(5632)
=> 2005-06-20 00:00:00 +0900
> calendar.Date(8191)
=> 2015-05-01 00:00:00 +0900
株価を取得するためにOpenメソッドを使うと、
> prices.Open(5632)
=> 11539.0
と株価が返ってくるようになった!どうやら株価の日付指定で、不正な値を指定していたようだ。一気に株価を取得するためにループを使うと、
> (5632 .. 8191).each {|i| puts prices.Open(i)}
11539.0
11474.0
11487.0
11539.0
11480.0
11445.0
11421.0
11567.0
11573.0
11573.0
11664.0
11645.0
11648.0
11586.0
11563.0
11676.0
11737.0
11705.0
11715.0
11825.0
WIN32OLERuntimeError: (in OLE method `Open': )
OLE error code:C1010018 in ActiveMarket.Prices.1
*****************文字化け?****************************
HRESULT error code:0x80020009
Exception occurred.
from (irb):45:in `method_missing'
from (irb):45:in `block in irb_binding'
from (irb):45:in `each'
from (irb):45
from C:/Ruby193/bin/irb:12:in `< main >'
と良くわからないエラーが出力され、終了する。
とりあえず株価は取得できるようになったが何かおかしい。エラーが出るところは日付位置が5652の場所だ。試しにこの場所だけ以下のように株価取得を試みるも、
> prices.Open(5652)
同じエラーがでる。これは本で説明されているエラーコードC1010010(日付位置としてあり得ない値を引数とした場合)とは異なる。日付位置5632から8191の間で適当に区間を決めてprice.Open(..)を実行してみると、やはり同じエラーが出る日付位置がある。不思議なことに全記事のExcelのサンプルVBAでPan Active Market Databaseから株価を取得すると、日付位置5652でも株価が存在する。しかしExcelのデータを良く見ると、問題が起きる日付位置とその次の日付位置の株価が同じになっている。さらにエラーが出る日付位置を調べていくと、どうも休日に該当するように見える。
そこでメソッドIsClosedを試してみる。
> prices.IsClosed(5652)
=> -1
> prices.IsClosed(5651)
=> 0
となり、おそらくIsClosedメソッドは休日に当たる日は-1を返すのではないだろうか。そうすると上記のエラーが出力される日は休日にあたり、株価がないということでエラーの原因が納得できる。
IsClosedが-1になる日付位置を除去する以下の簡単なスクリプトを書いて実行してみると、一気に株価が取得できた!日付をチェックしてみる必要があるが、とりあえずはこれで良さそう。原因はRubyのバージョンではなかったので、最新版に戻そう。
require "win32ole"
calendar = WIN32OLE.new("ActiveMarket.Calendar")
prices = WIN32OLE.new("ActiveMarket.Prices")
prices.Read(1001)
for i in 5632..8191
if prices.IsClosed(i) == 0 then
puts prices.Open(i)
else
next
end
end
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/3622571
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック