使用ruby和simple_statistics计算移动平均值并附加到JSON

时间:2012-10-28 07:28:42

标签: ruby yahoo-finance

我正在尝试计算移动平均线(简单和指数),我遇到了simple_statistics gem,它非常适合我的需求。我正在尝试修改此链接中的代码:How to calculate simple moving average)用于我的目的。

目标: 我有一个像这样的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宝石似乎很容易做),所以它看起来像这样每一天:

[
  {
    "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 gems然后将输出附加到原始JSON,因为我觉得一旦我获得更好的理解,我就会更容易修改。

现在,我还在阅读我将如何做到这一点(感谢任何帮助)以下是我尝试计算微软的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

谢谢

更新:我实际上并不需要使用YahooFinance gem,因为我已经拥有JSON中的数据。我不知道该怎么做是从JSON数组中提取,使用simple_statistics gem进行计算,然后将新数据添加到原始JSON中。

1 个答案:

答案 0 :(得分:1)

使用gem,我看到了两种获取数据的方法。他们在这里(注意他们都可以阻止):

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)

返回值from the documentation的数组:

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

如果股票收盘价接近,则previous_ema是昨天的电子邮件,而amount_of_days_ago是过去的平均值范围,例如20(天)。

修改

哦。是的,解析json很简单:https://github.com/flori/json

我无法编写完整的ruby指南,但您需要的基础是HashArray。查看如何使用ruby哈希和数组,这可能就是30%的ruby编程。

例如,为了获取数组中的json对象,然后只获得关闭,您可以像这样使用Array #map:

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

希望能让你开始好运

相关问题