3

我的目标是在 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]
4

2 回答 2

4

在深水中直跳非常勇敢,但我建议先尝试学习基础知识。您说您一直在“在互联网上寻求帮助”,但您是否尝试过 Mathematica 的机载文档中心?它有数千页的帮助,只需一键即可。

无论如何,关于您的代码,有一些提示:

  • 不要以 $ 结束变量。虽然原则上没有错,但它们用于系统变量
  • SellSignal = [MeanPrice]-[StandardDeviation$]*2和它后面的行包含没有相应函数名的函数调用括号。您可能不打算将这些括号放在那里
  • ,False中和下一行的部分If[CurrentPrice>SellSignal,"Sell",False]是不必要的,可以在这里删除
  • 使用专用功能可以更好地完成较早的日期计算,该DatePlus功能考虑了闰年等因素
  • 您可能不想看到所有行的所有输出。您可以使用 ';' 抑制输出 (它也起到分隔复合语句的作用)
  • 乘法的星号是不必要的。一个空格就可以了,就像在数学中一样。a*b, ab, a 2, 2 a2a(没有空格)都是正确的乘法。
  • 您从某些电话中收到的数据包括价格和日期。您还试图平均日期并找到它们的标准偏差。
  • 虽然允许以大写字母开头变量,但最好避免这样做,以防止使用 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 的基本介绍性文本(例如Getting startedCore Language Overview)。

于 2011-06-07T17:26:21.300 回答
3

在这里,您的程序正在运行:

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}]

但请注意,我只修改了最低限度以使其在不使用习语的情况下运行。从任何标准来看,这都不是一个好的程序。我这样做只是为了让你玩一点它并学习一些结构。

于 2011-06-07T18:47:53.727 回答