#wolfram-mathematica #finance #standards #stock #deviation
#wolfram-mathematica #финансы #стандарты #запас #отклонение
Вопрос:
моя цель — написать алгоритм в 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]
Комментарии:
1. рекомендации @Sjoerd — отличная работа. Проголосуйте за его ответ!
Ответ №1:
Очень смело прыгать прямо в глубокие воды, но я бы посоветовал сначала попытаться изучить основы. Вы говорите, что «искали помощь в Интернете», но обращались ли вы к встроенному центру документации Mathematica? В нем тысячи страниц справки, всего одно нажатие клавиши.
В любом случае, что касается вашего кода, несколько советов:
- Не заканчивайте переменную символом $. Хотя в принципе это не так, они используются для системных переменных
- Строка
SellSignal =
и следующая за ней содержат скобки вызова функции без соответствующих имен функций. Вероятно, вы не собираетесь размещать там эти скобки
[MeanPrice]-[StandardDeviation$]*2 ,False
Часть вIf[CurrentPrice>SellSignal,"Sell",False]
и следующая строка не нужны и могут быть удалены здесь- Более ранний расчет даты может быть лучше выполнен с помощью специальной
DatePlus
функции, которая учитывает такие вещи, как високосные годы и т.д. - Вероятно, вы не хотите видеть все выходные данные всех строк. Вы можете отключить вывод с помощью ‘;’ (который также действует для разделения составных операторов)
- Звездочка для умножения не нужна. Подойдет пробел, как и в математике. a * b, a b, a2, 2a и 2a (без пробела) — все это правильные умножения.
- Данные, которые вы получаете от некоторых звонков, включают как цены, так и даты. Вы также пытаетесь усреднить даты и найти их стандартное отклонение.
- Хотя разрешено начинать переменную с заглавной буквы, вам лучше избегать этого, чтобы предотвратить использование собственных ключевых слов Mathematica (которые все начинаются с заглавной буквы).
- Я не думаю, что ваши сигналы на покупку и продажу очень умные. Вы можете подумать о продаже, когда цены исторически высоки, но вы делаете это, когда они превышают исторический минимум водяного знака.
- То же самое для покупки. Кроме того, когда текущая цена находится между вашими двумя сигналами, программа выдает противоречивые рекомендации.
- Вам нужна конструкция для повторения вычислений для каждого участника NYSE
Несколько очень-очень простых кодов для начала:
StartDate = DatePlus[Date[], {-3, "Month"}];
NYSEMem = Select[FinancialData["NYSE", "Members"], ([Not] StringMatchQ[#, ___ ~~
"^" ~~ ___] amp;)]; (* 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 (например, Начало работы и обзор основного языка).
Комментарии:
1. «В нем содержится несколько тысяч страниц справки, всего одно нажатие клавиши». Прочитайте документацию, чтобы узнать, какой ключ 🙂
2. 😉 Просто ключ, используемый в любой другой справочной системе (F1 Windows, Help key, Mac)
3. Спасибо, чувак, что мне нужно сделать, чтобы в нем был список действий, которые я хочу?
4. @brandon Но на самом деле не стоит ожидать, что вы сможете программировать на языке программирования, используя расширенную библиотеку функций, не изучив сначала основы. Вы склонны совершать все обычные (и которых можно избежать) ошибки начинающих. Я добавил несколько ссылок на базовые тексты справки, которые вы действительно должны были увидеть.
5. @Brandon Если вы не опытный программист (а большинство языков программирования здесь не считаются «опытом»), вам потребуется три-четыре недели, чтобы освоить основы. Если вашей компании нужна такого рода помощь, лучше нанять кого-нибудь знающего.
Ответ №2:
Здесь у вас запущена ваша программа:
Today = Date[];
StartDate = Today - {0, 3, 0, 0, 0, 0};
NYSEMem = FinancialData["NYSE", "Members"];
NYSEMem = NYSEMem[[1000 ;; 1001]];
CurrentPrice = FinancialData[#, "Price"] amp; /@ NYSEMem;
HistoricalPrice = FinancialData[#, {StartDate, Today}] amp; /@ NYSEMem;
StandardDeviation$ = StandardDeviation[#[[All, 2]]] amp; /@ HistoricalPrice;
MeanPrice = Mean[#[[All, 2]]] amp; /@ 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}]
Но, пожалуйста, обратите внимание, что я изменил только минимум, чтобы запустить его без использования идиом. Это не по всем стандартам хорошая программа. Я сделал это просто для того, чтобы вы немного поиграли с ним и изучили некоторые конструкции.
ПРИВЕТ!
Комментарии:
1. Этот ответ вместе с рекомендациями @Sjoerd должны удержать вас на пути 🙂
2. Спасибо, хотя это дает мне возможность покупать и продавать за одни и те же тикеры… Можете ли вы объяснить мне, что определенные вещи делают в программе и почему вы их используете? Помните, что я совершенно новичок в этом. ;