6

PHP を使用して仮想株式市場ゲームに取り組んでいます。私が株の価格を決定するために使ってきた公式は、

$price += $ran*0.001*$price + $ratio*0.005*$price

どこ

$ran = rand(-1*$intensity, 2*$intensity)

$intensity は、ニュースが会社にとって良いか悪いかに応じて -5 から 5 までの数値であり、

$ratio = (1.0*($buy-$sell))/($buy + $sell)

$buy と $sell は、それぞれ会社の売買株数を表します。

この式の問題点は、強度がマイナス (-5 であっても) であっても、比率の項が常に価格に追加され、全体の項が増加することです。価格は 10 秒ごとに更新され、上記の計算式により、価格は上昇し続け、下落することはありません。では、実際の株式市場により近い形で変化するように、この式を手伝ってくれる人はいますか?

4

1 に答える 1

4

私の理解が正しければ、現在の価格、いくつかの市場活動、およびランダムな入力に基づいて論理的な次の価格を決定するアルゴリズムを定義しようとしています。これはRandom Walkと呼ばれ、リンクされたページは非常に有益です。

経済学では、株価やその他の要因をモデル化するために「ランダム ウォーク仮説」が使用されます。実証研究では、特に短期および長期の相関関係において、この理論モデルからの逸脱が見られました。

このような関数に期待される正確な動作は本質的にアプリケーション固有であるため、正確な関数を提供することは困難です。ただし、独自のメソッドに引き出して、必要な動作が表示されるまで微調整することで、動作をテストして改善することができます。

定義したこの動作をSSCCE (または単体テスト。ただし、PHP 単体テスト フレームワークをまだセットアップしていないと仮定すると、例で問題なく動作します) にプルし、いくつかのテスト ケースを作成することをお勧めします。アルゴリズムを真空状態で微調整し、好きな動作を見つけます。

始めるためのボイラープレートを次に示します。

<?php

function nextPrice($price, $intensity, $buy, $sell, $rand) {
  // TODO
}

// Can tweak these values between runs, or put them in a loop if you want
$testPrice = 10.0;
$testBuy = 10000;
$testSell = 10000;

for ($i = -5; $i <= 5; $i++) {
  // random float, from http://stackoverflow.com/a/14155720/113632
  // set to a constant if you want to isolate the randomness and test other variables
  $testRand = mt_rand(0, mt_getrandmax() - 1) / mt_getrandmax();
  echo "<p>Intensity: $i - Rand: $testRand = ".
       nextPrice($testPrice, $i, $testBuy, $testSell, $testRand)."</p>";
}

?>

いくつかの追加の考え:

  • 実行していて警告が生成され、必要な値が返されない 場合$ran、定義には間違いなく欠陥$intensityがあります。これはおそらくあなたの問題の根源です.マイナスは本質的にゼロに設定されます.-5$ran = rand(5, -10);$intensity$ran
  • さらに、あなたの$ran定義は正の数に偏っています。つまり、悪いニュースがあっても、価格はかなり急速に上昇します。ランダムな値が株価を上げるのと同じように下がる可能性があることを確認することをお勧めします。また、時間の経過に関係なく株価が上昇することを意図している場合(これは悪い考えのように思えます)$longTermGrowthFactor、常に上昇する別の値を設定することをお勧めしますランダム性とは別に、その要因によるストック。
  • PHP で警告レポートを有効にします - おそらく呼び出しに関連する警告を見たことがないので、rand()警告やその他のエラー タイプがオフになっている可能性があります。これは、コードに気付いていない他のエラーが隠されていることを意味します。 、レポートがなければ、それらを見つけるのは難しくなります。
  • mt_rand()の代わりに使用しますrand()。後者は推奨されておらず、mt_rand()より良いランダム性を提供するドロップインの代替品です。
于 2013-10-10T17:34:30.243 に答える