コード例 #1
0
    def prepare_data(self):
        # 获取所有的股票列表
        stock_list = get_stock_list(self.db_config, 1, self.location)
        self.datamap['stock_list'] = stock_list
        #print len(self.datamap['stock_list'])

        code2id_map = dict()
        id2scode_map = dict()
        for sid, stock_info in stock_list.items():
            scode = get_scode(stock_info['code'], int(stock_info['ecode']),
                              int(stock_info['location']))
            code2id_map[stock_info['code']] = sid
            id2scode_map[sid] = scode

        self.datamap['code2id'] = code2id_map
        self.datamap['id2scode'] = id2scode_map
        #print len(self.datamap['id2scode'])

        last_open_day = get_past_openday(str(self.day), 1)
        #print last_open_day
        cont_list = []
        try:
            db_conn = SqlUtil.get_db(self.db_config)
            sql = "select sid from t_stock_cont where day = " + last_open_day + " and status = 'Y'"
            #print sql
            record_list = db_conn.query_sql(sql)
        except Exception as e:
            print e
            return

        for stock_data in record_list:
            cont_list.append(int(stock_data['sid']))
        self.datamap['cont_list'] = cont_list
        #print len(self.datamap['cont_list'])

        threshold_list = []
        try:
            db_conn = SqlUtil.get_db(self.db_config)
            sql = "select sid from t_stock_price_threshold where day = " + last_open_day + " and (high_type = 1 or high_type = 2 or low_type = 1 or low_type = 2) and status = 'Y'"
            price_record_list = db_conn.query_sql(sql)
        except Exception as e:
            print e
            return

        for stock_data in price_record_list:
            threshold_list.append(int(stock_data['sid']))
        self.datamap['threshold_list'] = threshold_list
        #print len(self.datamap['threshold_list'])

        self.datamap['pool_list'] = list(set(cont_list + threshold_list))
        #print self.datamap['pool_list']
        return
コード例 #2
0
ファイル: offline_handler.py プロジェクト: NashLea/stockcat
    def core(self, location, day, param_sid):
        stock_df = pd.read_sql_query(
            "select * from t_stock where location = " + str(location) +
            " and type = 1 and status = 'Y'",
            self.conn,
            index_col='id')
        #print stock_df.index, stock_df.columns
        sid_list = [param_sid] if param_sid > 0 else stock_df.index

        for sid in sid_list:
            dyn_info = self.update_dyn(day, sid)
            if dyn_info is None:
                print format_log("stock_paused", {
                    'sid': sid,
                    'location': location,
                    'day': day
                })
                continue

            sql = SqlUtil.create_insert_sql("t_stock_dyn", dyn_info)
            try:
                db_conn = SqlUtil.get_db(self.db_config)
                db_conn.query_sql(sql, True)
            except Exception as e:
                print "err=insert_dyn sid=" + str(sid) + " day=" + str(
                    day) + " ex=" + str(e)
                continue

            print format_log("add_stock_dyn", dyn_info)
        print format_log("finish_dyn", {'location': location, 'day': day})
コード例 #3
0
ファイル: stock_analyzer.py プロジェクト: foxbupt/stockcat
    def __init__(self, sid, config_info):
        self.sid = sid
        self.config_info = config_info
        self.helper = AnalyzerHelper(self.config_info)

        self.db_config = config_info['DB']
        self.db_conn = SqlUtil.get_db(config_info['DB'])
コード例 #4
0
    def __init__(self, sid, config_info):
        self.sid = sid
        self.config_info = config_info
        self.helper = AnalyzerHelper(self.config_info)

        self.db_config = config_info['DB']
        self.db_conn = SqlUtil.get_db(config_info['DB'])
コード例 #5
0
def get_past_data(db_config, redis_config, cur_day, count):
    key = "pastdata-" + str(cur_day)
    stock_datamap = dict()
    redis_conn = redis.StrictRedis(redis_config['host'], redis_config['port'])

    datamap = redis_conn.hgetall(key)
    if datamap:
        return datamap

    db_conn = SqlUtil.get_db(db_config)
    start_day = get_past_openday(cur_day, count)

    try:
        sql = "select sid, avg(volume) as avg_volume, sum(vary_price) as sum_vary_price, sum(vary_portion) as sum_vary_portion from t_stock_data \
        where day >= " + start_day + " and day < " + cur_day + " group by sid"
        print sql
        record_list = db_conn.query_sql(sql)
    except Exception as e:
        print e
        return None

    for record in record_list:
        item = dict()
        sid = record['sid']

        item['sid'] = int(sid)
        item['avg_volume'] = round(float(record['avg_volume']))
        item['sum_vary_price'] = float(record['sum_vary_price'])
        item['sum_vary_portion'] = float(record['sum_vary_portion'])
        stock_datamap[sid] = json.dumps(item)
    #print stock_datamap

    redis_conn.hmset(key, stock_datamap)
    redis_conn.expire(key, 86400)
    return stock_datamap
