Computer Science МФТИ Changes    |    Index    |    Search
::: JASStockExchange :::
Parents: WebHome > AgentProjects
 
  ACM . Agent . JASStockExchange # Edit # Attach # Diffs # Printable # More :::

Main
• Register
• Users
• Site Map

Curriculum

Agent Web
• projects

Algorithms

Web Learn

Image Kit

ProgTech

Publishing

Проект "Stock Exchange".

Описание проекта.

Целью проекта являлось создание объектно-ориентированной библиотеки для моделирования процессов, происходящих на фондовой бирже.

Описание модели. Основными объектами на фондовой бирже являются акции (stock) и брокеры (stockbroker). Акции, анализируя обстановку, могут менять свою стоимость (cost). Брокеры также могут анализировать окружающий мир, и на основании своих умозаключений продавать или покупать акции. Причем под окружающим миром понимается не только реальное положение дел, но и вся предыстория процесса.

Реализация. Для реализации этой модели была выбрана многоагентная парадигма Swarm (рой), поскольку она идеально подходит для моделирования взаимодействий между интеллектуальными объектами. Сначала я выбрал выбрал платформу swarm (http://www.swarm.org), написанный на Objective C, но в последствии я услышал про Java Agent-based Simulation library (JAS) и перенес на нее свой код. Про JAS могу сказать, что в результате перехода на эту библиотеку код программы уменьшился почти вдвое, да и многие вещи оказалось легче реализовать.

Структура библиотеки. Библиотека состоит из нескольких классов:

  • StockExchangeModel - Класс модели, выполняющий основную черновую работу по созданию очереди сообщений, плоттеров и других вспомогательных объектов;
  • StockExchangeWorld - Класс окружающего мира (фондовой биржи), предоставляющий и хранящий различную информацию о состоянии биржи;
  • StockBroker - Класс брокера, выполняющий черновую работу по организации обработки сообщений;
  • Stock - Класс акции, выполняющий черновую работу по организации поведения акции;
  • StockHistory - Класс для хранения истории изменения состояния биржи.

Чтобы воспользоваться библиотекой JASStockExchange, достаточно наследоваться от этих классов и реализовать соответствующие методы, определяющие поведение системы.

Структура и описание модели, используемой в примере. Для иллюстрации использования моей библиотеки я написал простейший пример SimpleStockExchange, в котором реализована следующая модель поведения биржи:

  • Стоимость акции меняется по закону cost*amount=cost (суммарная стоимость всех акций не меняется, аналог закона сохранения энергии:)), то есть newCost=oldCost*oldAmount/newAmount:
private int oldAmount = -1; // В этой переменной хранится количество акций данного типа в предыдущий момент времени
/* 
* Вызывается движком JAS, когда необходимо пересчитать стоимость акции
*/
protected void updateCost() { 
        if(oldAmount==-1) oldAmount = world.getStockAmount(this);
        
        RandomGenerator rnd = Sim.getRnd();
        final double oldCost = world.getStockCost(this);
        final int newAmount = world.getStockAmount(this);
        double newCost = 0;
        
        newCost = (newAmount==0) ? oldCost+rnd.getDblFromTo(-oldCost/10,+oldCost/10) :
        oldCost*oldAmount/newAmount;
        
        world.setStockCost(this,newCost);
        oldAmount = newAmount;
}
  • Каждый брокер имеет два параметра: botCost и topCost, значения которых выбираются случайным образом из некоторого интервала на этапе построения модели и не меняются во время жизни объекта. Если стоимость каких-либо акций становится больше topCost, то брокер продает одну акцию этого типа, если их стоимость становится меньше botCost, то брокер покупает одну акцию этого типа, и, наконец, в случае, когда стоимость акции находится в интервале (botCost, topCost), брокер решает, что много не потеряет, если купит или продаст несколько акций (random(-10,10)):
topCost = Sim.getRnd().getDblFromTo(50,100);
botCost = Sim.getRnd().getDblFromTo(5,topCost);

protected void brokerStep(Iterator it) {
        while(it.hasNext()) {
                final Stock stock = (Stock)it.next();
                brokerStep(stock);
        }
}

private void brokerStep(Stock stock) {
        // узнаем стоимость акции
        final double cost = world.getStockCost(stock);
        if(oldCost==-1) oldCost = cost;
        int deltaNum = 0;
        if(cost<botCost) {
                // Купим
                deltaNum = +1;
        } else if(cost>topCost) {
                // Продадим
                deltaNum = -1;
        } else {
                // ну что ж, рискнем
                deltaNum = Sim.getRnd().getIntFromTo(-10,10);
        }
        deltaNum = brokerworld.addStocks(stock,deltaNum,cost);
        world.addStocks(stock,-deltaNum,cost);
}
  • Счастье брокера изменяется по элементарному закону: если дела идут на лад, то он счастливее, в противном случае - несчастнее:
private double oldWealth = 0; //количество денег у брокера в предыдущий момент времени
/* 
* Вызывается движком JAS, при необходимости пересчитать уровень счастья у данного брокера
*/
protected void updateHappiness() {
        // посмотрим, сколько денег у брокера сейчас (с учетом текущей стоимости акций)...
        double money = brokerworld.getWealth(); // узнаем количество наличных у брокера
        
        // и добавим деньги, вырученные бы брокером, продай он все свои акции
        Iterator it = world.stocks.iterator();
        while(it.hasNext()) {
                final Stock stock = (Stock)it.next();
                final double cost = world.getStockCost(stock);
                final int amount = brokerworld.getStockAmount(stock);
                money += cost*amount;
        }
        // дела идут успешно, если количество денег возрастает...
        if(money==oldWealth) return;
        final boolean isSuccess = money>oldWealth;
        // если дела на данной итерации прошли успешно, то счастье увеличивается, иначе...
        happiness += (isSuccess?0.001:-0.001);
        oldWealth = money;
}

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

Основные результаты.

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

Библиотека способна показывать по Вашему желанию такую информацию о состоянии биржы, как счастье брокеров (happiness), характеризующее удачность дел у брокера; количество денег у брокеров и на бирже; стоимость и количество акций на бирже. При желании список выводимых параметров можно расширить путем наследования от класса модели StockExchangeModel.

Возможные улучшения проекта.

Известны несколько недочетов в библиотеке JAS, связанные с недолгим существованием этого проекта, но, судя по тому, что между версиями 1.0beta и 1.0 существуют большие различия, JAS интенсивно развивается, и в ближайшем будущем, эти баги могут быть исправлены:).

1. Для установки параметров модели JAS использует Reflection API, в случае наследования вашей модели от StockExchangeModel, корректной записи значений в члены базового класса не происходит. Пришлось добавить одноименные поля в класс-наследник и записать значения в базовые следующим способом:

public int numBrokers;
public int numStockTypes;
public boolean shuffle;

public void buildModel() {
        super.numBrokers = numBrokers;
        super.numStockTypes = numStockTypes;
        super.shuffle = shuffle;
        super.buildModel();
};
Было бы хорошо разобраться, почему приходится прибегать к такому трюку.

2. Добавить возможность анализа истории изменения цены акций при покупках/продажах

3. Добавить возможности коммуникации/наблюдения брокеров друг за другом (посмотреть как поступил какой-нибудь "авторитет от биржи" и поступить аналогично)

Инсталляция.

Сборка библиотеки.

Для работы библиотеки JAS необходимо наличие j2sdk версии не ниже 1.4.

Скачайте откуда-нибудь JAS (скорее всего это будет http://jaslibrary.sourceforge.net) и разархивируйте в любую удобную для Вас директорию.

Распакуйте исходники библиотеки JASStockExchange (файл stockexchange.zip) в директорию JAS/projects, перейдите в эту директорию и наберите в командной строке:

  javac mipt\students\isaikin\jas\stockexchange\*.java -classpath ".;..\JAS.jar"
  jar cf stockexchange.jar mipt\students\isaikin\jas\stockexchange\*.class

Если у Вас правильно сконфигурированы переменные окружения, то Вы получите в результате файл stockexchange.jar с библиотекой JASStockExchange внутри.

Сборка примера.

Загрузите файл stockexchange-example.zip и распакуйте в директорию JAS/projects/StockExchange.

Перейдите в эту директорию и наберите в командной строке:

  javac *.java -classpath ".;..\stockexchange.jar;..\..\JAS.jar"

Запуск примера.

Перейдите в директорию JAS. В зависимости от версии в ней будет или не будет файлика desk.bat (если его не будет, рекомендую его создать самому) с таким примерно содержимым:

  start javaw -jar JAS.jar --desktop.

Этот файл нужен для запуска графической оболочки JAS Simulation Environment.

Запустите desk.bat и загрузите файл проекта (JAS/projects/stockexchange/StockExchange.sprj.xml)

Поменяйте параметры модели по Вашему желанию, затем выберите поочередно пункты меню Simulation/Build model и Simulation/Play.

Автор.

Исайкин Дмитрий, группа 931а, ФАКИ, МФТИ.?

-- IsaikinDmitry? - 27 May 2004

Attachment sort Action Size Date Who Comment
stockexchange-library.zip manage 11.4 K 02 Jun 2004 - 12:09 IsaikinDmitry? Исходники библиотеки
stockexchange-example.zip manage 10.3 K 03 Jun 2004 - 08:45 IsaikinDmitry? Исходники примера
StockExchange-SWARM.zip manage 7.7 K 03 Jun 2004 - 11:34 AndreyUstyuzhanin Первый проект StockExchange на базе SWARM

Rambler's Top100 Rambler's Top100


# Edit menu  

Topic revision r1.8 - 03 Jun 2004 - 11:34 GMT - AndreyUstyuzhanin
Topic parents: WebHome > AgentProjects
Copyright © 2003-2017 by the contributing authors.