Tongkui Yu分享 http://blog.sciencenet.cn/u/ytkui

博文

硕士论文(附录B: 股市模拟SWARM JAVA源程序):基于主体的股市模型及其复杂动力行为研究——模拟实验和理论分析

已有 6318 次阅读 2008-1-1 17:56 |个人分类:我的论文|关键词:学者

B: 股市模拟SWARM JAVA程序
 
1. 交易者类
import swarm.objectbase.SwarmObjectImpl;
import swarm.Globals;
import swarm.defobj.Zone;
import swarm.gui.Raster;
import swarm.space.Grid2dImpl;
 
/**
 * <p>Title: Agent.java</p>
 * <p>Description: 定义交易者市场行为规则.</p>
 * <p>Copyright:YuTongkui (c) 2005</p>
 * <p>Company:CQU CEBA</p>
 * @author YuTongkui
 * @version 1.0
 */
 
public class Agent extends SwarmObjectImpl {
 
 public int strategy;
 public byte color;
 public int x;
 public int y;
 public int agentID;
 public Market market;
 public Grid2dImpl world;
 
 public Agent(Zone aZone,Market market,Grid2dImpl world,int x,int y,int agentID) {
 
    super(aZone);
 
    this.market=market;
    this.world=world;
    this.x=x;
    this.y=y;
    this.agentID=agentID;
 
    market.N++;
 
    double temp=Math.random();
    if(temp<=0.8){
      strategy=0;
      market.numFundamental++;
      setColor((byte)0);
    }
    else if(temp>0.8&&temp<=0.9)
    {
      strategy=1;
      market.numOptimistic++;
      setColor((byte)1);
    }
    else
    {
      strategy=2;
      market.numPessimistic++;
      setColor((byte)2);
    }
 
 }
 
 public void setColor(byte i){
    color=i;
 }
 
 public void decide(){
 
    if(this.strategy==0){
 
      if(market.numFundamental<=market.numLimit) return;
 
      if(Math.random()<=market.pftoo)
      {
 
        this.strategy=1;
        setColor((byte)1);
        market.numFundamental--;
        market.numOptimistic++;
      }
      else if(Math.random()<=(market.pftop/(1-market.pftoo)))
      {
        this.strategy=2;
        setColor((byte)2);
        market.numFundamental--;
        market.numPessimistic++;
      }
    }
 
    else if(this.strategy==1){
      if((market.numOptimistic+market.numPessimistic)<=market.numLimit) return;
      if(Math.random()<=market.potof)
      {
        this.strategy=0;
        setColor((byte)0);
        market.numFundamental++;
        market.numOptimistic--;
      }
      else if(Math.random()<=market.potop/(1-market.potof))
      {
        this.strategy=2;
        setColor((byte)2);
        market.numOptimistic--;
        market.numPessimistic++;
      }
    }
 
    else{
      if((market.numOptimistic+market.numPessimistic)<=market.numLimit) return;
      if(Math.random()<=market.pptof)
      {
        this.strategy=0;
        setColor((byte)0);
        market.numFundamental++;
        market.numPessimistic--;
      }
      else if(Math.random()<=market.pptoo/(1-market.pptof))
      {
        this.strategy=1;
        setColor((byte)1);
        market.numOptimistic++;
        market.numPessimistic--;
      }
    }
 }
 
 public void drawSelfOn(Raster r)
 {
    r.drawPointX$Y$Color(x,y,color);
 }
}
 
2. 市场类
import swarm.Globals;
import swarm.objectbase.SwarmObjectImpl;
import swarm.defobj.Zone;
import swarm.collections.ListImpl;
import swarm.objectbase.EmptyProbeMapImpl;
import java.io.*;
import java.util.*;
import java.text.*;
 
/**
 * <p>Title: Market.java</p>
 * <p>Description: 设置市场环境,保存市场状态,制定交易规则.</p>
 * <p>Copyright: YuTongkui(c) 2005</p>
 * <p>Company: CQU CEBA</p>
 * @author YuTongkui
 * @version 1.0
 */
 
public class Market extends SwarmObjectImpl {
 
 public int N=0;
 public double v1=0.5;
 public double v2=0.75;
 public double tc=0.001;
 public double r=0.001;
 public double a1=0.25;
 public double a2=0.15;
 public double a3=0.8;
 public double pf=10;
 public double R=0.1;
 public double beta=0.5;
 public double a=0.01;
 public double b=0.05;
 public double s=0.8;
 public int intervals=500;
 public double dt=0.002;
 public int numLimit=0;
 
 
 public int numFundamental=0;
 public int numOptimistic=0;
 public int numPessimistic=0;
 