コード例 #6
0
    def get_cont_list(self, sid, past_day, day):
    	sql = "select sid, day, start_day, cont_days, current_price, sum_price_vary_amount, sum_price_vary_portion, max_volume_vary_portion \
    			from t_stock_cont where sid = {sid} and start_day >= {past_day} and day <= {day} and status = 'Y'".format(sid=sid, past_day=past_day, day=day)
    	print sql

    	try:
		    db_conn = SqlUtil.get_db(self.db_config)
		    record_list = db_conn.query_sql(sql)
		except Exception as e:
		    print e
		    return None

		return record_list

	# 获取指定股票对应日期范围内的价格突破
	def get_threshold_list(self, sid, past_day, day):
		sql = "select sid, day, price, low_type, high_type from t_stock_price_threshold where \
			sid = {sid} and day >= {past_day} and day <= {day} and status = 'Y'".format(sid=sid, past_day=past_day, day=day)
		print sql

		try:
			db_conn = SqlUtil.get_db(self.db_config)
			record_list = db_conn.query_sql(sql)
		except Exception as e:
			print e
			return None

		return record_list
コード例 #7
0
ファイル: base_policy.py プロジェクト: foxbupt/stockcat
    def __init__(self, config_info, datamap):
        self.config_info = config_info
        self.datamap = datamap

        self.redis_conn = redis.StrictRedis(self.config_info['REDIS']['host'], int(self.config_info['REDIS']['port']))
        self.db_conn = SqlUtil.get_db(self.config_info["DB"])
        self.logger = logging.getLogger("policy")
コード例 #8
0
ファイル: stock_util.py プロジェクト: NashLea/stockcat
def add_stock_pool(db_config, redis_config, sid, day, source, trend_info = dict()):
    sql = "select id, sid, day, source from t_stock_pool where sid = {sid} and day = {day} and status = 'Y'".format(sid=sid, day=day)
    
    try:
        db_conn = SqlUtil.get_db(db_config)
        record_list = db_conn.query_sql(sql)

        if len(record_list) > 0:
            record_id = record_list[0]['id']
            new_source = int(record_list[0]['source']) | source
            oper_sql = "update t_stock_pool set source = {source} where id = {id}".format(source=new_source, id=record_id)
        else:
            fields = {'sid': sid, 'day': day, 'source': source, 'status': 'Y'}
            fields['create_time'] = time.mktime( datetime.datetime.now().timetuple() )
            if trend_info:
                fields.update(trend_info)

            # 获取当日行情数据
            hqdata = get_hqdata(db_config, redis_config, sid, day)
            if hqdata:
                fields['close_price'] = hqdata['daily']['close_price']
                if 'policy' in hqdata and hqdata['policy']:
                    fields['volume_ratio'] = round(float(hqdata['policy']['volume_ratio']), 2)
                    fields['rise_factor'] = round(float(hqdata['policy']['rise_factor']), 2)
            #print fields

            oper_sql = SqlUtil.create_insert_sql("t_stock_pool", fields)

        db_conn.query_sql(oper_sql, True)
    except Exception as e:
        print e
        return False

    return True
コード例 #9
0
ファイル: realtime_analyzer.py プロジェクト: foxbupt/stockcat
def get_past_data(db_config, redis_config, cur_day, count):
    key = "pastdata-" + str(cur_day)
    stock_datamap = dict()
    redis_conn = redis.StrictRedis(redis_config['host'], redis_config['port'])

    datamap = redis_conn.hgetall(key)
    if datamap:
        return datamap

    db_conn = SqlUtil.get_db(db_config)
    start_day = get_past_openday(cur_day, count)

    try:
        sql = "select sid, avg(volume) as avg_volume, sum(vary_price) as sum_vary_price, sum(vary_portion) as sum_vary_portion from t_stock_data \
        where day >= " + start_day + " and day < " + cur_day + " group by sid"
        print sql
        record_list = db_conn.query_sql(sql)
    except Exception as e:
        print e
        return None
    
    for record in record_list:
        item = dict()
        sid = record['sid']

        item['sid'] = int(sid)
        item['avg_volume'] = round(float(record['avg_volume']))
        item['sum_vary_price'] = float(record['sum_vary_price'])
        item['sum_vary_portion'] = float(record['sum_vary_portion'])
        stock_datamap[sid] = json.dumps(item)
    #print stock_datamap

    redis_conn.hmset(key, stock_datamap)
    redis_conn.expire(key, 86400)
    return stock_datamap
コード例 #10
0
    def __init__(self, config_info, datamap):
        self.config_info = config_info
        self.datamap = datamap

        self.redis_conn = redis.StrictRedis(self.config_info['REDIS']['host'], int(self.config_info['REDIS']['port']))
        self.db_conn = SqlUtil.get_db(self.config_info["DB"])
        self.logger = logging.getLogger("policy")
コード例 #11
0
    def __init__(self, config_info):
        self.config_info = config_info
        self.db_config = config_info['DB']
        self.redis_config = config_info['REDIS']

        self.redis_conn = redis.StrictRedis(self.config_info['REDIS']['host'], int(self.config_info['REDIS']['port']))
        self.db_conn = SqlUtil.get_db(self.config_info["DB"])
        self.logger = logging.getLogger("ranker")
コード例 #12
0
ファイル: policy_util.py プロジェクト: minhpascal/stockcat
    def get_policy_itemlist(db_config, pid):
        sql = "select id, name, vid, optor, param, value, pid, parent_id, node_type, logic from t_policy_item where pid = {pid} and status = 'Y'".format(pid = pid)
        print sql

        try:
            db_conn = SqlUtil.get_db(db_config)
            record_list = db_conn.query_sql(sql)
        except Exception as e:
            print e
            return None

        return record_list
コード例 #13
0
	def get_threshold_list(self, sid, past_day, day):
		sql = "select sid, day, price, low_type, high_type from t_stock_price_threshold where \
			sid = {sid} and day >= {past_day} and day <= {day} and status = 'Y'".format(sid=sid, past_day=past_day, day=day)
		print sql

		try:
			db_conn = SqlUtil.get_db(self.db_config)
			record_list = db_conn.query_sql(sql)
		except Exception as e:
			print e
			return None

		return record_list
コード例 #14
0
ファイル: stock_util.py プロジェクト: NashLea/stockcat
def get_stock_trendlist(db_config, sid, start_day, end_day):
    sql = "select sid, type, start_day, end_day, count, high_day, high, low_day, low, start_value, end_value, vary_portion, trend, shave \
            from t_stock_trend where status = 'Y' and sid = {sid} and ((start_day >= {start_day} and start_day <= {end_day}) \
            or (end_day >= {start_day} and end_day <= {end_day})) order by start_day asc".format(sid=sid, start_day=start_day, end_day=end_day)
    print sql

    try:
        db_conn = SqlUtil.get_db(db_config)
        record_list = db_conn.query_sql(sql)
    except Exception as e:
        print e
        return None

    return record_list
コード例 #15
0
ファイル: stock_util.py プロジェクト: NashLea/stockcat
def get_stock_info(db_config, sid):
    sql = "select id, code, name, type, pinyin, ecode, location, alias, company, business, capital, out_capital, profit, assets, dividend, hist_high, hist_low, year_high, year_low, month6_high, \
            month6_low, month3_high, month3_low from t_stock where status = 'Y' and id = " + str(sid)
    try:
        db_conn = SqlUtil.get_db(db_config)
        record_list = db_conn.query_sql(sql)
    except Exception as e:
        print e
        return None

    stock_info = dict()
    if len(record_list) > 0:
        stock_info = record_list[0]
    return stock_info
コード例 #16
0
ファイル: policy_util.py プロジェクト: minhpascal/stockcat
    def get_policy_info(db_config, pid):
        sql = "select id, type, name, remark, uid, root_item from t_policy where id={pid} and status = 'Y'".format(pid=pid)
        print sql

        try:
            db_conn = SqlUtil.get_db(db_config)
            record_list = db_conn.query_sql(sql)
        except Exception as e:
            print e
            return None

        if len(record_list) < 1:
            return None

        return record_list[0]
コード例 #17
0
ファイル: scheduler.py プロジェクト: NashLea/stockcat
    def prepare_data(self, market_config):
        # 获取所有的股票列表
        stock_list = get_stock_list(self.db_config, 0, self.location)
        self.datamap['stock_list'] = stock_list
        #print len(self.datamap['stock_list'])

        code2id_map = dict()
        id2scode_map = dict()
        for sid, stock_info in stock_list.items():
            scode = get_scode(stock_info['code'], int(stock_info['ecode']), int(stock_info['location']))
            code2id_map[stock_info['code']] = sid
            id2scode_map[sid] = scode

        self.datamap['code2id'] = code2id_map
        self.datamap['id2scode'] = id2scode_map
        #print len(self.datamap['id2scode'])

        # 美股取过去一周的股票池
        past_days = 5 if self.location == 3 else 1
        last_open_day = get_past_openday(str(self.day), past_days)
        print last_open_day
        pool_list = []
        try:
            db_conn = SqlUtil.get_db(self.db_config)
            sql = "select sid from t_stock_pool where day >= " + last_open_day + " and status = 'Y'"
            print sql
            record_list = db_conn.query_sql(sql)
        except Exception as e:
            print e
            return

        for stock_data in record_list:
            sid = int(stock_data['sid'])
            if sid in stock_list and sid not in pool_list:
                pool_list.append(sid)
        
        if 3 == self.location and 'cnlist' in market_config:
            cnlist = market_config['cnlist']
            for cn_code in cnlist:
                if cn_code in code2id_map:
                    sid = code2id_map[cn_code]
                    if sid not in pool_list:
                        pool_list.append(sid)
                    
        self.datamap['pool_list'] = pool_list
        logging.getLogger("fetch").info("op=scheduler_pool day=%d last_open_day=%s location=%d total_count=%d pool_count=%d", self.day, last_open_day, self.location, len(stock_list), len(pool_list))
    
        return
コード例 #18
0
ファイル: stock_util.py プロジェクト: foxbupt/stockcat
def add_stock_price_threshold(db_config, sid, day, price, high_type, low_type):
    info = {'sid': sid, 'day': day, 'price': price, 'status': 'Y'}
    info['create_time'] = time.mktime( datetime.datetime.now().timetuple() )
    info['high_type'] = high_type
    info['low_type'] = low_type
    
    sql = SqlUtil.create_insert_sql("t_stock_price_threshold", info)
    print sql
    try:
        db_conn = SqlUtil.get_db(db_config)
        db_conn.query_sql(sql, True)
    except Exception as e:
        print e
        return False
  
    return True
コード例 #19
0
ファイル: stock_util.py プロジェクト: NashLea/stockcat
def get_stock_price_threshold(db_config, sid, start_day, end_day, high_type, low_type):
    sql = "select sid, day, price, low_type, high_type from t_stock_price_threshold where status = 'Y' and sid = {sid} and day >= {start_day} and day <= {end_day}"\
            .format(sid=sid, start_day=start_day, end_day=end_day)
    if high_type > 0:
        sql = sql + " and high_type = " + str(high_type)
    if low_type > 0:
        sql = sql + " and low_type = " + str(low_type)

    try:
        db_conn = SqlUtil.get_db(db_config)
        record_list = db_conn.query_sql(sql)
    except Exception as e:
        print e
        return None

    return record_list
コード例 #20
0
ファイル: stock_util.py プロジェクト: minhpascal/stockcat
def add_stock_price_threshold(db_config, sid, day, price, high_type, low_type):
    info = {'sid': sid, 'day': day, 'price': price, 'status': 'Y'}
    info['create_time'] = time.mktime(datetime.datetime.now().timetuple())
    info['high_type'] = high_type
    info['low_type'] = low_type

    sql = SqlUtil.create_insert_sql("t_stock_price_threshold", info)
    print sql
    try:
        db_conn = SqlUtil.get_db(db_config)
        db_conn.query_sql(sql, True)
    except Exception as e:
        print e
        return False

    return True
