Exemplo n.º 1
0
    def __init__(
            self,
            infoobj,
            start,
            col,
            buy,
            sell=None,
            buylow=True,
            end=yesterdaydash(),
            totmoney=100000,
    ):
        self.pos = 0
        self.col = col
        self.buylow = buylow
        self.selllevel = 0
        bdivision = sum([it[1] for it in buy])
        self.buy = []
        for item in buy:
            self.buy.append((item[0], item[1] / bdivision))

        if sell is not None:
            self.sell = []
            sdivision = sum([it[1] for it in sell])
            for item in sell:
                self.sell.append((item[0], item[1] / sdivision))
        else:
            self.sell = sell

        super().__init__(infoobj, start, end, totmoney)
Exemplo n.º 2
0
    def v_positions_history(self, end=yesterdaydash(), rendered=True):
        """
        river chart visulization of positions ratio history
        use text size to avoid legend overlap in some sense, eg. legend_text_size=8
        """
        start = self.totcftable.iloc[0].date
        times = pd.date_range(start, end)
        tdata = []
        for date in times:
            sdata = sorted(
                [(
                    date,
                    fob.briefdailyreport(date).get("currentvalue", 0),
                    fob.name,
                ) for fob in self.fundtradeobj],
                key=lambda x: x[1],
                reverse=True,
            )
            tdata.extend(sdata)

        tr = ThemeRiver()
        tr.add(
            series_name=[foj.name for foj in self.fundtradeobj],
            data=tdata,
            label_opts=opts.LabelOpts(is_show=False),
            singleaxis_opts=opts.SingleAxisOpts(type_="time",
                                                pos_bottom="10%"),
        )
        if rendered:
            return tr.render_notebook()
        else:
            return tr
Exemplo n.º 3
0
 def __init__(
         self,
         infoobj,
         buypercent,
         sellpercent,
         start,
         end=yesterdaydash(),
         totmoney=100000,
 ):
     assert len(buypercent) == len(sellpercent)
     self.division = len(buypercent)
     self.pos = 0
     self.zero = (infoobj.price[
         infoobj.price["date"] >= start].iloc[0].loc["netvalue"])
     buypts = [self.zero]
     sellpts = []
     for term in buypercent:
         buypts.append(buypts[-1] * (1 - term / 100.0))
     for i, term in enumerate(sellpercent):
         sellpts.append(buypts[i + 1] * (1 + term / 100.0))
     self.buypts = buypts[1:]
     self.sellpts = sellpts
     self.buypercent = buypercent
     self.sellpercent = sellpercent
     super().__init__(infoobj, start, end, totmoney)
Exemplo n.º 4
0
    def _basic_init(self):
        self._page = rget(self._url)
        if self._page.text[:800].find("Data_fundSharesPositions") >= 0:
            raise FundTypeError(
                "This code seems to be a fund, use fundinfo instead")

        l = eval(
            re.match(r".*Data_millionCopiesIncome = ([^;]*);.*",
                     self._page.text).groups()[0])
        self.name = re.match(r".*fS_name = \"([^;]*)\";.*",
                             self._page.text).groups()[0]
        tz_bj = dt.timezone(dt.timedelta(hours=8))
        datel = [
            dt.datetime.fromtimestamp(int(d[0]) / 1e3,
                                      tz=tz_bj).replace(tzinfo=None) for d in l
        ]
        ratel = [float(d[1]) for d in l]
        netvalue = [1]
        for dailyrate in ratel:
            netvalue.append(netvalue[-1] * (1 + dailyrate * 1e-4))
        netvalue.remove(1)

        df = pd.DataFrame(
            data={
                "date": datel,
                "netvalue": netvalue,
                "totvalue": netvalue,
                "comment": [0 for _ in datel],
            })
        df = df[df["date"].isin(opendate)]
        df = df.reset_index(drop=True)
        self.price = df[df["date"] <= yesterdaydash()]
Exemplo n.º 5
0
 def __init__(self, infoobj, start, end=yesterdaydash(), totmoney=100000):
     self.aim = infoobj
     self.totmoney = totmoney
     self.price = infoobj.price[(infoobj.price["date"] >= start)
                                & (infoobj.price["date"] <= end)]
     if len(self.price) == 0:
         self.start = convert_date(start)
         self.end = convert_date(end)
         self.status = pd.DataFrame(data={"date": [], self.aim.code: []})
     else:
         self.start = self.price.iloc[0].date
         self.end = self.price.iloc[-1].date
         datel = []
         actionl = []
         times = pd.date_range(self.start, self.end)
         for date in times:
             action = self.status_gen(date)
             if action > 0:
                 datel.append(date)
                 actionl.append(action)
             elif action < 0:
                 datel.append(date)
                 actionl.append(action * 0.005)
         df = pd.DataFrame(data={"date": datel, self.aim.code: actionl})
         self.status = df
