eFinancialPlanner  V1.0 (proof of concept)
Personal Financial Planning based on Maslowian Portfolio Theory
 All Classes Namespaces Files Functions Variables Typedefs Friends Macros Pages
market.class.cpp
Go to the documentation of this file.
1 
11 class market
12 {
13 public:
14  market (int person = 0);
15 
16  float* assetClass_covar = new float[(NBR_ASSET_CLASSES + 1) * (NBR_ASSET_CLASSES + 1)];
18  std::map <int, string> assetClass_name;
19 
20 /*** void set_mu(int person);
21  void set_covar(int person);
22  */
23 
24  //the personalized expected returns and covariances
25  std::map<int, float> ER;
26  std::map<int, std::map<int, float> > covar;
27  void load_ER (int person = 0, char person_type = 'i');
28  void save_ER (int person = 0, char person_type = 'i');
29  void load_covar(int person, char person_type = 'i');
30  void save_covar(int person, char person_type = 'i');
31 
33 
34 protected:
35  void reload_ER (int person, char person_type = 'i');
36  void reload_covar(int person, char what2do, char person_type = 'i');
37 
38 
39 };
40 
44 market::market(int person)
45 {
46  // if person > 0
47  // THEN
48  // Check if personalized assumptions exist,
49  // - if yes, load them, ie pass person to the set-functions
50  // - if not, then load the defaults (pass person = 0 to the set-functions.
51  // ELSE : pass 0 to the set-functions
52 
53 // load_ER(person);
54 // load_covar(person);
55 }
56 
57 
61 void market::load_ER(int person, char person_type)
62 {
63  int ac, count = 0;
64  string s;
66 
67  //cout << "<BR>PERSON:" << person;
68  if (person != 0 )
69  {
70  s = "SELECT * FROM " + oConfig.tbl_prefix + "_ER_person WHERE person = " + to_string(person) + " AND person_type = 'i';";
71  //cout << s;
72  db.res = db.stmt->executeQuery(s);
73  while (db.res->next())
74  {
75  ac = db.getInt("asset_class");
76  ER[ac] = db.getFloat("E_R");
77  assetClass_mu[ac] = db.getFloat("E_R"); //TODO : eliminate this
78  //cout << "<br>ER_person[" << ac << "]=" << ER[ac];
79  count++;
80  }
81  // get all the asset class names
82  string s = "SELECT * FROM " + oConfig.tbl_prefix + "_asset_classes;";
83  db.res = db.stmt->executeQuery(s);
84  while (db.res->next())
85  {
86  ac = db.getInt("asset_class_id");
87  assetClass_name[ac] = db.res->getString("asset_class_name");
88  }
89  }
90 
91  if (count < NBR_ASSET_CLASSES)
92  { // if we did not find a personalized expectation for each asset class, then we load the default values
93  // TODO allow this to be per organization, advisor, etc.
94  s = "SELECT * FROM " + oConfig.tbl_prefix + "_asset_classes;";
95  db.res = db.stmt->executeQuery(s);
96  while (db.res->next())
97  {
98  ac = db.getInt("asset_class_id");
99  ER[ac] = db.getFloat("E_R");
100  assetClass_mu[ac] = db.getFloat("E_R"); //TODO : eliminate this
101  assetClass_name[ac] = db.res->getString("asset_class_name");
102  }
103  }
104 }
105 
109 void market::save_ER(int person, char person_type)
110 {
111  int ac;
112  string s;
113  s = "DELETE FROM " + oConfig.tbl_prefix + "_ER_person WHERE person = " + to_string(person) + " AND person_type = 'i';";
114  if (db.runSQL(s)) {} else {}//{error_message = error_message + "<li>Please contact us. #errno E015</li>";}
115  s = "INSERT INTO " + oConfig.tbl_prefix + "_ER_person (asset_class, E_R, person, person_type) VALUES ";
116  for(ac=1; ac <= NBR_ASSET_CLASSES; ac++)
117  {
118  if (ac > 1) s = s + ", ";
119  s = s + "(" + to_string(ac) + ", " + to_string(ER[ac]) + ", "
120  + to_string(person) + ", \"i\")";
121  }
122  s = s + ";";
123  //error_message = error_message + "<br>" + s;
124  if (db.runSQL(s)) {}
125  else
126  {
127  error_message = error_message + "<li>Please contact us. #errno E015</li>";
128  }
129 }
130 
131 
135 void market::load_covar(int person, char person_type)
136 {
137  int ac_i, ac_j, count = 0;
139  if (person != 0)
140  {
141  string s = "SELECT * FROM " + oConfig.tbl_prefix + "_covar_person WHERE person = " + to_string(person) + " AND person_type = 'i';";
142  //cout << s;
143  db.res = db.stmt->executeQuery(s);
144  while (db.res->next())
145  {
146  ac_i = db.getInt("asset_class_i");
147  ac_j = db.getInt("asset_class_j");
148  covar[ac_i][ac_j] = db.getFloat("covar");
149  //cout << "<br>covar[" << ac_i << "," << ac_j << "] = " << covar[ac_i][ac_j];
150  assetClass_covar[INDEX(ac_i,ac_j)] = assetClass_covar[INDEX(ac_j,ac_i)] = db.getFloat("covar");
151  count++;
152  }
153  }
154  if (count < NBR_ASSET_CLASSES * NBR_ASSET_CLASSES)
155  {
156  // TODO allow this to be per organization, advisor, etc.
157  string s = "SELECT * FROM " + oConfig.tbl_prefix + "_covar;";
158  db.res = db.stmt->executeQuery(s);
159  while (db.res->next())
160  {
161  ac_i = db.getInt("asset_class_i");
162  ac_j = db.getInt("asset_class_j");
163  covar[ac_i][ac_j] = db.getFloat("covar");
164  assetClass_covar[INDEX(ac_i,ac_j)] = assetClass_covar[INDEX(ac_j,ac_i)] = db.getFloat("covar");
165  }
166  }
167 }
168 
172 void market::save_covar(int person, char person_type)
173 {
174  int ac_i, ac_j;
175  string s;
176  s = "DELETE FROM " + oConfig.tbl_prefix + "_covar_person WHERE person = " + to_string(person) + " AND person_type = 'i';";
177  if (db.runSQL(s)) {} else {}//{error_message = error_message + "<li>Please contact us. #errno E018</li>";}
178  s = "INSERT INTO " + oConfig.tbl_prefix + "_covar_person (asset_class_i, asset_class_j, covar, person, person_type) VALUES ";
179  for(ac_j = 1; ac_j <= NBR_ASSET_CLASSES; ac_j++)
180  {
181  for(ac_i=1; ac_i <= NBR_ASSET_CLASSES; ac_i++)
182  {
183  if ((ac_i > 1) || (ac_j > 1)) s = s + ", ";
184  s = s + "(" + to_string(ac_i) + ", " + to_string(ac_j) + ", " + to_string(covar[ac_i][ac_j]) + ", "
185  + to_string(person) + ", \"i\")";
186  }
187  }
188  s = s + ";";
189  //error_message = error_message + "<br>" + s;
190  if (db.runSQL(s)) {}
191  else
192  {
193  error_message = error_message + "<li>Please contact us. #errno E018</li>";
194  }
195 }
196 
197 
198 
199 
205 /*void market::set_mu(int person)
206 {
207  int nbr = 0;
208  db.res = db.stmt->executeQuery("SELECT * FROM " + oConfig.tbl_prefix + "_asset_classes;");
209  while (db.res->next())
210  {
211  nbr = atoi(db.res->getString("asset_class_id").c_str());
212  this->assetClass_mu[nbr] = atof(db.res->getString("E_R").c_str());
213  //assetClass_mu[nbr] = pow((assetClass_mu[nbr] + 1), 0.0833333) - 1;
214  this->assetClass_name[nbr] = db.res->getString("asset_class_name");
215  }
216 }*/
222 /*void market::set_covar(int person)
223 {
224  float sigma_ij = 0;
225  int i, j;
226  db.res = db.stmt->executeQuery("SELECT * FROM " + oConfig.tbl_prefix + "_covar;");
227  while (db.res->next())
228  {
229  i = atoi(db.res->getString("asset_class_i").c_str());
230  j = atoi(db.res->getString("asset_class_j").c_str());
231  sigma_ij = atof(db.res->getString("covar").c_str());
232  this->assetClass_covar[INDEX(i,j)] = sigma_ij;
233  this->assetClass_covar[INDEX(j,i)] = sigma_ij;
234  }
235  //TODO : check if the matrix is positive definite and if the determinant is > 0
236 }
237 */
238 
247 void market::reload_ER(int person, char person_type)
248 {
249  string s;
250 
251  //cout << "<BR>PERSON:" << person;
252  if (person != 0 )
253  {
254  s = "DELETE FROM " + oConfig.tbl_prefix + "_ER_person WHERE person = " + to_string(person) + " AND person_type = '" + string(1,person_type) + "';";
255  try
256  {
257  db.res = db.stmt->executeQuery(s);
258  }
259  catch (sql::SQLException &e)
260  {
261 #ifdef DEBUG
262  cout << endl;
263  cout << endl << "SQL STATEMENT: " << s << endl;
264  cout << "# ERR: SQLException in " << __FILE__;
265  cout << "(" << __FUNCTION__ << ") on line " << __LINE__ << endl;
266  cout << "# ERR: " << e.what();
267  cout << " (MySQL error code: " << e.getErrorCode();
268  cout << ", SQLState: " << e.getSQLState() << " )" << endl;
269 #endif
270  }
271  }
272 }
273 
281 void market::reload_covar(int person, char what2do, char person_type)
282 {
283  std::map<int, std::map<int, float> > default_covar;
284  int ac_i, ac_j;
285  //1. load the standard covariances into covar[i][j]
286  load_covar(0);
287 
288  //2. save the devalut values in default_covar
289  for (ac_i = 1; ac_i <= NBR_ASSET_CLASSES; ac_i++)
290  {
291  for (ac_j = 1; ac_j <= NBR_ASSET_CLASSES; ac_j++) default_covar[ac_i][ac_j] = covar[ac_i][ac_j];
292  }
293 
294  //3. load the user covar
295  load_covar(person, person_type);
296 
297  //4. change the user-volatilities and or covar to default
298  for (ac_i = 1; ac_i <= NBR_ASSET_CLASSES; ac_i++)
299  {
300  for (ac_j = 1; ac_j <= NBR_ASSET_CLASSES; ac_j++)
301  {
302  switch (what2do)
303  {
304  case 'b' :
305  covar[ac_i][ac_j] = default_covar[ac_i][ac_j];
306  break;
307  case 'v' :
308  covar[ac_i][ac_j] = covar[ac_i][ac_j] / sqrt (covar[ac_i][ac_i] * covar[ac_j][ac_j]) * sqrt (default_covar[ac_i][ac_i] * default_covar[ac_j][ac_j]);
309  break;
310  case 'c' :
311  if (ac_i != ac_j) covar[ac_i][ac_j] = default_covar[ac_i][ac_j] / sqrt (default_covar[ac_i][ac_i] * default_covar[ac_j][ac_j]) * sqrt (covar[ac_i][ac_i] * covar[ac_j][ac_j]);
312  break;
313  default :
314  {}
315  }
316  }
317  }
318 
319  //5. save the user covar matrix
320  save_covar(person, person_type);
321 
322 }
void load_covar(int person, char person_type= 'i')
void reload_ER(int person, char person_type= 'i')
TODO: the ER and assetClass_mu as well as the covar and assetClass_covar are redundant ==> eliminate ...
market(int person=0)
void reload_covar(int person, char what2do, char person_type= 'i')
sql::ResultSet * res
int getInt(string s)
float getFloat(string s)
sql::Statement * stmt
void save_ER(int person=0, char person_type= 'i')
#define NBR_ASSET_CLASSES
the nunmber of asset classes (not dynamically updated!)
Definition: efp.cpp:97
string error_message
global message variables
Definition: efp.cpp:132
float * assetClass_covar
const string tbl_prefix
tables start with "" + oConfig.tbl_prefix + "_" if the prefix is eg. "tbl" then we have "tbl_invesotr...
bool runSQL(string s)
db_helper db
Definition: efp.cpp:183
void load_ER(int person=0, char person_type= 'i')
float assetClass_mu[(NBR_ASSET_CLASSES+1)]
note: index 0 not used
std::map< int, std::map< int, float > > covar
std::map< int, string > assetClass_name
note: index 0 not used
std::map< int, float > ER
#define INDEX(x, y)
this macro allows to address int cell = array[INDEX(2,3)]; in stead of array[2+NBR_ASSET_CLASSES*3]; ...
Definition: efp.cpp:100
void save_covar(int person, char person_type= 'i')
config oConfig
mysql connection mysql connector from dev.mysql.com
Definition: efp.cpp:149