Создайте фиктивное изменение цены опциона на акции - PullRequest
0 голосов
/ 20 февраля 2012

Что я делаю

Я делаю график вымышленных опционов на акции.Цена обновляется каждую секунду , с этой функцией

function stockVariation($price,$max_up,$max_down)
{
    // Price > 1
    if($price > 1)
    {
        // Calculate
        $ratio=(mt_rand(0,$max_up/2)-mt_rand(0,$max_down/2))/1000;
        $price+=$ratio;
    }
    // Price <=1 (we don't want 0 or negative price...)
    else
    $price+=mt_rand(1,$max_up)/1000;

    return round($price,3);
}

Я использую значения max_up и max_down (от 10 до 100) для постепенного изменения цены и имитации некоторой волатильности.

Например, при max_up: 40 и max_down: 45 цена будет постепенно снижаться.

Мой вопрос

Но проблема в том, чтогенерируемые цены слишком волатильны, даже если max_up = max_down.Результат "неестественный".(например, +10 пунктов за один день при базовой цене 15 000).

Результат изменения цены за час в течение 24 часов price evolution per hour in 24 hour

Возможно создание раунда (цена в долларах, 4)и деление на 10 000 вместо 1 000, будет лучше?

Если у кого-нибудь есть идея или совет, чтобы произвести «естественную» эволюцию цен, заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

В дне 86400 секунд, поэтому вам нужно разделить его на гораздо большее число. И вместо того, чтобы складывать и вычитать, вы можете захотеть умножить текущую цену на коэффициент, который немного больше или меньше 1. Это имитирует процентное увеличение или уменьшение, а не абсолютную прибыль или убыток.

function stockVariation($price, $max_up, $max_down)
{
  // Convert up/down to fractions of the current price.
  // These will be very small positive numbers.
  $random_up = mt_rand(0, $max_up) / $price;
  $random_down = mt_rand(0, $max_down) / $price;

  // Increase the price based on $max_up and decrease based on $max_down.
  // This calculates the daily change that would result, which is slightly
  // larger or smaller than 1.
  $daily_change = (1 + $random_up) / (1 + $random_down);

  // Since we're calling this function every second, we need to convert
  // from change-per-day to change-per-second.  This will make only a
  // tiny change to $price.
  $price = $price * $daily_change / 86400;

  return round($price, 3);
}
0 голосов
/ 06 февраля 2014

Опираясь на идею, вы можете использовать фактическое число волатильности.Если вы хотите, например, волатильность 35% в год, вы можете найти волатильность в секунду.В псевдокоде:

vol_yr = 0.35
vol_month = vol_yr * sqrt(1.0/12)
vol_second = vol_yr * sqrt(1.0/(252 * 86400)) # or 365 * 86400

Затем каждую секунду вы «подбрасываете монету» и умножаете или делите текущую цену акций на (1 + vol_second).Это принцип создания биномиальных деревьев для оценки экзотических опционов на акции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...