コード例 #1
0
ファイル: Chart.py プロジェクト: ajmal017/earnmi
    def showCompare(self, bars: [], code: str):
        from earnmi.data.MarketImpl import MarketImpl
        market = MarketImpl()
        market.addNotice(code)
        today: datetime = bars[-1].datetime
        market.setToday(today + timedelta(days=1))
        start: datetime = bars[0].datetime
        baseBars = market.getHistory().getKbarFrom(
            code, datetime(start.year, start.month, start.day))

        #baseBar = mainBar
        ### 初始化columns
        columns = ['Open', 'High', 'Low', 'Close', "Volume", "Close2"]
        data = []
        index = []
        bars1 = baseBars
        bars2 = bars
        size1 = len(bars1)
        size2 = len(bars2)
        rate = bars1[0].close_price / bars2[0].close_price
        bar_pre_2 = bars2[0]
        i2 = 0
        for i1 in range(size1):
            bar1 = bars1[i1]
            index.append(bar1.datetime)
            list = [
                bar1.open_price, bar1.high_price, bar1.low_price,
                bar1.close_price, bar1.volume
            ]

            if i2 < size2:
                bar2 = bars2[i2]
                if utils.is_same_day(bar1.datetime, bar2.datetime):
                    list.append(bar2.close_price * rate)
                    bar_pre_2 = bar2
                    i2 = i2 + 1
                else:
                    ##bar2缺少今天数据。
                    list.append(bar_pre_2.close_price * rate)
                ##保证i2要大于大
                while (i2 < size2):
                    bar2 = bars2[i2]
                    days = (bar2.datetime - bar1.datetime).days
                    if days > 0:
                        break
                    i2 = i2 + 1
            else:
                list.append(bar_pre_2.close_price * rate)
            data.append(list)

        trades = pd.DataFrame(data, index=index, columns=columns)
        apds = []
        apds.append(mpf.make_addplot(trades['Close'], color='gray'))
        apds.append(mpf.make_addplot(trades['Close2'], color='r'))
        mpf.plot(trades, type='line', figscale=1.3, addplot=apds)
        pass
コード例 #2
0
ファイル: MarketTest.py プロジェクト: ajmal017/earnmi
def historyTest():
    market2 = MarketImpl()
    market2.setToday(datetime.now())

    #获取沪市数据
    code = "600000"
    market2.addNotice(code)
    bars = market2.getHistory().getKbars(code, 20)
    assert len(bars) == 20

    ##获取指数数据
    codes = ['000300']
    for code in codes:
        market2.addNotice(code)
        assert len(market2.getHistory().getKbars(code, 20)) == 20

    code = "300004"

    market2.addNotice(code)

    todayListBar = market2.getHistory().getKbars(code, 50)

    pre_bares = None
    for todayBar in todayListBar:
        today = datetime(year=todayBar.datetime.year,
                         month=todayBar.datetime.month,
                         day=todayBar.datetime.day,
                         minute=1)
        market2.setToday(today)
        bars1 = market2.getHistory().getKbars(code, 100)

        ##最后一个bar不应该包含今天:
        assert not utils.is_same_day(bars1[-1].datetime, today)

        assert len(bars1) == 100
        pre_bar = None
        for bar in bars1:
            assert bar.datetime < today
            if pre_bar:
                assert pre_bar.datetime < bar.datetime
            pre_bar = bar

        bars2 = market2.getHistory().getKbarFrom(code, bars1[0].datetime)
        for index in range(len(bars1)):
            assert bars1[index].datetime == bars2[index].datetime

        #昨天的bar数据
        if pre_bares:
            for index in range(len(pre_bares) - 1):
                assert pre_bares[index + 1].datetime == bars1[index].datetime

        pre_bares = bars1

    pass
コード例 #3
0
    def on_market_prepare_close(self, protfolio: Portfolio):
        """
            市场准备关市.
        """
        time = self.market.getToday()
        assert time.hour == 14 and time.minute == 57

        # 最开始datetime(2019, 2, 26, 10, 28)买入100股,由于A股T+1的限制,是不可以当天卖的
        if (utils.is_same_day(datetime(2019, 2, 26, 10, 28), time)):
            assert protfolio.sell("601318", 67.00, 100) == False

        pass
