?? trader.m
字號:
// Trader.m// This file defines the methods traders use to maximize their// utility of expected wealth (via the stock market). // Again, it should be general// enough to work for all types of traders regardless of their// motivations or utility functions. They should determine their// desired holdings of the risky and riskless assets given all// relevant information and submit their "demand" to the "market// maker". //// The open question is how to submit these demands to the market// maker. Should they submit 1) a demand function, 2) a share// amount and a limit price, 3) a share amount and no price --// implying that they'll take whatever the market clearing price is.// 4) ???? // or should they have the flexibility to do some combo of the // above.//#import "Trader.h"// Implementation of a trader ..@implementation Trader-createEnd {/* Create a second generator so that the random CF stream for each test is identical. It is not as important to ensure these biases are consistent from test to test since they don't exist in some tests. The generator is centralized in the mktMaker so that each subsequent drawing for various traders is different for a given period.*/ randomGenerator = [mktMaker getRandomGen2]; // Don't call if variance is zero. Some traders won't use // this functionality (e.g., the mkt "reporter") if (liqVar != 0) liqNeedDist = [NormalDist create: [self getZone] setGenerator: randomGenerator setMean: liqMean setVariance: liqVar]; biasedForecastDist = [NormalDist create: [self getZone] setGenerator: randomGenerator setMean: 0.05 setVariance: 0.000625]; unBiasedForecastDist = [NormalDist create: [self getZone] setGenerator: randomGenerator setMean: 0 setVariance: 0.000625]; riskyGrowthRate = [mktMaker getRiskyGrowthRate]; riskLessRate = [mktMaker getRiskLessRate]; daysTillEarnings = 90; // default risky discount rate is 10% annual or 2.5% qtly discountRate = 0.025; // default risk aversion riskAversion = 3; // be sure it's initialized periodOfBankruptcy = 0; return [super createEnd];}-setDiagLevel: (int) l{ if (diagLevel & METHOD_ENTRY) printf("*** setDiagLevel (Trader) entry\n"); diagLevel = l; return self;}-setLiqMean: (double) m liqVar: (double) v { liqMean = m; liqVar = v; return self;}-(double) getLiqNeeds { int period; // make liqNeeds a "real" value liqNeeds = [liqNeedDist getDoubleSample]; period = [mktStats getPeriod]; liqNeeds = pow (1+riskLessRate, period) * liqNeeds; cumLiqNeeds = cumLiqNeeds + liqNeeds; // This is NET liquidity needs, so could be positive // when earnings outpaces expenses. [self addCash: liqNeeds]; return liqNeeds;}// This allows the mktmaker to tell this trader how many units// he bought (+) or sold (-) this period. This is not certain// to be equal to demand due to rationing or price in excess of// limit order-addRiskyUnits: (double) u { if (diagLevel & METHOD_ENTRY) printf("*** addRiskyUnits (Trader) entry\n"); riskyUnits = riskyUnits + u; return self;}-subtractRiskyUnits: (double) u { if (diagLevel & METHOD_ENTRY) printf("*** subtractRiskyUnits (Trader) entry\n"); riskyUnits = riskyUnits - u; return self;}-(double)checkRiskyUnits { if (diagLevel & METHOD_ENTRY) printf("*** checkRiskyUnits (Trader) entry\n"); return riskyUnits;}-addRiskLessUnits: (double) u { if (diagLevel & METHOD_ENTRY) printf("*** addRiskLessUnits (Trader) entry\n"); riskLessUnits = riskLessUnits + u; return self;}-subtractRiskLessUnits: (double) u { if (diagLevel & METHOD_ENTRY) printf("*** subtractRiskLessUnits (Trader) entry\n"); riskLessUnits = riskLessUnits - u; return self;}-(double)checkRiskLessUnits { if (diagLevel & METHOD_ENTRY) printf("*** checkRiskLessUnits (Trader) entry\n"); return riskLessUnits;}-addCash: (double) c { if (diagLevel & METHOD_ENTRY) printf("*** addCash (Trader) entry\n"); cash = cash + c; return self;}-(double) checkCash { if (diagLevel & METHOD_ENTRY) printf("*** checkCash (Trader) entry\n"); return cash;}-subtractCash: (double) c { if (diagLevel & METHOD_ENTRY) printf("*** subtractCash (Trader) entry\n"); cash = cash - c; return self;}-setEndow: (double) risky : (double) riskless { if (diagLevel & METHOD_ENTRY) printf("*** setEndow (Trader) entry\n"); riskyUnits = risky; riskLessUnits = riskless; initWealth = [mktStats getRiskyLagPrice:0] * riskyUnits + [mktStats getRiskLessLagPrice:0] * riskLessUnits; if (diagLevel & TRADER_WEALTH) { printf ("Trader <%s> is up with (%f)\n", [self getTraderName], (double) initWealth); } return self;}-setMktMaker: (id) m { if (diagLevel & METHOD_ENTRY) printf("*** setMktMaker (Trader) entry\n"); mktMaker = m; return self;}-setMktStats: (id) m { if (diagLevel & METHOD_ENTRY) printf("*** setMktStats (Trader) entry\n"); mktStats = m; return self;}-setTraderName: (char *) n { if (diagLevel & METHOD_ENTRY) printf("*** setName (Trader) entry\n"); strcpy (name, n); if (diagLevel & TRADER_MISC) { printf ("NAME (%s)\n", name); } return self;}-(char *) getTraderName{ if (diagLevel & METHOD_ENTRY) printf("*** getTraderName (Trader) entry\n"); return (char *) &name[0];}- (double) getRiskyValue{ if (diagLevel & METHOD_ENTRY) printf("*** getRiskyValue (Trader) \n"); return (riskyValue);}-(double) getWealth{ if (diagLevel & METHOD_ENTRY) printf("*** getWealth (Trader) entry\n"); // Determine current wealth based on last period's mkt clearing // price(s) and individual asset holdings. riskyPrice = [mktStats getRiskyLagPrice:0]; riskLessPrice = [mktStats getRiskLessLagPrice:0]; return (( riskyPrice * riskyUnits) + ( riskLessPrice * riskLessUnits) + cash );} -(double) getInitWealth{ if (diagLevel & METHOD_ENTRY) printf("*** getInitWealth (Trader) entry\n"); return initWealth;}-setBRPeriod: (int) p { // only do this when wealth FIRST goes negative, since traders // aren't removed from the economy, positive liq needs and subsequent // trading could bring them back if (periodOfBankruptcy == 0) periodOfBankruptcy = p; return self;}-(int) getBRPeriod { return periodOfBankruptcy;}-printWealth { if (diagLevel & TRADER_WEALTH) { printf("<%s> wealth is <%f>", [self getTraderName], wealth); printf(" riskyU <%f> riskLU <%f> C <%f>\n", riskyUnits, riskLessUnits, cash); } return self;}-printEstimates { if (diagLevel & TRADER_STRATEGY) printf ("<%s> in (%d) days, expect a dividend payment.\n", [self getTraderName], daysTillEarnings); return self;}-printValue { if (diagLevel & TRADER_STRATEGY) printf (" values risky asset at (%f) with (%d) until next earnings.\n", riskyValue, daysTillEarnings); return self;}-printPortChoice {#if 0 if (diagLevel & TRADER_STRATEGY) { printf(" Portfolio Choice with Expret (%f) Var (%f) optFRAC (%f) optUNIT (%f) \n", expRiskyRet, rvar, optRiskyFraction, optRiskyUnits); }#endif return self;}-printDemand {#if 0 if (diagLevel & TRADER_STRATEGY) { printf(" Submitted b(%f)@(%f) o(%f)@(%f)\n", riskyBidAmt, riskyBid, riskyOfferAmt, riskyOffer); }#endif return self;}-step {// NULL METHOD AT THIS POINT BECAUSE NOISETRADER AND FUNDTRADER// OVERWRITE THIS METHOD if (diagLevel & METHOD_ENTRY) printf("*** step (Trader) entry\n"); // earnings reports are 90 days apart and there are 4 per "year" if (--daysTillEarnings == -1) daysTillEarnings = 89;// printf ("TRADER STEP METHOD\n "); return self;}-print { printf("TEST\n"); return self;}@end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -