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)
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
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)
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()]
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
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()
def __init__(self, infoobj, col, start, end=yesterdaydash(), totmoney=100000): self.col = col self.pos = 0 super().__init__(infoobj, start, end, totmoney)
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()
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
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()]
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)]
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)]
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()]
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]
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()