我一直在使用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秒更新一次,上面的公式会继续增加价格,永不降价。那么,任何人都可以帮我解决这个公式,使其与实际股票市场的关系更加密切吗?
答案 0 :(得分: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
定义偏向于正数,这意味着即使有坏消息,价格也会很快上升。我建议你确保你的随机价值同样有可能降低股票价格,如果你打算随着时间推移股票价值上涨而不管(这对我来说似乎是一个坏主意)设置一个单独的{{1}总是通过该因子增加库存,与随机性分开。$longTermGrowthFactor
电话相关的警告,因此您可能会关闭警告和其他错误类型,这很可能意味着您的隐藏了其他错误您不知道的代码,如果没有报告,他们将难以发现。mt_rand()
代替rand()
,后者已被弃用,rand()
是替代品,可提供更好的随机性。