コード例 #4
0
    def on_trade(self, trade: TradeData):
        print(f"{self.market.getToday()}:on_trade: {trade}")
        # 中国平安601318 在datetime(2019, 2, 26, 10, 28)时刻,最低到达 low_price=67.15,到达买入价
        # 中国平安601318 在datetime(2019, 2, 27, 9, 48)时刻,最高到达 high_price=68.57,到达卖出价
        # 中国平安601318 在datetime(2019, 3, 25, 13, 10)时刻,从最高价71到一个新底69.75, 后面再到一个新的高点。7.38左右
        # 中国平安601318 在datetime(2019, 2, 28)时刻,9点40分左右到最低点66.8,10:47最高到达68.08,然后14:00后面出现新的第二低点67.2-67.4

        is_buy = trade.direction == Direction.LONG and trade.offset == Offset.OPEN
        is_sell = trade.direction == Direction.SHORT and trade.offset == Offset.CLOSE
        is_short = trade.direction == Direction.SHORT and trade.offset == Offset.OPEN
        is_cover = trade.direction == Direction.LONG and trade.offset == Offset.CLOSE

        if (utils.is_same_time(datetime(2019, 2, 26, 10, 28),
                               self.market.getToday(),
                               deltaSecond=30)):
            if is_buy:
                self.buy_at_2019_2_26_10_28 = self.buy_at_2019_2_26_10_28 + 1
                assert utils.isEqualFloat(67.15, trade.price,
                                          0.5)  #成交价格在67.15中间

        if (utils.is_same_day(datetime(2019, 2, 28), self.market.getToday())):
            if is_cover:
                assert self.cover_at_2019_2_28_14_more == False
                self.cover_at_2019_2_28_14_more = True
                assert utils.isEqualFloat(67.3, trade.price,
                                          0.5)  #成交价格在67.15中间

        if (utils.is_same_time(self.market.getToday(),
                               datetime(2019, 2, 27, 9, 48),
                               deltaMinitue=1,
                               deltaSecond=2)):
            if is_sell:
                self.sell_at_2019_2_27_9_48 = True
                assert utils.isEqualFloat(68.57, trade.price,
                                          0.5)  # 成交价格在68.57中间
            if is_short:
                self.short_at_2019_2_27_9_48 = True
                assert utils.isEqualFloat(68.57, trade.price,
                                          0.5)  # 成交价格在68.57中间

        # 中国平安601318
        # 2019-03-25 10:35:00:open = 71.03,close=70.96 一天最高点
        # 2019-03-25 13:12:00:open = 69.97,close=69.79  下午开盘的一个低点
        # 2019-03-25 13:47:00:open = 70.33,close=70.41   下午的一个高点
        if (utils.is_same_time(self.market.getToday(),
                               datetime(2019, 3, 25, 13, 47),
                               deltaMinitue=4,
                               deltaSecond=2)):
            if is_sell:
                self.sell_at_2019_3_25_13_47 = True
                assert utils.isEqualFloat(70.36, trade.price,
                                          0.5)  # 成交价格在68.57中间
コード例 #5
0
ファイル: KBarPool.py プロジェクト: ajmal017/earnmi
 def getData(self, end: datetime, count: int) -> Sequence["BarData"]:
     #是否满足从缓存里面取
     __pool_data = self.setPoolAt(end, count)
     ret = []
     addingCount = 0
     pool_size = len(__pool_data)
     for i in range(pool_size):
         index = pool_size - i - 1
         data = __pool_data[index]
         if addingCount == 0:
             if data.datetime < end and not utils.is_same_day(
                     data.datetime, end):
                 ret.insert(0, data)
                 addingCount = 1
         else:
             ret.insert(0, data)
             addingCount = addingCount + 1
         if (addingCount >= count):
             break
     return ret
