我正在尝试计算移动平均线(简单和指数),我遇到了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中。
答案 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指南,但您需要的基础是Hash
和Array
。查看如何使用ruby哈希和数组,这可能就是30%的ruby编程。
例如,为了获取数组中的json对象,然后只获得关闭,您可以像这样使用Array #map:
stocks = JSON.parse( your_json_here )
array = stocks.map{ |hash| hash["Close"] }
# => [8.65, 9.32, etc... ]
希望能让你开始好运