 public double pftoo;
 public double pftop;
 public double potof;
 public double potop;
 public double pptof;
 public double pptoo;
 public double ppup;
 public double ppdown;
 
 
 public int currentTime;
 public double dp;
 public double price;
 public PrintWriter out;
 
 public Market(Zone aZone,PrintWriter out) {
    super(aZone);
    this.out=out;
    currentTime=0;
 }
 
 public void calculate(){
    double u1=a1*(double)(numOptimistic-numPessimistic)/(double)(numOptimistic+numPessimistic)+a2*dp/v1;
    double u21=a3*((R*pf+dp/v2)/price-R-s*Math.abs((pf-price)/price));
    double u22=a3*(R-(R*pf+dp/v2)/price-s*Math.abs((pf-price)/price));
    pftoo=(1-a)*v2*(((double)numOptimistic/(double)N)*Math.exp(u21))+a*(1-b)*(double)numOptimistic/(double)(numOptimistic+numPessimistic);
    pftop=(1-a)*v2*(((double)numPessimistic/(double)N)*Math.exp(u22))+a*(1-b)*(double)numPessimistic/(double)(numOptimistic+numPessimistic);
    potof=(1-a)*v2*((double)numFundamental/(double)N*Math.exp(-1*u21))+a*b;
    potop=(1-a)*v1*(double)(numOptimistic+numPessimistic)/(double)N*Math.exp(-1*u1)+a*(1-b)*(double)numPessimistic/(double)(numOptimistic+numPessimistic);
    pptof=(1-a)*v2*((double)numFundamental/(double)N*Math.exp(-1*u22))+a*b;
    pptoo=(1-a)*v1*(double)(numOptimistic+numPessimistic)/(double)N*Math.exp(u1)+a*(1-b)*(double)numOptimistic/(double)(numOptimistic+numPessimistic);
    pftoo=dt*pftoo;
    pftop=dt*pftop;
    potof=dt*potof;
    potop=dt*potop;
    pptof=dt*pptof;
    pptoo=dt*pptoo;
 }
 public void clear(){
    double ed=(this.numOptimistic-this.numPessimistic)*tc+this.numFundamental*r*(pf-price);
    price=price+beta*ed*dt;
    dp=beta*ed;
 
    this.currentTime++;
    if(currentTime%intervals==0){
      out.println(price + " " +
                  (double) (numOptimistic - numPessimistic) /
                  (double) (numOptimistic + numPessimistic) + " " +
                  (1 - (double) (numOptimistic + numPessimistic) / (double) N));
    }
    if(currentTime%(50000)==0){
      out.close();
      try{
      out= new PrintWriter(new BufferedWriter(new FileWriter("v1 "+v1+"; v2 "+v2+";a1 "+a1+"; a2 "+a2+"; a3 "+a3+"; pf "+pf+"; R "+R+"; beta "+beta+"; a "+a+"; b "+b+"; s "+s+"; intervals "+intervals+"; limitRatio"+(double)numLimit/(double)N+" "+DateFormat.getDateTimeInstance().format(new Date()).replace(':','-')+" "+currentTime/50000+".out")));
      }
      catch(Exception e){}
    }
   }
}
 
3. 模型SWARM类
import swarm.objectbase.SwarmImpl;
import swarm.collections.ListImpl;
import swarm.space.Grid2dImpl;
import swarm.defobj.Zone;
import swarm.Globals;
import swarm.objectbase.EmptyProbeMapImpl;
import swarm.activity.ScheduleImpl;
import swarm.activity.ActionGroupImpl;
import swarm.activity.Activity;
import swarm.Selector;
import swarm.objectbase.Swarm;
import java.io.*;
import java.util.*;
import java.text.*;
 
 
/**
 * <p>Title: ModelSWARM.java</p>
 * <p>Description: 模型SWARM,管理所有agent并实现程序调度.</p>
 * <p>Copyright:YuTongkui (c) 2005</p>
 * <p>Company:CQU CEBA</p>
 * @author YuTongkui
 * @version 1.0
 */
 
public class ModelSwarm extends SwarmImpl {
 
 public int worldX=50;
 public int worldY=50;
 public int endTime=2000000;
 public int periods=4000;
 public double agentDensity=0.2;
 