コード例 #21
0
ファイル: policy_util.py プロジェクト: minhpascal/stockcat
    def get_varlist(db_config, vid = 0):
        sql = "select id, code, name, type, expression, add_time from t_policy_var where status = 'Y'"
        #print sql

        try:
            db_conn = SqlUtil.get_db(db_config)
            record_list = db_conn.query_sql(sql)
        except Exception as e:
            print e
            return None

        var_list = dict()
        for record in record_list:
            var_list[int(record['id'])] = record

        if vid > 0:
            return var_list[vid] if vid in var_list else None

        return var_list
コード例 #22
0
ファイル: stock_util.py プロジェクト: minhpascal/stockcat
def get_cont_stock(db_config, current_day, day_count, sum_portion, rise=True):
    start_day = get_past_openday(current_day, day_count)
    operator = ">" if rise else "<"

    sql = "select sid from t_stock_data where day >= {start_day} and day <= {current_day} and vary_portion {operator} 0 \
        group by sid having count(*) >= {day_count} and sum(vary_portion) >= {low_portion} and sum(vary_portion) <= {high_portion}"\
        .format(start_day=start_day, current_day=current_day, operator=operator, day_count=day_count, \
                low_portion=sum_portion[0], high_portion=sum_portion[1])
    print sql

    record_list = []

    try:
        db_conn = SqlUtil.get_db(db_config)
        record_list = db_conn.query_sql(sql)
    except Exception as e:
        print e
        return None

    return [item['sid'] for item in record_list]
コード例 #23
0
ファイル: stock_util.py プロジェクト: foxbupt/stockcat
def get_cont_stock(db_config, current_day, day_count, sum_portion, rise = True):
    start_day = get_past_openday(current_day, day_count)
    operator = ">" if rise else "<"

    sql = "select sid from t_stock_data where day >= {start_day} and day <= {current_day} and vary_portion {operator} 0 \
        group by sid having count(*) >= {day_count} and sum(vary_portion) >= {low_portion} and sum(vary_portion) <= {high_portion}"\
        .format(start_day=start_day, current_day=current_day, operator=operator, day_count=day_count, \
                low_portion=sum_portion[0], high_portion=sum_portion[1])
    print sql

    record_list = []

    try:
        db_conn = SqlUtil.get_db(db_config)
        record_list = db_conn.query_sql(sql)
    except Exception as e:
        print e
        return None

    return [item['sid'] for item in record_list]
コード例 #24
0
ファイル: stock_util.py プロジェクト: NashLea/stockcat
def get_stock_list(db_config, type = 0, location = 1):
    sql = "select id, code, name, type, pinyin, ecode, location, alias, company, business, capital, out_capital, profit, assets, dividend, hist_high, hist_low, year_high, year_low, month6_high, \
            month6_low, month3_high, month3_low from t_stock where status = 'Y' "
    if type > 0:
        sql = sql + " and type = " + str(type)
    if location > 0:
        sql = sql + " and location = " + str(location)

    try:
        db_conn = SqlUtil.get_db(db_config)
        record_list = db_conn.query_sql(sql)
    except Exception as e:
        print e
        return None

    stock_list = dict()
    for stock_info in record_list:
        stock_list[int(stock_info['id'])] = stock_info

    return stock_list
コード例 #25
0
ファイル: stock_util.py プロジェクト: minhpascal/stockcat
def get_stock_data(db_config, day, sid=0):
    if sid == 0:
        sql = "select sid, day, open_price, high_price, low_price, close_price, volume, amount, \
            vary_price, vary_portion from t_stock_data where day = {day} and status = 'Y'".format(
            day=day)
    else:
        sql = "select sid, day, open_price, high_price, low_price, close_price, volume, amount, \
            vary_price, vary_portion from t_stock_data where day = {day} and sid = {sid} and status = 'Y'".format(
            day=day, sid=sid)
    try:
        db_conn = SqlUtil.get_db(db_config)
        record_list = db_conn.query_sql(sql)
    except Exception as e:
        print e
        return None

    data = dict()
    for stock_data in record_list:
        data[int(stock_data['sid'])] = stock_data

    return data if 0 == sid else data[sid]
