?? asmmodel.java
字號:
package asm;import java.util.Vector;/** * Title: Artificial Stock Market * Description: 人工模擬股市(來源:SFI的Swarm版本)的Java版本 * Copyright: Copyright (c) 2003 * Company: http://agents.yeah.net * @author jake * @version 1.0 *///該類主要負責股市的整體運行仿真public class AsmModel { int modelTime; /*股市的當前的仿真周期*/ Vector agentList; /*Agents的一個集合*/ Specialist specialist=new Specialist(); /*市場專家,負責市場的出清*/ Dividend dividendProcess; /*一個隨機過程模型,產生股息流*/ World world; /*世界模型,包括對當前股市狀態的編碼信息、價格、股息等參數的存儲*/ static asm localasm; //指向主程序的指針 AgentParam bfParams; /*Agent的參數集合*/ ASMParam asmModelParams; //股市的參數集合 public AsmModel(asm local) { //初始化人工股市 modelTime=0; asmModelParams=local.ASMParams; bfParams=local.AgentParams; agentList=new Vector(); localasm=local; }int getNumBFagents(){ //得到agent的數目 return asmModelParams.numBFagents;}/*" Returns the initialcash value, which is held in asmModelParams"*/double getInitialCash(){ return asmModelParams.initialcash;}public void OneStep(){ //股市的一步仿真 //從隨機過程股息流里面產生一期的股息 periodStepDividend(); //讓每個agent進行賦稅 for(int i=0;i<asmModelParams.numBFagents;i++){ Agent ag=(Agent)agentList.elementAt(i); ag.creditEarningsAndPayTaxes(); } //更新世界的編碼 world.updateWorld(); //讓每個agent準備開始進行交易 for(int i=0;i<asmModelParams.numBFagents;i++){ Agent ag=(Agent)agentList.elementAt(i); //每個agent對股市進行預測,也包括遺傳算法的運行 ag.prepareForTrading(); } // 根據每個agent的預測得到總的股票的需求量和供給量,并最后絕對價格。 periodStepPrice(); //完成交易,更新agent的財富、現金、持股量 specialist.completeTrades(agentList,world); //對每個agent的預測進行評估,讓他們進行學習 for(int i=0;i<asmModelParams.numBFagents;i++){ Agent ag=(Agent)agentList.elementAt(i); ag.updatePerformance(); //紀錄agent的當前狀態 ag.RecordHistory(modelTime); } //紀錄世界的當前狀態 world.RecordHistory(modelTime); //在主程序的狀態文本中顯示當前的狀態和運行周期 localasm.setStatus("仿真周期:"+String.valueOf(modelTime)+",正在運行..");}/*"返回當前的方針周期數值"*/long getModelTime(){ return modelTime;}/*創建初始化的對象的模型*/void buildObjects(){ int i; localasm.setStatus("正在初始化股息流隨機模型..."); /* 初始化隨機過程 */ dividendProcess = new Dividend(); dividendProcess.initNormal(); dividendProcess.baseline=asmModelParams.baseline; dividendProcess.mindividend=asmModelParams.mindividend; dividendProcess.maxdividend=asmModelParams.maxdividend; dividendProcess.amplitude=asmModelParams.amplitude; dividendProcess.setPeriod(asmModelParams.period); dividendProcess.setDerivedParams(); localasm.setStatus("正在初始化虛擬股市世界模型..."); //初始化虛擬股市世界 world = new World(); world.setintrate(asmModelParams.intrate); //決定采用那種方法計算移動平均值 if(asmModelParams.exponentialMAs==1) world.setExponentialMAs(true); else world.setExponentialMAs(false); //用設定好的數值確定世界的一些初始參數(包括股票初期的價格等等) world.initWithBaseline(asmModelParams.baseline); localasm.setStatus("正在初始化市場分析專家..."); //初始化市場分析專家 specialist =new Specialist(); specialist.maxprice=asmModelParams.maxprice; specialist.minprice=asmModelParams.minprice; specialist.setTaup(asmModelParams.taup); specialist.setSPtype(asmModelParams.sptype); specialist.maxiterations=asmModelParams.maxiterations; specialist.minexcess=asmModelParams.minexcess; specialist.eta=asmModelParams.eta; specialist.rea=asmModelParams.rea; specialist.reb=asmModelParams.reb; //初始化每個agent agentList.removeAllElements(); for (i = 0; i < asmModelParams.numBFagents; i++) { Agent agent; agent = new Agent(this); agent.setBFParameterObject(bfParams); agent.setWorld(world); agent.myID=i; agent.setintrate(asmModelParams.intrate); agent.setminHolding(asmModelParams.minholding,asmModelParams.mincash); agent.initialcash=asmModelParams.initialcash; agent.setInitialHoldings(); agent.position=asmModelParams.initholding; agent.initForecasts(); agentList.addElement(agent); localasm.setStatus("正在初始化Agent:"+String.valueOf(i+1)+"/"+String.valueOf(asmModelParams.numBFagents)); } localasm.setStatus("初始化完畢!");}/*讓隨機過程產生一個隨機的股息流,然后讓世界進行初始的編碼*/public void doWarmupStep(){ //modelTime++; double div = dividendProcess.dividend(); world.setDividend(div); world.updateWorld(); world.setPrice(div/(double)asmModelParams.intrate);}/*隨機過程產生一個股息數值,并把這個數值傳遞給world,然后讓仿真周期+1*/void periodStepDividend(){ modelTime++; world.setDividend(dividendProcess.dividend());}/*與分析專家產生出價格并告訴world*/void periodStepPrice(){ world.setPrice(specialist.performTrading(agentList,world));}public void terminate(){ //結束該類 agentList.removeAllElements();}}//股息流類,主要是一個隨機AR(p)過程class Dividend{ public double baseline; /*股息隨機過程的基線 // This is equal to the mean for a symmetric process // (i.e., if asymmetry = 0). "baseline" is set only // from the parameter file, and should NOT normally // be changed from the default value (10.0)."*/ public double amplitude; /*隨機振幅 // Measured in units of "baseline". The standard // deviation of the process is proportional to this."*/ public int period; /*自回歸的時間周期*/ public double mindividend; /*股息的底線*/ public double maxdividend; /*股息的上限*/ public double deviation; public double rho; public double gauss; public double dvdnd; //id normal; /*"A Swarm Normal Generator object"*/void initNormal(){}/*設置振幅放大的比例*/double setAmplitude(double theAmplitude){ amplitude = theAmplitude; if (amplitude < 0.0) amplitude = 0.0; if (amplitude > 1.0) amplitude = 1.0; amplitude = 0.0001*(int)(10000.0*amplitude); return amplitude;}/*設置周期參數,最小不能小于2*/int setPeriod(int thePeriod){ period = thePeriod; if (period < 2) period = 2; return period;}void setDerivedParams()/*設置各種參數*/{ //deviation是偏離度,沒有用到這個參數 deviation = baseline*amplitude; //rho是運行周期的倒數 rho =Math.exp(-1.0/((double)period)); rho = 0.0001*(int)(10000.0*rho); gauss = deviation*Math.sqrt(1.0-rho*rho); //產生股息 dvdnd = baseline + gauss*normal(1000);}/*" 返回股息的數值. 這是核心的方法 It does NOT use the global time, but simply assumes that one period passes between each call. Note that "time" may not be the same as the global variable "t" because shifts are introduced to maintain phase when certain parameters are changed."*/double dividend(){ //pj: // dvdnd = baseline + rho*(dvdnd - baseline) + gauss*normal(); //產生一個AR(1)過程 dvdnd = baseline + rho*(dvdnd - baseline) + gauss*normal(1000);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -