def get_stock_list(self): sm = StockManager.instance() return [ stk.market_code.lower() for stk in sm if stk.type in (constant.STOCKTYPE_A, constant.STOCKTYPE_INDEX, constant.STOCKTYPE_GEM) and stk.valid and stk.market.lower() == self.market.lower() ]
def PositionList_to_np(pos_list): """转化为numpy结构数组""" t_type = np.dtype({ 'names': [ '证券代码', '证券名称', '买入日期', '已持仓天数', '持仓数量', '投入金额', '当前市值', '盈亏金额', '盈亏比例' ], 'formats': ['U10', 'U20', 'datetime64[D]', 'i', 'i', 'd', 'd', 'd', 'd'] }) sm = StockManager.instance() query = Query(-1) data = [] for pos in pos_list: invest = pos.buyMoney - pos.sellMoney + pos.totalCost k = pos.stock.getKData(query) cur_val = k[0].closePrice * pos.number bonus = cur_val - invest date_list = sm.getTradingCalendar( QueryByDate(Datetime(pos.takeDatetime.date()))) data.append( (pos.stock.market_code, pos.stock.name, pos.takeDatetime, len(date_list), pos.number, invest, cur_val, bonus, 100 * bonus / invest)) return np.array(data, dtype=t_type)
def run(use_proxy, source): config_file = os.path.expanduser('~') + '/.hikyuu/hikyuu.ini' if not os.path.exists(config_file): print("未找到配置文件,请先运行 HikyuuTDX 进行配置与数据导入") exit(1) hikyuu_init(config_file, ignore_preload=True) print("采集程序运行中,可使用 Ctrl-C 终止!") sm = StockManager.instance() stk_list = [ stk.market_code.lower() for stk in sm if stk.valid and stk.type in (constant.STOCKTYPE_A, constant.STOCKTYPE_INDEX, constant.STOCKTYPE_GEM) ] def batch_func(records): buf = create_fb_spot(records) pub_sock.send(bytes(buf)) address = "ipc:///tmp/hikyuu_real_pub.ipc" pub_sock = pynng.Pub0() pub_sock.listen(address) try: while True: records = get_spot_parallel(stk_list, source, use_proxy, batch_func) print(len(records)) #pub_sock.send(date.encode()) time.sleep(3) except KeyboardInterrupt: exit(1)
def PositionList_to_np(pos_list): """转化为numpy结构数组""" t_type = np.dtype({'names':['证券代码', '证券名称', '买入日期', '已持仓天数', '持仓数量', '投入金额', '当前市值', '盈亏金额', '盈亏比例'], 'formats':['U10','U20', 'datetime64[D]', 'i', 'i', 'd', 'd', 'd', 'd']}) sm = StockManager.instance() query = Query(-1) data = [] for pos in pos_list: invest = pos.buyMoney - pos.sellMoney + pos.totalCost k = pos.stock.getKData(query) cur_val = k[0].closePrice * pos.number bonus = cur_val - invest date_list = sm.getTradingCalendar(QueryByDate(Datetime(pos.takeDatetime.date()))) data.append((pos.stock.market_code, pos.stock.name, pos.takeDatetime, len(date_list), pos.number, invest, cur_val, bonus, 100 * bonus / invest)) return np.array(data, dtype=t_type)
def draw2( block, query=Query(-130), ama1=AMA(n=10, fast_n=2, slow_n=30), ama2=None, n=10, filter_n=20, filter_p=0.1, sg_type='CROSS', show_high_low=True, arrow_style=1 ): """绘制佩里.J.考夫曼(Perry J.Kaufman) 自适应移动平均系统(AMA)""" sm = StockManager.instance() if block.name == 'SZ': kdata = sm['sz000001'].get_kdata(query) elif block.name == 'GEM': kdata = sm['sz399006'].get_kdata(query) else: kdata = sm['sh000001'].get_kdata(query) ax1, ax2, ax3 = create_figure(3) kdata.plot(axes=ax1) cama = AMA(CLOSE(kdata), n=n) cama.name = "CAMA" cama.plot(axes=ax1, color='b', legend_on=True) hama = AMA(HIGH(kdata), n=n) hama.name = "HAMA" hstd = STDEV(hama, n) lama = AMA(LOW(kdata), n=n) lama.name = "LAMA" lstd = STDEV(lama, n) fy1 = list(lama - lstd)[lstd.discard:] fy2 = list(hama + hstd)[hstd.discard:] ax1.fill_between(range(lstd.discard, len(kdata)), fy1, fy2, alpha=0.2, color='y') if show_high_low: hama.plot(axes=ax1, color='r', legend_on=True) lama.plot(axes=ax1, color='g', legend_on=True) if sg_type == 'CROSS': fast_op = AMA(n=n) slow_op = EMA(n=2 * n)(fast_op) sg = SG_Cross(fast_op, slow_op) sg.plot(axes=ax1, kdata=kdata) ind = slow_op(KDATA(kdata)) ind.name = "EMA(CAMA)" ind.plot(axes=ax1, color='m', legend_on=True) elif sg_type == 'SINGLE': sg = SG_Single(cama, filter_n=filter_n, filter_p=filter_p) sg.plot(axes=ax1, kdata=kdata) else: print("sg_type only in ('CORSS', 'SINGLE')") a = POS(block, query, SG_Flex(AMA(n=3), 6)) a.name = "POS(3)" a.plot(axes=ax2, color='b', marker='.', legend_on=True) a = POS(block, query, SG_Flex(AMA(n=30), 60)) a.name = "POS(30)" a.plot(axes=ax2, color='g', marker='.', legend_on=True) c = CLOSE(kdata) CVAL(c, 0.8).plot(axes=ax2, color='r', linestyle='--') CVAL(c, 0.2).plot(axes=ax2, color='r', linestyle='--') if ama1.name == "AMA": cer = PRICELIST(cama, 1) label = "ER(%s)" % cer[-1] cer.plot(axes=ax3, color='b', marker='.', label=label, legend_on=False, text_on=True) CVAL(c, 0.8).plot(axes=ax3, color='r', linestyle='--') CVAL(c, -0.6).plot(axes=ax3, color='r', linestyle='--') CVAL(c, -0.8).plot(axes=ax3, color='r', linestyle='--') CVAL(c, 0).plot(axes=ax3, color='k', linestyle='-') else: ax_draw_macd(ax2, kdata) #ax2.set_ylim(-1, 1) ax1.set_xlim((0, len(kdata))) ax_set_locator_formatter(ax1, kdata.get_datetime_list(), query.ktype) adjust_axes_show([ax1, ax2]) return show_gcf()
def run(use_proxy, source, seconds, phase1, phase2, ignore_weekend): phase1_delta = parse_phase(phase1) hku_error_if(phase1_delta is None or len(phase1_delta) != 2, "无效参数 phase1: {}".format(phase1), callback=lambda: exit(1)) hku_error_if(phase1_delta[0] > phase1_delta[1], "无效参数 phase1: {}, 结束时间应大于等于起始时间".format(phase1), callback=lambda: exit(1)) phase2_delta = parse_phase(phase2) hku_error_if(phase2_delta is None or len(phase2_delta) != 2, "无效参数 phase2: {}".format(phase2), callback=lambda: exit(1)) hku_error_if(phase2_delta[0] > phase2_delta[1], "无效参数 phase2: {}, 结束时间应大于等于起始时间".format(phase2), callback=lambda: exit(1)) hku_error_if( phase1_delta[1] > phase2_delta[0], "无效参数 phase1: {}, phase2: {}, phase2 起始时间应大于等于 phase1 结束时间".format( phase1, phase2), callback=lambda: exit(1)) hku_logger.info("采集时间段1:{}".format(phase1)) hku_logger.info("采集时间段2:{}".format(phase2)) config_file = os.path.expanduser('~') + '/.hikyuu/hikyuu.ini' if not os.path.exists(config_file): print("未找到配置文件,请先运行 HikyuuTDX 进行配置与数据导入") exit(1) hikyuu_init(config_file, ignore_preload=True) print("采集程序运行中,可使用 Ctrl-C 终止!") sm = StockManager.instance() stk_list = [ stk.market_code.lower() for stk in sm if stk.valid and stk.type in (constant.STOCKTYPE_A, constant.STOCKTYPE_INDEX, constant.STOCKTYPE_GEM) ] spot_topic = ':spot:' def batch_func(records): spot = bytearray(spot_topic.encode('utf-8')) buf = create_fb_spot(records) spot.extend(buf) pub_sock.send(bytes(spot)) address = "ipc:///tmp/hikyuu_real_pub.ipc" pub_sock = pynng.Pub0() pub_sock.listen(address) today = Datetime.today() phase1_time = [today + x for x in phase1_delta] phase2_time = [today + x for x in phase2_delta] start_time = Datetime.now() if not (phase1_time[0] <= start_time <= phase1_time[1] or phase2_time[0] <= start_time <= phase2_time[1]): delta = next_delta(start_time, seconds, phase1_delta, phase2_delta, ignore_weekend) next_time = start_time + delta hku_info("启动采集时间:{}".format(next_time)) time.sleep(delta.total_seconds()) while True: try: start_time = Datetime.now() pub_sock.send("{}{}".format(spot_topic, '[start spot]').encode('utf-8')) records = get_spot_parallel(stk_list, source, use_proxy, batch_func) hku_info("{}:{}:{} 采集数量: {}".format(start_time.hour, start_time.minute, start_time.second, len(records))) pub_sock.send('{}{}'.format(spot_topic, '[end spot]').encode('utf-8')) delta = next_delta(start_time, seconds, phase1_delta, phase2_delta, ignore_weekend) time.sleep(delta.total_seconds()) except Exception as e: hku_error(e) time.sleep(10)
def draw2(block, query = Query(-130), ama1 = AMA(n=10, fast_n=2, slow_n=30), ama2 = None, n = 10, filter_n = 20, filter_p = 0.1, sg_type = 'CROSS', show_high_low = True, arrow_style = 1): """绘制佩里.J.考夫曼(Perry J.Kaufman) 自适应移动平均系统(AMA)""" sm = StockManager.instance() if block.name == 'SZ': kdata = sm['sz000001'].getKData(query) elif block.name == 'GEM': kdata = sm['sz399006'].getKData(query) else: kdata = sm['sh000001'].getKData(query) ax1, ax2, ax3 = create_figure(3) kdata.plot(axes = ax1) cama = AMA(CLOSE(kdata), n = n ) cama.name = "CAMA" cama.plot(axes = ax1, color = 'b', legend_on = True) hama = AMA(HIGH(kdata), n = n) hama.name = "HAMA" hstd = STDEV(hama, n) lama = AMA(LOW(kdata), n = n) lama.name = "LAMA" lstd = STDEV(lama, n) fy1 = list(lama - lstd)[lstd.discard:] fy2 = list(hama + hstd)[hstd.discard:] ax1.fill_between(range(lstd.discard,len(kdata)),fy1,fy2,alpha=0.2, color='y' ) if show_high_low: hama.plot(axes = ax1, color = 'r', legend_on = True) lama.plot(axes = ax1, color = 'g', legend_on = True) if sg_type == 'CROSS': fast_op = AMA(n = n) slow_op = EMA(n = 2*n)(fast_op) sg = SG_Cross(fast_op, slow_op) sg.plot(axes = ax1, kdata = kdata) ind = slow_op(KDATA(kdata)) ind.name = "EMA(CAMA)" ind.plot(axes = ax1, color = 'm', legend_on = True) elif sg_type == 'SINGLE': sg = SG_Single(cama, filter_n = filter_n, filter_p = filter_p) sg.plot(axes = ax1, kdata = kdata) else: print("sg_type only in ('CORSS', 'SINGLE')") a = POS(block, query, SG_Flex(AMA(n = 3), 6)) a.name = "POS(3)" a.plot(axes=ax2, color='b', marker='.', legend_on=True) a = POS(block, query, SG_Flex(AMA(n = 30), 60)) a.name = "POS(30)" a.plot(axes=ax2, color='g', marker='.', legend_on=True) c = CLOSE(kdata) CVAL(c, 0.8).plot(axes=ax2,color='r',linestyle='--') CVAL(c, 0.2).plot(axes=ax2,color='r',linestyle='--') if ama1.name == "AMA": cer = PRICELIST(cama, 1) label = "ER(%s)" % cer[-1] cer.plot(axes=ax3, color='b', marker='.', label=label, legend_on=False, text_on=True) CVAL(c, 0.8).plot(axes=ax3,color='r',linestyle='--') CVAL(c, -0.6).plot(axes=ax3,color='r',linestyle='--') CVAL(c, -0.8).plot(axes=ax3,color='r',linestyle='--') CVAL(c, 0).plot(axes=ax3,color='k',linestyle='-') else: ax_draw_macd(ax2, kdata) #ax2.set_ylim(-1, 1) ax1.set_xlim((0, len(kdata))) ax_set_locator_formatter(ax1, kdata.getDatetimeList(), query.kType) adjust_axes_show([ax1, ax2]) return show_gcf()
def on_bar(self, ktype): print("on bar {}".format(ktype)) print("{}".format(len(StockManager.instance()))) sm = StockManager.instance() for s in sm: print(s)