コード例 #26
0
ファイル: offline_handler.py プロジェクト: foxbupt/stockcat
    def core(self, location, day, param_sid):
        stock_df = pd.read_sql_query("select * from t_stock where location = " + str(location) + " and type = 1 and status = 'Y'", self.conn, index_col='id')
        #print stock_df.index, stock_df.columns
        sid_list = [param_sid] if param_sid > 0 else stock_df.index

        for sid in sid_list:
            dyn_info = self.update_dyn(day, sid)
            if dyn_info is None:
                print format_log("stock_paused", {'sid': sid, 'location': location, 'day': day})
                continue

            sql = SqlUtil.create_insert_sql("t_stock_dyn", dyn_info)
            try:
                db_conn = SqlUtil.get_db(self.db_config)
                db_conn.query_sql(sql, True)
            except Exception as e:
                print "err=insert_dyn sid=" + str(sid) + " day=" + str(day) + " ex=" + str(e)
                continue

            print format_log("add_stock_dyn", dyn_info)
        print format_log("finish_dyn", {'location': location, 'day': day})
コード例 #27
0
ファイル: stock_util.py プロジェクト: NashLea/stockcat
def get_past_data(db_config, redis_config, cur_day, count, location=1):
    key = "pastdata-" + str(cur_day)
    stock_datamap = dict()
    redis_conn = redis.StrictRedis(redis_config['host'], redis_config['port'])

    datamap = redis_conn.hgetall(key)
    # 从redis中取出来的key都是string
    if datamap:
        return datamap

    db_conn = SqlUtil.get_db(db_config)
    start_day = get_past_openday(str(cur_day), count, location)

    try:
        sql = "select sid, avg(volume) as avg_volume, sum(vary_price) as sum_vary_price, sum(vary_portion) as sum_vary_portion, \
        avg(close_price) as avg_close_price, max(high_price) as high_price, min(low_price) as low_price from t_stock_data \
        where day >= " + str(start_day) + " and day < " + str(cur_day) + " group by sid"
        #print sql
        record_list = db_conn.query_sql(sql)
    except Exception as e:
        print e
        return None
    
    for record in record_list:
        item = dict()
        sid = record['sid']

        item['sid'] = int(sid)
        item['avg_volume'] = round(float(record['avg_volume']))
        item['sum_vary_price'] = float(record['sum_vary_price'])
        item['sum_vary_portion'] = float(record['sum_vary_portion'])
        item['avg_close_price'] = float(record['avg_close_price'])
        item['high_price'] = float(record['high_price'])
        item['low_price'] = float(record['low_price'])

        stock_datamap[sid] = json.dumps(item)
    #print stock_datamap

    redis_conn.hmset(key, stock_datamap)
    return stock_datamap
コード例 #28
0
ファイル: chance_return.py プロジェクト: foxbupt/stockcat
def chance_return(config_info, location, day, item):    
    hqdata = get_hqdata(config_info['DB'], config_info['REDIS'], day, item['sid'])
    print hqdata['daily']
    
    chance_item = item['chance']
    trend_item = item['trend_item']    
    # 卖出时用平仓价格减卖出价格, 需要乘-1
    factor = 1 if 1 == chance_item['op'] else -1
    
    # 严格一点, 应该用time之后的high_price/low_price计算收益和回撤, 买入点以较大价格进入, 卖出以较低价格卖出    
    enter_price = chance_item['price_range'][1] if 1 == chance_item['op'] else chance_item['price_range'][0]
    exit_price = float(hqdata['daily']['close_price'])
    fall_price = float(hqdata['daily']['low_price'])  if 1 == chance_item['op'] else float(hqdata['daily']['high_price'])

    rise_portion = factor * (exit_price - enter_price) / enter_price * 100
    fall_portion = factor * (fall_price - enter_price) / enter_price * 100   
    
    return_info = {"sid": item['sid'], "code": item['code'], "time": item['time'], "op": chance_item['op'], "trend_length": trend_item['length'], "trend_portion": trend_item['vary_portion'], 
            "enter": enter_price, "exit": exit_price, "fall": fall_price, "close_portion": rise_portion, "fall_portion": fall_portion, "vary_portion": hqdata['daily']['vary_portion']}

    # TODO: 输出 dyn数据
    record_list = []
    try:
        sql = "select * from t_stock_dyn where sid = {sid} and day < {day} order by day desc limit 1".format(sid=item['sid'], day=day)
        #print sql
        db_conn = SqlUtil.get_db(config_info['DB'])
        record_list = db_conn.query_sql(sql)
    except Exception as e:
        print e
        logging.getLogger("chance").error("err=get_stock_dyn sid=%d code=%s location=%d day=%d", item['sid'], item['code'], location, day)
    else:
        #print record_list
        if len(record_list) == 1:
            stock_dyn = record_list[0]
            for key in ['ma5_swing', 'ma20_swing', 'ma5_vary_portion', 'ma20_vary_portion', 'ma5_exchange_portion', 'ma20_exchange_portion', 'volume_ratio']:
                return_info[key] = stock_dyn[key]

    logging.getLogger("chance").info("%s", format_log("chance_item", item))
    return return_info