Exemplo n.º 6
0
    def _basic_init(self):
        self._page = rget(self._url)
        if self._page.status_code == 404:
            raise ParserFailure(
                "Unrecognized fund, please check fund code you input.")
        if self._page.text[:800].find("Data_millionCopiesIncome") >= 0:
            raise FundTypeError(
                "This code seems to be a mfund, use mfundinfo instead")

        l = re.match(r"[\s\S]*Data_netWorthTrend = ([^;]*);[\s\S]*",
                     self._page.text).groups()[0]
        l = l.replace("null", "None")  # 暂未发现基金净值有 null 的基金,若有,其他地方也很可能出问题!
        l = eval(l)
        ltot = re.match(r"[\s\S]*Data_ACWorthTrend = ([^;]*);[\s\S]*",
                        self._page.text).groups()[0]  # .* doesn't match \n
        ltot = ltot.replace("null", "None")  ## 096001 总值数据中有 null!
        ltot = eval(ltot)
        ## timestamp transform tzinfo must be taken into consideration
        tz_bj = dt.timezone(dt.timedelta(hours=8))
        infodict = {
            "date": [
                dt.datetime.fromtimestamp(int(d["x"]) / 1e3,
                                          tz=tz_bj).replace(tzinfo=None)
                for d in l
            ],
            "netvalue": [float(d["y"]) for d in l],
            "comment": [_nfloat(d["unitMoney"]) for d in l],
        }

        if len(l) == len(ltot):  # 防止总值和净值数据量不匹配,已知有该问题的基金:502010
            infodict["totvalue"] = [d[1] for d in ltot]

        try:
            rate = float(
                eval(
                    re.match(r"[\s\S]*fund_Rate=([^;]*);[\s\S]*",
                             self._page.text).groups()[0]))
        except ValueError:
            rate = 0
            logger.info(
                "warning: this fund has no data for rate")  # know cases: ETF

        name = eval(
            re.match(r"[\s\S]*fS_name = ([^;]*);[\s\S]*",
                     self._page.text).groups()[0])

        self.rate = rate
        # shengou rate in tiantianjijin, daeshengou rate discount is not considered
        self.name = name  # the name of the fund
        df = pd.DataFrame(data=infodict)
        df = df[df["date"].isin(opendate)]
        df = df.reset_index(drop=True)
        if len(df) == 0:
            raise ParserFailure("no price table found for this fund %s" %
                                self.code)
        self.price = df[df["date"] <= yesterdaydash()]
        # deal with the redemption fee attrs finally
        if not self.priceonly:
            self._feepreprocess()
Exemplo n.º 7
0
 def __init__(self,
              infoobj,
              col,
              start,
              end=yesterdaydash(),
              totmoney=100000):
     self.col = col
     self.pos = 0
     super().__init__(infoobj, start, end, totmoney)
Exemplo n.º 8
0
    def _basic_init(self):
        self._page = _download(self._url)
        if self._page.text[:800].find("Data_millionCopiesIncome") >= 0:
            raise FundTypeError(
                "This code seems to be a mfund, use mfundinfo instead")

        l = eval(
            re.match(r".*Data_netWorthTrend = ([^;]*);.*",
                     self._page.text).groups()[0])
        ltot = eval(
            re.match(r".*Data_ACWorthTrend = ([^;]*);.*",
                     self._page.text).groups()[0])
        ## timestamp transform tzinfo must be taken into consideration
        tz_bj = dt.timezone(dt.timedelta(hours=8))
        infodict = {
            "date": [
                dt.datetime.fromtimestamp(int(d["x"]) / 1e3,
                                          tz=tz_bj).replace(tzinfo=None)
                for d in l
            ],
            "netvalue": [float(d["y"]) for d in l],
            "comment": [_nfloat(d["unitMoney"]) for d in l],
        }

        if len(l) == len(ltot):  # 防止总值和净值数据量不匹配,已知有该问题的基金:502010
            infodict["totvalue"] = [d[1] for d in ltot]

        try:
            rate = float(
                eval(
                    re.match(r".*fund_Rate=([^;]*);.*",
                             self._page.text).groups()[0]))
        except ValueError:
            rate = 0
            if _do_print_warning:
                print("warning: this fund has no data for rate"
                      )  # know cases: 510030

        name = eval(
            re.match(r".*fS_name = ([^;]*);.*", self._page.text).groups()[0])

        self.rate = rate
        # shengou rate in tiantianjijin, daeshengou rate discount is not considered
        self.name = name  # the name of the fund
        df = pd.DataFrame(data=infodict)
        df = df[df["date"].isin(opendate)]
        df = df.reset_index(drop=True)
        self.price = df[df["date"] <= yesterdaydash()]
        # deal with the redemption fee attrs finally
        self._feepreprocess()
Exemplo n.º 9
0
 def v_positions_history(self, end=yesterdaydash(), **vkwds):
     '''
     river chart visulization of positions ratio history
     use text size to avoid legend overlap in some sense, eg. legend_text_size=8
     '''
     start = self.totcftable.iloc[0].date
     times = pd.date_range(start, end)
     tdata = []
     for date in times:
         sdata = sorted([(date, fob.briefdailyreport(date).get('currentvalue', 0), fob.aim.name)
                         for fob in self.fundtradeobj], key=lambda x: x[1], reverse=True)
         tdata.extend(sdata)
     tr = ThemeRiver()
     tr.add([foj.aim.name for foj in self.fundtradeobj], tdata, is_datazoom_show=True,
            is_label_show=False, legend_top="0%", legend_orient='horizontal', **vkwds)
     return tr
Exemplo n.º 10
0
    def _basic_init(self):
        self._page = _download(self._url)
        if self._page.text[:800].find("Data_fundSharesPositions") >= 0:
            raise FundTypeError("This code seems to be a fund, use fundinfo instead")

        parser = Parser()
        tree = parser.parse(self._page.text)
        nodenet = [
            node.children()[0].children()[1]
            for node in nodevisitor.visit(tree)
            if isinstance(node, ast.VarStatement)
            and node.children()[0].children()[0].value == "Data_millionCopiesIncome"
        ][0]
        name = [
            node.children()[0].children()[1]
            for node in nodevisitor.visit(tree)
            if isinstance(node, ast.VarStatement)
            and (node.children()[0].children()[0].value == "fS_name")
        ][0]
        self.name = name.value.strip('"')
        tz_bj = dt.timezone(dt.timedelta(hours=8))
        datel = [
            dt.datetime.fromtimestamp(
                int(nodenet.children()[i].children()[0].value) / 1e3, tz=tz_bj
            ).replace(tzinfo=None)
            for i in range(len(nodenet.children()))
        ]
        ratel = [
            float(nodenet.children()[i].children()[1].value)
            for i in range(len(nodenet.children()))
        ]
        netvalue = [1]
        for dailyrate in ratel:
            netvalue.append(netvalue[-1] * (1 + dailyrate * 1e-4))
        netvalue.remove(1)

        df = pd.DataFrame(
            data={
                "date": datel,
                "netvalue": netvalue,
                "totvalue": netvalue,
                "comment": [0 for _ in datel],
            }
        )
        df = df[df["date"].isin(opendate)]
        df = df.reset_index(drop=True)
        self.price = df[df["date"] <= yesterdaydash()]
Exemplo n.º 11
0
 def _basic_init(self):
     self.name = "货币基金"
     self.rate = 0
     datel = list(
         pd.date_range(dt.datetime.strftime(self.start, "%Y-%m-%d"), yesterdaydash())
     )
     valuel = []
     for i, date in enumerate(datel):
         valuel.append((1 + self.interest) ** i)
     dfdict = {
         "date": datel,
         "netvalue": valuel,
         "totvalue": valuel,
         "comment": [0 for _ in datel],
     }
     df = pd.DataFrame(data=dfdict)
     self.price = df[df["date"].isin(opendate)]
Exemplo n.º 12
0
 def _basic_init(self):
     self.name = "货币基金"
     self.rate = 0
     datel = list(
         pd.date_range(dt.datetime.strftime(self.start, '%Y-%m-%d'),
                       yesterdaydash()))
     valuel = []
     for i, date in enumerate(datel):
         valuel.append((1 + self.interest)**i)
     dfdict = {
         'date': datel,
         'netvalue': valuel,
         'totvalue': valuel,
         'comment': [0 for _ in datel]
     }
     df = pd.DataFrame(data=dfdict)
     self.price = df[df['date'].isin(opendate)]
