def __init__(self, meigaras=[]): self.meigaras = meigaras ts = f.get_json_data("ts_default") self.init_amount = ts["init_amount"] self.one_cycle_period = ts["one_cycle_period"] self.division = ts["division"] self.max_trade_amount_rate = ts["max_trade_amount_rate"] self.min_points = ts["min_points"] self.min_field_cnt = ts["min_field_cnt"] self.startd = ts["startd"] self.endd = ts["endd"] self.prgnames = ts["prgnames"] self.stocks = {} self.traders = {} self.relative_date_idx = 0 self.tm = TraderMemory(meigaras, self.startd, self.endd) self.account = Account(self.tm) self._get_lms()
class Simulator(object): account = None one_cycle_period = 0 division = 0 max_trade_amount_rate = 0 min_points = 0 min_field_cnt = 0 startd = "" endd = "" traders = {} prgnames = [] lms = [] tm = None relative_date_idx = 0 meigaras = [] def __init__(self, meigaras=[]): self.meigaras = meigaras ts = f.get_json_data("ts_default") self.init_amount = ts["init_amount"] self.one_cycle_period = ts["one_cycle_period"] self.division = ts["division"] self.max_trade_amount_rate = ts["max_trade_amount_rate"] self.min_points = ts["min_points"] self.min_field_cnt = ts["min_field_cnt"] self.startd = ts["startd"] self.endd = ts["endd"] self.prgnames = ts["prgnames"] self.stocks = {} self.traders = {} self.relative_date_idx = 0 self.tm = TraderMemory(meigaras, self.startd, self.endd) self.account = Account(self.tm) self._get_lms() def _get_lms(self): tbl.create_table("learned_memory") tbl.truncate_table("learned_memory") for prg in self.prgnames: pf_table = "pf_%s" % prg tp_table = "tp_%s" % prg self.lms.append(LearnedMemory(prg, "ts_default", "BUY")) def simulate(self): datelist = dtf.get_datestr(self.startd, self.endd) self.relative_date_idx = 0 for d in datelist: self._set_date(d) self.sell() trader = self.choose(self.meigaras, self.traders.keys()) self.buy(trader) self.relative_date_idx += 1 if self.relative_date_idx == self.one_cycle_period and self.one_cycle_period > 0: self.relative_date_idx = 0 eval_price = self.account.get_eval_price() init_amount = self.account.get_init_amount() #self._sell_all() f.log("Final evaluate amount is " + str(eval_price)) f.log("Finished simulation.") def sell(self): for code in self.traders.keys(): buyprice = self.account.get_buy_price(code) datestr = self.account.get_date() trader = self.traders[code] (sell_sign, desc) = trader.check_sell_sign(datestr, buyprice) if sell_sign: self.account.sell(code, 0, 0, desc) del self.traders[code] def _sell_all(self): self.account.sell_all() def choose(self, meigaras=[], ex_meigaras=[], choose_strictly=True): for lm in self.lms: lm.ins_top_meigaras(dtf.datestrsub(self._get_date(), 1), meigaras, ex_meigaras, choose_strictly) return self._lm2trader() def _lm2trader(self): meigaras = self.traders.keys() if len(meigaras) >= self.division: f.log("Already holds %d stocks." % len(meigaras)) for i in range(0, self.division): if len(meigaras) == 0: wherestr = "" else: wherestr = "where %s" % (kf.where_code_in(meigaras, True)) strsql = "select name, code, fieldid, geneid, points, holding_days, trade_mode \ from trade.learned_memory %s order by points desc limit 100;" % (wherestr) data = sql.exec_selsql(strsql) if len(data) == 0: f.log("No good meigaras to get this day.") break for row in data: i = iter(row) name = next(i) code = next(i) fieldid = next(i) geneid = next(i) points = next(i) holding_days = int(next(i)) trade_mode = next(i) if self.traders.has_key(code) == False: return Trader(code, geneid, self.tm, trade_mode, holding_days, "name=%s, fieldid=%s, geneid=%s, points=%s, holding_days=%s, trade_mode=%s" \ % (name, fieldid, geneid, str(points), str(holding_days), trade_mode)) #code, geneid, trader_memory, trade_mode, expected_trade_period, desc="" def buy(self, trader): holding_days = trader.get_max_holding_period() if self.one_cycle_period > 0 and self.relative_date_idx + holding_days > self.one_cycle_period: return code = trader.get_code() unit_price = self._get_price(code, self.account.get_date()) if unit_price <= 0: return cnt = self._get_buy_cnt(code, unit_price) if cnt == 0: return desc = trader.get_desc() self.account.buy(code, unit_price, cnt, desc) self.traders[code] = trader def _get_buy_cnt(self, code, unit_price): balance = self.account.get_balance() if unit_price > balance: return 0 max_buy_price = self.init_amount / self.division if max_buy_price < unit_price: return 0 if max_buy_price > balance: return balance / unit_price return max_buy_price / unit_price def _get_price(self, code, datestr): try: dateidx = self.tm.dates[code][datestr] return self.tm.prices[code][dateidx] except KeyError: return -1 def _get_date(self): return self.account.get_date() def _set_date(self, datestr): self.account.set_date(datestr)