コード例 #29
0
ファイル: stock_util.py プロジェクト: foxbupt/stockcat
def get_stock_data(db_config, day, sid=0):
    if sid == 0:
        sql = "select sid, day, open_price, high_price, low_price, close_price, volume, amount, \
            vary_price, vary_portion from t_stock_data where day = {day} and status = 'Y'".format(day=day)
    else:
        if isinstance(sid, int):
            sql = "select sid, day, open_price, high_price, low_price, close_price, volume, amount, \
            vary_price, vary_portion from t_stock_data where day = {day} and sid = {sid} and status = 'Y'".format(day=day, sid=sid)
        elif isinstance(sid, list):
            sql = "select sid, day, open_price, high_price, low_price, close_price, volume, amount, \
            vary_price, vary_portion from t_stock_data where day = {day} and sid in ({sid_list}) and status = 'Y'".format(day=day, sid=",".join(sid))
    try:
        db_conn = SqlUtil.get_db(db_config)
        record_list = db_conn.query_sql(sql)
    except Exception as e:
        print e
        return None

    data = dict()
    for stock_data in record_list:
        data[int(stock_data['sid'])] = stock_data

    return data if 0 == sid else data[sid]
コード例 #30
0
ファイル: daily_refresh.py プロジェクト: minhpascal/stockcat
def refresh_stock_histdata(redis_config, db_config, stock_list, today_data_list, day, location = 1, refresh = True):
    db_conn = SqlUtil.get_db(db_config)
    high_field_list = ["hist_high", "year_high", "month6_high", "month3_high"]
    low_field_list = ["hist_low", "year_low", "month6_low", "month3_low"]
    vary_stock_list = dict()

    for sid, stock_info in stock_list.items():
        # 忽略指数
        if sid not in today_data_list or int(stock_info['type']) == 2:
            continue

        #print stock_info
        stock_data = today_data_list[sid]
        #print stock_data
        high_index = 4
        low_index = 4

        close_price = float(stock_data['close_price'])
        out_capital = close_price * float(stock_info['out_capital']);
        capital_limit = 10
        if 3 == location:
            out_capital = out_capital / 10000
            capital_limit = 15
        # capital < 10/15(us)
        if out_capital <= capital_limit:
            continue

        for index, field_name in enumerate(high_field_list):
            if close_price > float(stock_info[field_name]):
                high_index = index
                break

        for index, field_name in enumerate(low_field_list):
            if close_price < float(stock_info[field_name]):
                low_index = index
                break

        # 表明当天价格存在最高价或者最低价
        #print sid, high_index, low_index
        if high_index < 4 or low_index < 4:  
            vary_stock_list[sid] = {'high_index': high_index, 'low_index': low_index}
            sql = "update t_stock set "
            field_list = []
            high_type = low_type = 0

            # 起始日期定为之前3个交易日, 3个交易日内无同类型突破记录  
            range_start_day = get_past_openday(day, 3, location)

            if high_index < 4:
                high_type = high_index + 1

                high_threshold_list = get_stock_price_threshold(db_config, sid, range_start_day, day, high_type, 0)
                if 0 == len(high_threshold_list):
                    add_result = add_stock_price_threshold(db_config, sid, day, close_price, high_type, low_type)
                    print format_log("add_high_price_threshold", {'sid': sid, 'day': day, 'close_price': close_price, 'high_type': high_type, 'result':add_result})
                    if add_result and high_type <= 2: # 年内新高/历史最高才加入股票池
                        pool_result = add_stock_pool(db_config, redis_config, sid, day, 2, {'wave':1})    
                        print format_log("add_stock_pool", {'sid': sid, 'day': day, 'close_price': close_price, 'result':pool_result})

                for field_name in high_field_list[high_index:]:
                    stock_info[field_name] = close_price
                    field_list.append(field_name + "=" + str(stock_info[field_name]))

            if low_index < 4:
                low_type = low_index + 1

                low_threshold_list = get_stock_price_threshold(db_config, sid, range_start_day, day, 0, low_type)
                if 0 == len(low_threshold_list):
                    add_result = add_stock_price_threshold(db_config, sid, day, close_price, high_type, low_type)
                    print format_log("add_low_price_threshold", {'sid': sid, 'day': day, 'close_price': close_price, 'low_type': low_type, 'result':add_result})
                    # TODO: 把下跌突破也加入股票池                       

                for field_name in low_field_list[low_index:]:
                    stock_info[field_name] = close_price
                    field_list.append(field_name + "=" + str(stock_info[field_name]))
           
            sql = sql + ", ".join(field_list) + " where id=" + str(stock_info['id'])
            print sql

            # 股票且设置刷新, 才插入价格突破记录
            if refresh and int(stock_info['type']) == 1:
                try:
                    db_conn.query_sql(sql, True)
                except Exception as e:
                    continue
            
            log_info = {'sid': sid, 'code': stock_info['code'], 'name': stock_info['name'], 'day': day, 
                        'close_price': stock_data['close_price'], 'high_price': stock_data['high_price'], 'low_price': stock_data['low_price'], 
                       'high_index': high_index, 'low_index': low_index}

            print format_log("refresh_stock_info", log_info)

    #TODO: 统一删除变化的stock_info
    if refresh:
        conn = redis.StrictRedis(redis_config['host'], redis_config['port'])
        key_list = [ "stock:info-" + str(sid) for sid in vary_stock_list.keys() ]
        conn.delete(tuple(key_list))

    return vary_stock_list
コード例 #31
0
 def __init__(self, config_info):
     self.config_info = config_info
     self.db_conn = SqlUtil.get_db(config_info['DB'])
コード例 #32
0
ファイル: chance_return.py プロジェクト: NashLea/stockcat
def chance_return(config_info, location, day, item):
    hqdata = get_hqdata(config_info['DB'], config_info['REDIS'], day,
                        item['sid'])
    print hqdata['daily']

    chance_item = item['chance']
    trend_item = item['trend_item']
    # 卖出时用平仓价格减卖出价格, 需要乘-1
    factor = 1 if 1 == chance_item['op'] else -1

    # 严格一点, 应该用time之后的high_price/low_price计算收益和回撤, 买入点以较大价格进入, 卖出以较低价格卖出
    enter_price = chance_item['price_range'][1] if 1 == chance_item[
        'op'] else chance_item['price_range'][0]
    exit_price = float(hqdata['daily']['close_price'])
    fall_price = float(
        hqdata['daily']['low_price']) if 1 == chance_item['op'] else float(
            hqdata['daily']['high_price'])

    rise_portion = factor * (exit_price - enter_price) / enter_price * 100
    fall_portion = factor * (fall_price - enter_price) / enter_price * 100

    return_info = {
        "sid": item['sid'],
        "code": item['code'],
        "time": item['time'],
        "op": chance_item['op'],
        "trend_length": trend_item['length'],
        "trend_portion": trend_item['vary_portion'],
        "enter": enter_price,
        "exit": exit_price,
        "fall": fall_price,
        "close_portion": rise_portion,
        "fall_portion": fall_portion,
        "vary_portion": hqdata['daily']['vary_portion']
    }

    # TODO: 输出 dyn数据
    record_list = []
    try:
        sql = "select * from t_stock_dyn where sid = {sid} and day < {day} order by day desc limit 1".format(
            sid=item['sid'], day=day)
        #print sql
        db_conn = SqlUtil.get_db(config_info['DB'])
        record_list = db_conn.query_sql(sql)
    except Exception as e:
        print e
        logging.getLogger("chance").error(
            "err=get_stock_dyn sid=%d code=%s location=%d day=%d", item['sid'],
            item['code'], location, day)
    else:
        #print record_list
        if len(record_list) == 1:
            stock_dyn = record_list[0]
            for key in [
                    'ma5_swing', 'ma20_swing', 'ma5_vary_portion',
                    'ma20_vary_portion', 'ma5_exchange_portion',
                    'ma20_exchange_portion', 'volume_ratio'
            ]:
                return_info[key] = stock_dyn[key]

    logging.getLogger("chance").info("%s", format_log("chance_item", item))
    return return_info
コード例 #33
0
ファイル: analyze_helper.py プロジェクト: foxbupt/stockcat
 def __init__(self, config_info):
     self.config_info = config_info
     self.db_conn = SqlUtil.get_db(config_info['DB'])