0

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

目标:我有一个这样的 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

谢谢

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

4

1 回答 1

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)

它从文档中返回一个值数组:

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​​ 哈希和数组,这可能是 30% 的 ruby​​ 编程。

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

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

希望这能让你开始,祝你好运

于 2012-10-28T09:18:49.280 回答