Ejemplo n.º 1
0
 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()
     ]
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
 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)
Ejemplo n.º 5
0
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()
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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()
    
Ejemplo n.º 8
0
 def on_bar(self, ktype):
     print("on bar {}".format(ktype))
     print("{}".format(len(StockManager.instance())))
     sm = StockManager.instance()
     for s in sm:
         print(s)