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();
}
}
https://blog.sciencenet.cn/blog-4716-13695.html
上一篇:
硕士论文(第3章):基于主体的股市模型及其复杂动力行为研究——模拟实验和理论分析下一篇:
精彩电视推荐——大过年