Esempio n. 1
0
 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()
Esempio n. 2
0
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)