コード例 #6
0
    def on_market_close(self, protfolio: Portfolio):
        """
            市场关市.
        """
        time = self.market.getToday()
        assert time.hour == 15 and time.minute == 0

        assert self.on_bar_per_minute_count > 200

        self.final_valid_capital = protfolio.getValidCapital()

        # 中国平安601318 在datetime(2019, 2, 26, 10, 28)时刻,最低到达 low_price=67.15
        if utils.is_same_day(datetime(2019, 2, 26), self.market.getToday()):
            #当天已经买入121*100股,持有仓位资金不为0
            assert protfolio.getTotalHoldCapital() > 810700
            position = protfolio.getLongPosition("601318")
            assert position.is_long == True
            assert position.pos_total == 121 * 100
            assert position.getPosAvailable() == 0  # 因为今天才交易,可用仓位为0
        pass
コード例 #7
0
def printTop5(patternList=[]):
    end = utils.to_end_date(datetime.now() - timedelta(days=1))  ##昨天数据集
    start = end - timedelta(days=60)

    #sw = SWImpl()
    generateTrainData = Generate_Feature_KPattern_skip1_predit2(
        kPatters=patternList)

    code = sw.getSW2List()[0]
    bars = sw.getSW2Daily(code, start, end)
    yestoday = bars[-1].datetime
    yestoday2 = bars[-2].datetime

    class TopData(object):
        kCode = 0
        predict: PredictData = None
        code = ""
        name = ""

    sw.collect(start, end, generateTrainData)
    yestoday_top = []
    yestoday2_top = []

    print(f"count:{len(generateTrainData.predictTraceDatas)},上个交易日:{yestoday}")
    for ___traceData in generateTrainData.predictTraceDatas:
        traceData: Skip1_Predict2_TraceData = ___traceData

        topData = TopData()
        topData.code = traceData.code
        topData.name = sw.getSw2Name(topData.code)

        if len(traceData.predictBars) > 0:
            yestoday2_top.append(topData)
            assert utils.is_same_day(traceData.predictBars[-1].datetime,
                                     yestoday)
        else:
            yestoday_top.append(topData)
        kPattern = traceData.kPatternValue
        filleName = f"models/predict_sw_top_k_{kPattern}.m"
        model = PredictModel()
        model.loadFromFile(filleName)

        feature = generateTrainData.generateData([traceData])

        predict = model.predict(feature)[0]
        topData.kCode = kPattern
        topData.predict = predict
        occurBar = traceData.occurBar
        close_price = occurBar.close_price
        topData.start_price = close_price
        #topData.sell_price = close_price * (1 + predict.percent / 100.0)
        #topData.buy_price = close_price * (1 + predict.buy.percent / 100.0)

    def compareTopBar(d1: TopData, d2: TopData):
        if d1.predict.level != d2.predict.level:
            return d1.predict.level - d2.predict.level
        delta = d1.predict.percent - d2.predict.percent
        if delta != 0:
            return delta
        if d1.predict.probability < d2.predict.probability:
            return -1
        else:
            return 1

    yestoday_top = sorted(yestoday_top,
                          key=cmp_to_key(compareTopBar),
                          reverse=True)
    yestoday2_top = sorted(yestoday2_top,
                           key=cmp_to_key(compareTopBar),
                           reverse=True)

    def printTopData(topData, isDouble=False):
        if topData is None:
            return
        pct = topData.predict.percent - topData.predict.buy.percent
        double_info = ""
        if isDouble:
            double_info = "****************"
        print(f"[code:{topData.code},name:{topData.name},kCode:{topData.kCode}"
              f",[sell:%.2f%%,buy:%.2f%%,pct=%.2f%%]] {double_info}" %
              (topData.predict.percent, topData.predict.buy.percent, pct))

    print(f"昨天top数据")
    for topData in yestoday_top:
        yestory_data = None
        for topData2 in yestoday2_top:
            if topData.code == topData2.code:
                yestory_data = topData2
                break

        printTopData(topData)
        printTopData(yestory_data, True)
        print(f"       {topData.predict.getLogInfo()}")

    print(f"前天top数据")
    for topData in yestoday2_top:
        printTopData(topData)
        print(f"       {topData.predict.getLogInfo()}")