Exemplo n.º 13
0
    def _basic_init(self):
        self._page = _download(self._url)
        parser = Parser()
        tree = parser.parse(self._page.text)
        nodenet = [
            node.children()[0].children()[1]
            for node in nodevisitor.visit(tree)
            if isinstance(node, ast.VarStatement) and node.children()
            [0].children()[0].value == 'Data_millionCopiesIncome'
        ][0]
        name = [
            node.children()[0].children()[1]
            for node in nodevisitor.visit(tree)
            if isinstance(node, ast.VarStatement) and (
                node.children()[0].children()[0].value == 'fS_name')
        ][0]
        self.name = name.value.strip('"')
        tz_bj = dt.timezone(dt.timedelta(hours=8))
        datel = [
            dt.datetime.fromtimestamp(
                int(nodenet.children()[i].children()[0].value) / 1e3,
                tz=tz_bj).replace(tzinfo=None)
            for i in range(len(nodenet.children()))
        ]
        ratel = [
            float(nodenet.children()[i].children()[1].value)
            for i in range(len(nodenet.children()))
        ]
        netvalue = [1]
        for dailyrate in ratel:
            netvalue.append(netvalue[-1] * (1 + dailyrate * 1e-4))
        netvalue.remove(1)

        df = pd.DataFrame(
            data={
                'date': datel,
                'netvalue': netvalue,
                'totvalue': netvalue,
                'comment': [0 for _ in datel]
            })
        df = df[df['date'].isin(opendate)]
        df = df.reset_index(drop=True)
        self.price = df[df['date'] <= yesterdaydash()]
Exemplo n.º 14
0
 def _basic_init(self):
     raw = _download(self._url)
     cr = csv.reader(raw.text.splitlines(), delimiter=",")
     my_list = list(cr)
     factor = float(my_list[-1][3])
     dd = {
         "date": [
             dt.datetime.strptime(my_list[i + 1][0], "%Y-%m-%d")
             for i in range(len(my_list) - 1)
         ],
         "netvalue": [
             float(my_list[i + 1][3]) / factor for i in range(len(my_list) - 1)
         ],
         "totvalue": [float(my_list[i + 1][3]) for i in range(len(my_list) - 1)],
         "comment": [0 for _ in range(len(my_list) - 1)],
     }
     index = pd.DataFrame(data=dd)
     index = index.iloc[::-1]
     index = index.reset_index(drop=True)
     self.price = index[index["date"].isin(opendate)]
     self.price = self.price[self.price["date"] <= yesterdaydash()]
     self.name = my_list[-1][2]
Exemplo n.º 15
0
    def _basic_init(self):
        self._page = _download(self._url)
        if self._page.text[:800].find("Data_millionCopiesIncome") >= 0:
            raise FundTypeError("This code seems to be a mfund, use mfundinfo instead")

        parser = Parser()  # parse the js text of API page using slimit module
        tree = parser.parse(self._page.text)
        nodenet = [
            node.children()[0].children()[1]
            for node in nodevisitor.visit(tree)
            if isinstance(node, ast.VarStatement)
            and node.children()[0].children()[0].value == "Data_netWorthTrend"
        ][0]
        nodetot = [
            node.children()[0].children()[1]
            for node in nodevisitor.visit(tree)
            if isinstance(node, ast.VarStatement)
            and node.children()[0].children()[0].value == "Data_ACWorthTrend"
        ][0]
        ## timestamp transform tzinfo must be taken into consideration
        tz_bj = dt.timezone(dt.timedelta(hours=8))

        infodict = {
            "date": [
                dt.datetime.fromtimestamp(
                    int(nodenet.children()[i].children()[0].right.value) / 1e3, tz=tz_bj
                ).replace(tzinfo=None)
                for i in range(len(nodenet.children()))
            ],
            "netvalue": [
                float(nodenet.children()[i].children()[1].right.value)
                for i in range(len(nodenet.children()))
            ],
            "comment": [
                _nfloat(nodenet.children()[i].children()[3].right.value)
                for i in range(len(nodenet.children()))
            ],
        }

        if len(nodenet.children()) == len(
            nodetot.children()
        ):  # 防止总值和净值数据量不匹配,已知有该问题的基金:502010
            infodict["totvalue"] = [
                float(nodetot.children()[i].children()[1].value)
                for i in range(len(nodenet.children()))
            ]

        rate = [
            node.children()[0].children()[1]
            for node in nodevisitor.visit(tree)
            if isinstance(node, ast.VarStatement)
            and (node.children()[0].children()[0].value == "fund_Rate")
        ][0]

        name = [
            node.children()[0].children()[1]
            for node in nodevisitor.visit(tree)
            if isinstance(node, ast.VarStatement)
            and (node.children()[0].children()[0].value == "fS_name")
        ][0]

        self.rate = float(
            rate.value.strip('"')
        )  # shengou rate in tiantianjijin, daeshengou rate discount is not considered
        self.name = name.value.strip('"')  # the name of the fund
        df = pd.DataFrame(data=infodict)
        df = df[df["date"].isin(opendate)]
        df = df.reset_index(drop=True)
        self.price = df[df["date"] <= yesterdaydash()]
        # deal with the redemption fee attrs finally
        self._feepreprocess()