Статистический сканер акций в Mathematica - PullRequest
3 голосов
/ 07 июня 2011

Моя цель - написать алгоритм в Mathematica, который будет искать акции, чья текущая цена торгуется ниже или выше 2 стандартных отклонений от среднего.Я буквально начал изучать программу вчера, но с тех пор я искал интернет.У меня есть код, но я получаю ошибки по пути.Кто-нибудь может мне помочь?Ниже мой текущий код

Today = Date[]
StartDate = Today-{0,3,0,0,0,0}
NYSEMem = FinancialData["NYSE","Members"]
CurrentPrice = FinancialData[NYSEMem,"Price"]
HistoricalPrice = FinancialData[NYSEMem,{{StartDate},{Today}}]
StandardDeviation$ = StandardDeviation[HistoricalPrice]
MeanPrice = Mean[HistoricalData]
SellSignal = [MeanPrice]-[StandardDeviation$]*2
BuySignal = [MeanPrice]+[StandardDeviation$]*2
If[CurrentPrice>SellSignal,"Sell",False]
If[CurrenPrice<BuySignal,"Buy",False]

Ответы [ 2 ]

4 голосов
/ 07 июня 2011

Очень смело прыгать прямо в глубокие воды, но я бы посоветовал сначала изучить основы.Вы говорите, что «искали помощь в Интернете», но пробовали ли вы встроенный в Mathematica центр документации?Он содержит тысячи страниц справки, всего одно нажатие клавиши.

В любом случае, в отношении вашего кода есть несколько советов:

  • Не заканчивайте переменную символом $.Хотя в принципе это не так, они используются для системных переменных
  • Строка SellSignal = [MeanPrice]-[StandardDeviation$]*2, а следующая за ней содержит скобки вызова функций без соответствующих имен функций.Вы, вероятно, не собираетесь использовать эти скобки там
  • Часть ,False в If[CurrentPrice>SellSignal,"Sell",False] и следующая строка не нужны и могут быть удалены здесь
  • Более ранний расчет даты может быть лучшесделано с помощью специальной функции DatePlus, которая учитывает такие вещи, как високосные годы и т. д.
  • Возможно, вы не хотите видеть весь вывод всех строк.Вы можете подавить вывод, используя ';'(который также действует для разделения составных операторов)
  • Звездочка для умножения не нужна.Пространство будет делать, как в математике.a * b, ab, a 2, 2 a и 2a (без пробела) - все правильные умножения.
  • Данные, полученные из некоторых вызовов, включают как цены, так и даты.Вы также пытаетесь усреднить даты и найти их стандартное отклонение.
  • Хотя разрешено начинать переменную с заглавной буквы, лучше избегать этого, чтобы не использовать собственные ключевые слова Mathematica (которые начинаются сзаглавная буква).
  • Я не думаю, что ваши сигналы покупки и продажи очень умны.Вы можете думать о продаже, когда цены исторически высоки, но вы делаете это, когда они находятся выше исторического нижнего водяного знака.
  • То же самое для покупки.Кроме того, когда текущая цена находится между вашими двумя сигналами, программа дает противоречивые рекомендации.
  • Вам нужна конструкция, чтобы повторить вычисления для каждого члена NYSE

Какой-то очень простой базовый код для полученияВы начали:

StartDate = DatePlus[Date[], {-3, "Month"}];
NYSEMem = Select[FinancialData["NYSE", "Members"], (\[Not] StringMatchQ[#, ___ ~~ 
       "^" ~~ ___] &)]; (* Throw away indices *)
Do[
 currentPrice = Check[FinancialData[stock, "Price"], $Failed];
 historicalPrice = 
  Check[FinancialData[stock, {StartDate, Date[]}], $Failed];
 If[currentPrice == $Failed || historicalPrice == $Failed || 
   currentPrice == Missing["NotAvailable"] || 
   historicalPrice == Missing["NotAvailable"], 
  Continue[]]; (* Shamefully inadequate error handling *)
 standardDeviationPrice = StandardDeviation[historicalPrice[[All, 2]]];
 meanPrice = Mean[historicalPrice[[All, 2]]]; 
            (* Mean of the second column of the data matrix *)
 sellSignal = meanPrice + 2 standardDeviationPrice; 
             (* swapped + and - in these two lines, plug your own method here *)
 buySignal = meanPrice - 2 standardDeviationPrice;
 Print[stock, ": ", 
  If[currentPrice > sellSignal, "Sell", 
   If[currentPrice < buySignal, "Buy", "Neutral"]]];
 , {stock, NYSEMem}
 ]

Обратите внимание, что Stackoverflow предназначен для людей, которые добросовестно пытались сделать все возможное для исследования проблем, с которыми они сталкиваются.У меня такое чувство, что вы действительно не соответствуете этому критерию.Моя срочная просьба: прочитать базовый вводный текст о Mathematica (например, Начало работы и Обзор основного языка ).

3 голосов
/ 07 июня 2011

Здесь у вас запущена ваша программа:

Today              = Date[];
StartDate          = Today - {0, 3, 0, 0, 0, 0};
NYSEMem            = FinancialData["NYSE", "Members"];
NYSEMem            = NYSEMem[[1000 ;; 1001]];
CurrentPrice       = FinancialData[#, "Price"] & /@ NYSEMem;
HistoricalPrice    = FinancialData[#, {StartDate, Today}] & /@ NYSEMem;
StandardDeviation$ = StandardDeviation[#[[All, 2]]] & /@ HistoricalPrice;
MeanPrice          = Mean[#[[All, 2]]] & /@ HistoricalPrice;
SellSignal         = MeanPrice - StandardDeviation$*2
BuySignal          = MeanPrice + StandardDeviation$*2
Do[
   If[CurrentPrice[[i]] > SellSignal[[i]], Print["Sell ", NYSEMem[[i]]]];
   If[CurrentPrice[[i]] < BuySignal[[i]],  Print["Buy ",  NYSEMem[[i]]]],
 {i, 2}]

Но, пожалуйста, обратите внимание, что я изменил только минимум, чтобы запустить его без использования идиом. По любому стандарту это не хорошая программа .Я сделал это только для того, чтобы вы немного поиграли с ним и выучили некоторые конструкции.

HTH!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...