 public double v1=0.5;
 public double v2=0.75;
 public double Tc=5;
 public double Tf=5;
 public double a1=1.5;
 public double a2=0.25;
 public double a3=1.5;
 public double pf=10;
 public double R=0.1;
 public double beta=0.5;
 public double a=0.01;
 public double b=0.05;
 public double s=0.8;
 public int intervals=500;
 public double limitRatio=0.0;
 
 public Market market;
 public ListImpl agentList;
 public Grid2dImpl world;
 public ScheduleImpl modelSchedule;
 
 public PrintWriter out;
 
 
 public ModelSwarm(Zone aZone) {
    super(aZone);
 
    EmptyProbeMapImpl modelProbeMap=new EmptyProbeMapImpl(aZone,this.getClass());
    modelProbeMap.addProbe(this.getProbeForVariable("worldX"));
    modelProbeMap.addProbe(this.getProbeForVariable("worldY"));
    modelProbeMap.addProbe(this.getProbeForVariable("agentDensity"));
    modelProbeMap.addProbe(this.getProbeForVariable("periods"));
    modelProbeMap.addProbe(this.getProbeForVariable("v1"));
    modelProbeMap.addProbe(this.getProbeForVariable("v2"));
    modelProbeMap.addProbe(this.getProbeForVariable("a1"));
    modelProbeMap.addProbe(this.getProbeForVariable("a2"));
    modelProbeMap.addProbe(this.getProbeForVariable("a3"));
    modelProbeMap.addProbe(this.getProbeForVariable("pf"));
    modelProbeMap.addProbe(this.getProbeForVariable("R"));
    modelProbeMap.addProbe(this.getProbeForVariable("s"));
    modelProbeMap.addProbe(this.getProbeForVariable("beta"));
    modelProbeMap.addProbe(this.getProbeForVariable("b"));
    modelProbeMap.addProbe(this.getProbeForVariable("a"));
    modelProbeMap.addProbe(this.getProbeForVariable("intervals"));
    modelProbeMap.addProbe(this.getProbeForVariable("limitRatio"));
    Globals.env.probeLibrary.setProbeMap$For(modelProbeMap,this.getClass());
 
 }
 
 public Object buildObjects(){
    super.buildObjects();
 
    Agent agent;
 
    try{
       out= new PrintWriter(new BufferedWriter(new FileWriter("v1 "+v1+"; v2 "+v2+";a1 "+a1+"; a2 "+a2+"; a3 "+a3+"; pf "+pf+"; R "+R+"; beta "+beta+"; a "+a+"; b "+b+"; s "+s+"; intervals "+intervals+"; limitRatio"+limitRatio+" "+DateFormat.getDateTimeInstance().format(new Date()).replace(':','-')+" "+0+".out")));
    }
    catch(Exception e){}
 
    market=new Market(getZone(),out);
 
    world=new Grid2dImpl(getZone(),worldX,worldY);
    world.fastFillWithObject(null);
 
    agentList=new ListImpl(getZone());
    for(int i=0;i<world.getSizeX();i++)
      for(int j=0;j<world.getSizeY();j++)
        if(Globals.env.uniformDblRand.getDoubleWithMin$withMax(0.0,1.0)<=agentDensity)
        {
          agent=new Agent(getZone(),market,world,i,j,agentList.getCount());
          world.putObject$atX$Y(agent,i,j);
          agentList.addLast(agent);
        }
 
    setMarketParameters();
    endTime=periods*intervals;
 
    return this;
 }
 
 public Object buildActions(){
    super.buildActions();
 
    ActionGroupImpl modelActions=new ActionGroupImpl(getZone());
    Selector sel;
 
    sel=SwarmUtils.getSelector(market,"calculate");
    modelActions.createActionTo$message(market,sel);
 
    sel=SwarmUtils.getSelector("Agent","decide");
    modelActions.createActionForEach$message(agentList,sel);
 
    sel=SwarmUtils.getSelector(market,"clear");
    modelActions.createActionTo$message(market,sel);
 
    sel=SwarmUtils.getSelector(this,"checkTime");
    modelActions.createActionTo$message(this,sel);
 
    modelSchedule=new ScheduleImpl(getZone(),1);
    modelSchedule.at$createAction(0,modelActions);
 
    return this;
 }
 
 public Activity activateIn(Swarm swarmContext){
    super.activateIn(swarmContext);
    modelSchedule.activateIn(this);
    return this.getActivity();
 }
 
 public void checkTime(){
    if(Globals.env.getCurrentTime()>=endTime)
    {
      this.getActivity().terminate();
      market.out.close();
    }
 }
 
