3

私の目標は、現在の価格が平均の 2 標準偏差を下回るか上回る株式を検索するアルゴリズムを Mathematica で作成することです。私は文字通り昨日プログラムを学び始めましたが、それ以来、助けを求めてインターネットを探し回っています. コードはありますが、途中でエラーが発生します。誰かが私を助けることができますか?以下は私の現在のコードです

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 の内蔵ドキュメンテーションセンターを試してみましたか? キーを 1 回押すだけで、何千ページものヘルプが表示されます。

とにかくあなたのコードに関して、いくつかのヒント:

  • 変数を $ で終わらせないでください。原則として間違っていませんが、システム変数に使用されます
  • SellSignal = [MeanPrice]-[StandardDeviation$]*2とそれに続く行には、対応する関数名のない関数呼び出しブラケットが含まれています。おそらく、これらのブラケットをそこに置くつもりはありません
  • ,False部分If[CurrentPrice>SellSignal,"Sell",False]と次の行は不要なのでここで削除できます
  • DatePlus閏年などを考慮した専用関数を使えば、早い時期の日付計算をより効率的に行うことができます。
  • おそらく、すべての行のすべての出力を見たいとは思わないでしょう。「;」を使用して出力を抑制することができます (これは、複合ステートメントを分離する役割も果たします)
  • 乗算のアスタリスクは不要です。数学と同じように、スペースで十分です。a*b、ab、a 2、2 a、および2a (スペースなし) はすべて正しい乗算です。
  • 一部の通話から受け取るデータには、価格と日付の両方が含まれます。また、日付を平均して標準偏差を見つけようとしています。
  • 大文字で変数を開始することは許されていますが、Mathematica 独自のキーワード(すべて大文字で開始します)を使用しないようにするために、大文字で開始することは避けたほうがよいでしょう。
  • あなたの売買シグナルはあまりスマートではないと思います。価格が歴史的に高いときに売ることを考えるかもしれませんが、それは歴史的な低水準点を上回っているときにやっているのです。
  • 買うのも同じ。また、現在の価格が 2 つのシグナルの間にある場合、プログラムは相反するアドバイスを提供します。
  • すべての 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 に答える