0

移動平均 (単純および指数) を計算しようとしていますが、私のニーズにぴったりの simple_statistics gem に出会いました。このリンクからコードを変更しようとしています:単純な移動平均を計算する方法) 私の目的のために。

目標: 長期にわたる 1 つの株式の過去の価格を一覧表示する、次のような JSON があります。

[
  {
    "Low": 8.63,
    "Volume": 14211900,
    "Date": "2012-10-26",
    "High": 8.79,
    "Close": 8.65,
    "Adj Close": 8.65,
    "Open": 8.7
  },

これに、20日と50日の平均(および必要に応じて他のもの)の各日の移動平均(単純および指数 - simple_statistics gemが簡単に行うように見える)を追加したいので、毎日このように表示されます:

[
  {
    "Low": 8.63,
    "Volume": 14211900,
    "Date": "2012-10-26",
    "High": 8.79,
    "Close": 8.65,
    "Adj Close": 8.65,
    "Open": 8.7,
    "SMA20":
    "SMA50":
  },

yahoo_finance と simple_statistics の gem を使用し、出力を元の JSON に追加することをお勧めします。これは、理解が深まれば変更が容易になると感じているためです。

現在、私はこれをどのように行うかについてまだ読んでいます (助けていただければ幸いです) 以下は、Microsoft の 20 日間の単純移動平均を計算する試みです (うまくいきません)。この方法 (HistoricalQuotes_days を使用) は、開始日が今日であると想定しているように見えますが、これは私の全体的な目標には適していません。

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

averages = {}

dates.each do |dates|
  quotes = YahooFinance::get_HistoricalQuotes_days ( 'MSFT' , 20 ) start, finish
  closes = quotes.collect { |quote| quote.close }
  averages = closes.mean
end

ありがとうございました

更新: 既に JSON にデータがあるため、実際に YahooFinance gem を使用する必要はありません。どうすればよいかわからないのは、JSON 配列から取得し、simple_statistics gem を使用して計算を行い、新しいデータを元の JSON に追加することです。

4

1 に答える 1

1

gem を使用すると、データを取得する方法が 2 つあります。これらは次のとおりです (どちらもブロックを取得できることに注意してください)。

YahooFinance::get_HistoricalQuotes_days('MSFT', 20)

次のメソッドで YahooFinance::HistoricalQuote オブジェクトの配列を返します。

[ :recno, :recno=, :symbol, :symbol=, :date, :date=, 
  :open, :open=, :high, :high=, :low, :low=, :close, 
  :close=, :adjClose, :adjClose=, :volume, :volume=, 
  :to_a, :date_to_Date  ]

または:

YahooFinance::get_historical_quotes_days('MSFT', 20)

ドキュメントから値の配列を返します:

Getting the historical quote data as a raw array.
The elements of the array are:
  [0] - Date
  [1] - Open
  [2] - High
  [3] - Low
  [4] - Close
  [5] - Volume
  [6] - Adjusted Close

平均を取るには (単純移動平均)、次のように簡単に実行できます。

ary.reduce(:+) / ary.length

平均する値を保持する場所ary(浮動小数点である必要があるか、整数除算になります)。指数移動平均を行うには、次の式を使用します。

(close - previous_ema) * (2 / (amount_of_days_ago + 1) ) + previous_ema

close は株価の終値、previous_ema は昨日の ema、amount_of_days_ago は過去の平均の範囲、たとえば 20 (日) です。

編集

おー。ええ、json の解析は簡単です: https://github.com/flori/json

最初の Ruby ガイドをすべて書くことはできませんが、必要なものの基本はHashArray. Ruby のハッシュと配列の使い方を調べてみてください。おそらく、Ruby プログラミングの 30% はそこにあるでしょう。

たとえば、配列内の json オブジェクトを取得してからクローズのみを取得するには、次のように Array#map を使用できます。

stocks = JSON.parse( your_json_here )
array = stocks.map{ |hash| hash["Close"] }
# => [8.65, 9.32, etc... ]

あなたが始められることを願っていますn幸運を祈ります

于 2012-10-28T09:18:49.280 に答える