 public double getPrice(){
    return market.price;
 }
 
 public double getX(){
    return (double)(market.numOptimistic-market.numPessimistic)/(double)(market.numOptimistic+market.numPessimistic);
 }
 
 public double getY(){
    return (double)market.numFundamental/(double)market.N;
 }
 
 public void setMarketParameters(){
    market.v1=v1;
    market.v2=v2;
    market.a1=a1;
    market.a2=a2;
    market.a3=a3;
    market.pf=pf;
    market.R=R;
    market.beta=beta;
    market.s=s;
    market.b=b;
    market.a=a;
    market.intervals=intervals;
    market.numLimit=(int)(this.limitRatio*market.N);
    market.dt=1.0/(double)intervals;
    market.tc=Tc/(double)market.N;
    market.r=Tf/(double)market.N;
    market.price=pf;
 }
 
}
 
4. 观察SWARM类
import swarm.simtoolsgui.GUISwarmImpl;
import swarm.space.Object2dDisplay;
import swarm.space.Object2dDisplayImpl;
import swarm.gui.Raster;
import swarm.gui.ZoomRaster;
import swarm.gui.ZoomRasterImpl;
import swarm.defobj.Zone;
import swarm.gui.Colormap;
import swarm.gui.ColormapImpl;
import swarm.Selector;
import swarm.activity.ActionGroupImpl;
import swarm.activity.ScheduleImpl;
import swarm.activity.Activity;
import swarm.objectbase.Swarm;
import swarm.Globals;
import swarm.analysis.EZGraphImpl;
import swarm.analysis.EZDistributionImpl;
import swarm.analysis.EZDistributionCImpl;
import swarm.analysis.EZDistribution;
import swarm.analysis.EZDistributionC;
import java.io.*;
import swarm.objectbase.EmptyProbeMapImpl;
 
/**
 * <p>Title: ObserverSWARM.java</p>
 * <p>Description: 观察者SWARM,提供图形用户界面.</p>
 * <p>Copyright:YuTongkui (c) 2005</p>
 * <p>Company:CQU CEBA</p>
 * @author YuTongkui
 * @version 1.0
 */
 
public class ObserverSwarm extends GUISwarmImpl {
 
 public int displayFrequency=1;
 public int zoomFactor=5;
 
 public boolean simulationFinished=false;
 
 public ModelSwarm modelSwarm;
 
 public ZoomRaster worldRaster;
 public Object2dDisplay agentDisplay;
 
 public EZGraphImpl priceGraph;
 public EZGraphImpl xGraph;
 public EZGraphImpl yGraph;
 
 public ScheduleImpl displaySchedule;
 
 public ObserverSwarm(Zone aZone) {
    super(aZone);
    EmptyProbeMapImpl displayProbeMap=new EmptyProbeMapImpl(aZone,this.getClass());
    displayProbeMap.addProbe(this.getProbeForVariable("displayFrequency"));
    displayProbeMap.addProbe(this.getProbeForVariable("zoomFactor"));
    Globals.env.probeLibrary.setProbeMap$For(displayProbeMap,this.getClass());
 
 }
 
 public Object buildObjects(){
    super.buildObjects();
 
    Selector sel;
    modelSwarm=new ModelSwarm(getZone());
 
    Globals.env.createArchivedProbeDisplay(this,"DisplaySwarm");
    Globals.env.createArchivedProbeDisplay(modelSwarm,"ModelSwarm");
 
    this.getControlPanel().setStateStopped();
 
    priceGraph=new EZGraphImpl(getZone(),"price","time","price","priceGraph");
    sel=SwarmUtils.getSelector(modelSwarm,"getPrice");
    priceGraph.createSequence$withFeedFrom$andSelector("price",modelSwarm,sel);
 
    xGraph=new EZGraphImpl(getZone(),"confidence index","time","confidence index","xGraph");
    sel=SwarmUtils.getSelector(modelSwarm,"getX");
    xGraph.createSequence$withFeedFrom$andSelector("x",modelSwarm,sel);
 
    yGraph=new EZGraphImpl(getZone(),"rationality index","time","rationality index","yGraph");
    sel=SwarmUtils.getSelector(modelSwarm,"getY");
    yGraph.createSequence$withFeedFrom$andSelector("y",modelSwarm,sel);
 
    modelSwarm.buildObjects();
 
    Colormap colormap=new ColormapImpl(getZone());
    colormap.setColor$ToName((byte)0,"red");
    colormap.setColor$ToName((byte)1,"yellow");
    colormap.setColor$ToName((byte)2,"blue");
    colormap.setColor$ToName((byte)3,"black");
 
    this.worldRaster=new ZoomRasterImpl(getZone(),"worldRaster");
    sel=SwarmUtils.getSelector(this,"_worldRasterDeath_");
    this.worldRaster.enableDestroyNotification$notificationMethod(this,sel);
    this.worldRaster.setZoomFactor(this.zoomFactor);
    this.worldRaster.setColormap(colormap);
    this.worldRaster.setWidth$Height(modelSwarm.worldX,this.modelSwarm.worldY);
    this.worldRaster.setWindowTitle("Stock Market");
    this.worldRaster.pack();
 
    sel=SwarmUtils.getSelector("Agent","drawSelfOn");
    agentDisplay=new Object2dDisplayImpl(getZone(),this.worldRaster,this.modelSwarm.world,sel);
    agentDisplay.setObjectCollection(this.modelSwarm.agentList);
 
    return this;
 }
 
