Изменение цены опциона на акции по заказам пользователей (покупка / продажа) - PullRequest
4 голосов
/ 21 февраля 2012

После этого вопроса Генерирует фиктивное изменение цены опциона на акции

Я хочу смоделировать, что цена меняется, пока пользователи отдают приказ на покупку или продажу, как на реальной бирже.(Я делаю пользовательский случай, чтобы помочь вам понять.)

Начальное состояние "Пример опциона на акции" :

Компания X, цена опциона на акции $ 20 000

Задача CRON изменяет цену каждую секунду, с помощью этого PHP-скрипта:

function stockVariation($price,$max_up,$max_down)
{
    // Variation calculate, with volatility max (10 to 100)
    $ratio=(mt_rand(0,$max_up)-mt_rand(0,$max_down))/10000;
    // New price
    $price+=$ratio; 

    return round($price,5);
}

Волатильность создается случайными новостями, из-за которых $ max_up> $ max_down или $ max_up

Результат на картинке (1 час в минутах) Stock option price variation

Случай пользователя "Пример покупки" :

  • Пользователь отправляет заказ на покупку 1000 этой опции за $ 18 000
  • Система сохраняет заказ в базе данных
  • Задача CRON проверяется каждую минуту, если цена была <= доордер на покупку, последняя минута </li>
  • Когда цена этого опциона <= к этому ордеру, пользователь получает этот опцион на акции. </li>

Случай пользователя "Пример продажи" :

  • Пользователь отправляет заказ на продажу 1000 этой опции по цене $ 22 000
  • Система сохраняет заказ в базе данных
  • Задача CRON проверяется каждую минуту, если цена была> = для ордера на продажу, в последнюю минуту
  • Когда цена этого опциона> = для этого ордера, пользователь продает этот опцион на акции.

Моя проблема

Работает нормально, но это не реальный вариант биржевого рынка.

Мой вопрос

Как изменить цену в зависимости от цены и количества заказов?

Как и в случае с «законом спроса и предложения».

Например,( править относительно ответа Петра ):

function stockOrder($orderPrice,$orderQuantity,$type)//$type= buy or sell
{
    // Record the order in database (ok)
    // Compare with other orders (ok) 
    // $orderPrice<=$dbSellPrice or $orderPrice>=$dbBuyPrice
    if checks
       // Buy and sell at the best prices 
       // for quantities available holded by users (ok)
       // Record/update the holding of the stock (ok)
       // Update the price of the stock
    end if       
}

Возможно, я немного сумасшедший, чтобы думать, что это можно автоматизировать, но я верю в это, любая помощь поможетс благодарностью.

1 Ответ

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

Просто хотел бы расширить мой комментарий немного больше. Вот основной сценарий; Предположим, мы начинаем с нуля невыполненных заказов в базе данных / системе.

  1. Пользователь A подает лимитный ордер на продажу 20 единиц акций X @ $ 10.
  2. Пользователь B подает лимитный заказ на покупку 10 единиц акций X @ $ 12.

После шага 1 у вас будет один невыполненный ордер в системе, так как нет открытых ордеров для сопоставления.

После шага 2 заказ пользователя B, отправленный , может быть выполнен открытым ордером в системе. (Для простоты предположим, что порядок пользователя А может быть разбит, то есть не порядок «все или ничего»)

Причина, по которой заказ покупателя Пользователя B может быть выполнен по следующим двум причинам:

  1. Существует открытый ордер на продажу на количество, большее или равное количеству ордера на покупку.
  2. Предельная цена покупки больше или равна предельной цене продажи, поэтому цена сделки может быть согласована.

Пользователь А не хочет продавать меньше чем за 10 долларов, а Пользователь Б не хочет покупать больше чем за 12 долларов. Таким образом, в этом случае существует диапазон подходящих цен сделок, то есть подходит любая цена от 10 до 12 долларов США.

Проблема в поиске подходящей цены сделки. Как это определить? Выбрать середину диапазона? Это только одно решение. (На рынке с большой ликвидностью у вас может не быть подобных проблем, поскольку будет много открытых ордеров по разным ценам, а некоторые по рыночной цене.)

В качестве примера предположим, что вы выбрали цену сделки в размере 11 долларов, то есть середину подходящего диапазона. Заказ пользователя B теперь будет выполнен, и, поскольку заказ пользователя A был выполнен только частично, в системе останется один открытый заказ: пользователь A продаст свои оставшиеся 10 единиц по 10 долларов США. Цена последней сделки будет обновлена ​​до $ 11.

...