Простой алгоритм моделирования поведения фондового рынка

Я работал над игрой на виртуальной фондовой бирже с использованием PHP. Формула, которую я использовал для определения цены акции:

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

где

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

$ интенсивность - это число от -5 до 5 в зависимости от того, хороши или плохи новости для компании и

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

$ buy и $ sell представляют собой количество купленных и проданных акций компании соответственно.

Проблема с этой формулой в том, что, даже если интенсивность отрицательная (даже -5), коэффициент отношения всегда добавляется к цене, что увеличивает общий коэффициент. Цены обновляются каждые 10 секунд, и, согласно приведенной выше формуле, они продолжают расти и никогда не снижаются. Итак, может ли кто-нибудь помочь мне с этой формулой, чтобы она больше соответствовала реальному фондовому рынку?


person Archit Verma    schedule 10.10.2013    source источник
comment
Вы просите нас предоставить алгоритм, который приблизит поведение фондового рынка?   -  person Mike Brant    schedule 10.10.2013
comment
Отношение будет отрицательным, если $ продажа ›$ покупка или больше людей продают, чем покупают. Тогда было бы разумно, чтобы цена акции снизилась. Кроме того, вы придаете коэффициенту в 5 раз больший вес, чем случайную интенсивность, поэтому ваша модель будет более склонна к покупке / продаже по сравнению с новостями.   -  person Dillon Welch    schedule 10.10.2013
comment
Если $itensity может быть отрицательным, тогда вы получите (потенциально) rand(5,-10), который является недопустимым набором аргументов. максимальное значение не может быть меньше минимального.   -  person Marc B    schedule 10.10.2013
comment
Это математический / экономический вопрос. Не вопрос программирования.   -  person Etienne Miret    schedule 10.10.2013
comment
@MikeBrant Да, улучшенный.   -  person Archit Verma    schedule 10.10.2013
comment
@ArchitVerma Если вы можете это сделать, я бы посоветовал держать это в секрете, потому что вы только что сделали себя очень богатым человеком. Каждый трейдер в мире ищет похожий алгоритм.   -  person Mike B    schedule 10.10.2013
comment
@MikeB - я думаю, вы завышаете ожидания OP; это игра, и он ищет алгоритм, который ведет себя как фондовый рынок, а не алгоритм, моделирующий реальный рынок.   -  person dimo414    schedule 10.10.2013
comment
На самом деле, я считаю, что все, о чем здесь просят, - это как скорректировать формулу, чтобы она не увеличивалась постепенно со временем. Это простая задача программирования / математики, экономики / статистики не требуется.   -  person RBarryYoung    schedule 10.10.2013
comment
@RBarryYoung Да, это именно то, что я ищу.   -  person Archit Verma    schedule 10.10.2013
comment
Как устанавливаются числа $buy и $sell? На них влияет то, только что пошла цена вверх или вниз?   -  person RBarryYoung    schedule 10.10.2013
comment
@RBarryYoung «$ buy» и «$ sell» просто представляют количество акций конкретной компании, которые были куплены и проданы соответственно. Это зависит от игроков.   -  person Archit Verma    schedule 10.10.2013
comment
Умм, разве они не всегда должны быть равны? Вы не можете купить что-либо, если это не продаст кто-то другой.   -  person RBarryYoung    schedule 10.10.2013
comment
На самом деле мои тестовые модели продолжают показывать мне, что ваша общая тенденция должна быть вниз, а не вверх из-за +%increase,-%decrease неравенства.   -  person RBarryYoung    schedule 10.10.2013


Ответы (1)


Если я правильно понимаю, вы пытаетесь определить алгоритм для определения логической следующей цены на основе текущей цены, некоторой рыночной активности и случайного ввода. Это называется Случайным блужданием, и связанная страница довольно информативна.

В экономике «гипотеза случайного блуждания» используется для моделирования цен на акции и других факторов. Эмпирические исследования обнаружили некоторые отклонения от этой теоретической модели, особенно в краткосрочных и долгосрочных корреляциях.

Нам сложно предоставить вам точную функцию, поскольку точное поведение, которое вы ожидаете от такой функции, по своей сути зависит от приложения. Однако можно протестировать поведение и улучшить его, вытащив его в отдельный метод и настроив его до тех пор, пока не увидите желаемое поведение.

Я бы посоветовал перенести это поведение, которое вы определили, в 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() - это прямая замена, обеспечивающая лучшую случайность.
person dimo414    schedule 10.10.2013
comment
Спасибо за указание на главный недостаток определения $ran. - person Archit Verma; 10.10.2013