 public Object buildActions(){
    super.buildActions();
    modelSwarm.buildActions();
 
    Selector sel;
    ActionGroupImpl displayActions=new ActionGroupImpl(getZone());
 
    sel=SwarmUtils.getSelector(agentDisplay,"display");
    displayActions.createActionTo$message(agentDisplay,sel);
 
    sel=SwarmUtils.getSelector(priceGraph,"step");
    displayActions.createActionTo$message(priceGraph,sel);
 
    sel=SwarmUtils.getSelector(xGraph,"step");
    displayActions.createActionTo$message(xGraph,sel);
 
    sel=SwarmUtils.getSelector(yGraph,"step");
    displayActions.createActionTo$message(yGraph,sel);
 
    sel=SwarmUtils.getSelector(worldRaster,"drawSelf");
    displayActions.createActionTo$message(this.worldRaster,sel);
 
    sel=SwarmUtils.getSelector(this.getActionCache(),"doTkEvents");
    displayActions.createActionTo$message(this.getActionCache(),sel);
 
    sel=SwarmUtils.getSelector(this,"checkForDone");
    displayActions.createActionTo$message(this,sel);
 
    this.displaySchedule=new ScheduleImpl(getZone(),1);
    this.displaySchedule.at$createAction(0,displayActions);
 
    return this;
 }
 
 public Activity activateIn(Swarm swarmContext){
    super.activateIn(swarmContext);
    this.modelSwarm.activateIn(this);
    this.displaySchedule.activateIn(this);
    return this.getActivity();
 }
 
 public void checkForDone(){
    if(simulationFinished){
      System.out.println("I said to QUIT");
      modelSwarm.getActivity().terminate();
      modelSwarm.out.close();
      this.modelSwarm.drop();
      this.getControlPanel().setStateQuit();
    }
    else if(this.modelSwarm.getActivity().getStatus()==Globals.env.Completed){
      this.simulationFinished=true;
      System.out.println("The simulation stopped after "+Globals.env.getCurrentTime()+" periods.");
      System.out.println("Press QUIT when ready!");
      this.getControlPanel().setStateStopped();
    }
 }
 
 public Object _worldRasterDeath_(Object caller){
    this.worldRaster.drop();
    this.worldRaster=null;
    return this;
 }
 
}
 
5. 主运行程序类
import swarm.Globals;
 
/**
 * <p>Title: StartASM.java</p>
 * <p>Description: 主运行程序,程序入口.</p>
 * <p>Copyright:YuTongkui (c) 2005</p>
 * <p>Company:CQU CEBA</p>
 * @author YuTongkui
 * @version 1.0
 */
 
public class StartASM {
 
 public StartASM() {
 }
 
 public static void main(String[] args){
    ObserverSwarm displaySwarm;   
    Globals.env.initSwarm("ASM","2.2","y@y",args);
    displaySwarm=new ObserverSwarm(Globals.env.globalZone);
    displaySwarm.buildObjects();
    displaySwarm.buildActions();
    displaySwarm.activateIn(null);
    displaySwarm.go();
    displaySwarm.drop();
 }
}
 
该程序需要在SWARM JAVA中运行。


https://m.sciencenet.cn/blog-4716-13695.html

上一篇:硕士论文(第3章):基于主体的股市模型及其复杂动力行为研究——模拟实验和理论分析
下一篇:精彩电视推荐——大过年

0

发表评论 评论 (3 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-3 20:26

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部