2

ヤフー ファイナンス API を使用して、入力された株式数の過去の終値データを収集し、30 日間のデータの単純移動平均 (SMA) を計算するプログラムに取り組んでいます。これまでのところ、次のものがあります。

require 'rubygems'
require 'yahoofinance'

array = []
while line = gets
  break if line.chomp =~ /N/ #exit when 'N' is entered
  array << line.chomp
end
puts "Values: #{array.join(',')}" #joining all the elements with a comma

array.each do |s|
  print "\n______\n"
  puts s

  YahooFinance::get_HistoricalQuotes( s,
                                  Date.parse( '2012-10-06' ),
                                  Date.today() ) do |hq|
    puts "#{hq.close}"
  end
end

このコードは、指定された範囲の株式の終値を示しています。2 つの質問があります。

  1. 現在、hq.closeすべての株式の値を保持しています。これらの値を配列に入れ、それを計算して各株式データの SMA を計算できるようにするにはどうすればよいですか?

    私はこのようなことをしてみました:

    "#{hq.close}" my_val = [hq.close]
    puts my_val
    

    しかし、これは の最初の在庫の値のみを示しますmy_val。ここにループを配置する必要があることはわかっています。入れてみた

    while(!hq.close.emply?)
      my_val = [hq.close]
      puts my_val
    end
    

    しかし、これは私にエラーを与えます:

    C:/Users/Muktak/workspace/RubySample/sample_program.rb:23:in block (2 levels) in <main>': undefined methodemplty?' for 19.52:Float (NoMethodError) from
    C:/Ruby193/lib/ruby/gems/1.9.1/gems/yahoofinance-1.2.2/lib/yahoofinance.rb:491:in block in get_HistoricalQuotes' from
    C:/Ruby193/lib/ruby/gems/1.9.1/gems/yahoofinance-1.2.2/lib/yahoofinance.rb:456:inblock in get_historical_quotes' from
    C:/Ruby193/lib/ruby/gems/1.9.1/gems/yahoofinance-1.2.2/lib/yahoofinance.rb:456:in each' from
    C:/Ruby193/lib/ruby/gems/1.9.1/gems/yahoofinance-1.2.2/lib/yahoofinance.rb:456:inget_historical_quotes' from
    C:/Ruby193/lib/ruby/gems/1.9.1/gems/yahoofinance-1.2.2/lib/yahoofinance.rb:489:in get_HistoricalQuotes' from
    C:/Users/Muktak/workspace/RubySample/sample_program.rb:19:inblock in ' from
    C:/Users/Muktak/workspace/RubySample/sample_program.rb:13:in each' from
    C:/Users/Muktak/workspace/RubySample/sample_program.rb:13:in'
    Values: FB,GOOG
    
  2. RubyでSMAを計算するにはどうすればよいですか?

4

1 に答える 1

2

ここで 2 つの質問をしたので、1 つずつ答えていきましょう。

まず、このコード:

require 'rubygems'
require 'yahoofinance'

stock_names = %w{MSFT RHT AAPL}
start = Date.parse '2012-10-06'
finish = Date.today
closes = {}

stock_names.each do |stock_name|
  quotes = YahooFinance::get_HistoricalQuotes stock_name, start, finish
  closes[stock_name] = quotes.collect { |quote| quote.close }
end

... で次のハッシュが生成されますcloses。これは、必要な形式であると理解しています。

{
  "AAPL" => [629.71, 628.1, 640.91, 635.85, 638.17],
  "RHT"=> [53.69, 53.77, 53.86, 54.0, 54.41],
  "MSFT"=> [29.2, 28.95, 28.98, 29.28, 29.78]
}

次に、単純な移動平均を計算します。これは、金融アプリケーションの場合、値の平均にすぎません。これを行うことができる simple_statistics という Gem があります。

このコード:

require 'rubygems'
require 'yahoofinance'
require 'simple_statistics'

stock_names = %w{MSFT RHT AAPL}
start = Date.parse '2012-10-06'
finish = Date.today
averages = {}

stock_names.each do |stock_name|
  quotes = YahooFinance::get_HistoricalQuotes stock_name, start, finish
  closes = quotes.collect { |quote| quote.close }
  averages[stock_name] = closes.mean
end

... で次のハッシュを生成しますaverages

{ "AAPL" => 634.548, "MSFT" => 29.238, "RHT" => 53.946 }
于 2012-10-15T02:08:55.797 に答える