2012-02-19 2 views
0

Что яГенерация фиктивного опционов на акции изменения цены

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

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

Есть 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

Спасибо за ваш ответ. Отображаемые значения являются круглыми (цена, 3), если я делю больше, не будет видимой эволюции за последние 2 минуты графика (в реальном времени), я думаю. С процентами большие цены будут расти большими, чем небольшие цены, я тоже пробовал. – Valky

+0

Это реалистично: цены на акции обычно не меняются очень сильно с минуты на минуту, поэтому вы можете отображать больше точности. Если изменения должны быть достаточно большими, чтобы быть видимыми, они также будут достаточно большими, чтобы обеспечить высокую волатильность. В качестве альтернативы, вы можете рассчитывать новую цену каждую минуту, а не каждую секунду, а делиться на 1440 вместо 86400? Это может сделать изменения более заметными. –

+0

График реального времени, рассчитывается по секундам. Я копировал/вставлял, но вы забыли «;» каждая строка ... ;-) После тестирования вашего решения график плоский ... эволюция близка к 0,000001. Я думаю, что лучший способ - объединить акции ($ price, 5) и разделить на 100 000 коэффициент. Затем я показываю только раунд ($ price, 3). Спасибо, в любом случае. – Valky

0

Основываясь на идее, вы можете использовать фактическое значение волатильности. Если вы хотите, например, волатильность 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). Это принцип того, как создаются биномиальные деревья для оценки экзотических вариантов запаса.

Смежные вопросы