disMoney = shareTotal * d[1] if stype == BONUS_SHARE: # 红利再投 shareTotal += disMoney / sT.getFundPrice(code[i], d[2])[1] else: # 现金红利 bonusTotal += disMoney d0 = date moneyTotal = moneyTotal + float(t[2].replace(",", "")) diff = float(t[1]) * shareTotal - moneyTotal rate = diff / moneyTotal rateList.append(rate * 100.0) #print((dateList) dataList.append([dateList, rateList]) for i in range(len(dataList)): #日期选择一个日期,坐标轴不能有两种不同的日期表示 plt.plot(dataList[0][0], dataList[i][1], label=name[i]) ax = plt.gca() ax.yaxis.set_major_locator( mpl.ticker.MultipleLocator(1 if sT.createCalender().dayDiff( STARTYEAR, STARTMONTH, STARTDAY, ENDYEAR, ENDMONTH, ENDDAY) < 365 * 3 else 5)) ax.yaxis.set_major_formatter(mpl.ticker.FormatStrFormatter("%.0f%%")) ax.axhline(color='black', y=0) mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体 plt.legend(loc=0, ncol=len(dataList), mode="expand", borderaxespad=0.0) plt.gcf().autofmt_xdate() plt.grid(True) plt.show()
bestRate = rate bestRateTime = tradeDate bestEarn = profit if ENDMONTH==12: year = ENDYEAR+1 month = 1 else: year = ENDYEAR month = ENDMONTH+1 foundData,closePrice,actualMonth, day=sT.getClosePriceBackward(code[i],ENDYEAR, ENDMONTH, ENDDAY) if foundData==True: nCapitalTotal = nStockTotal*closePrice+ndividend income = nCapitalTotal-nCapitalInvest incomeRate = income/nCapitalInvest investPeriod = round(sT.createCalender().dayDiff(STARTYEAR,STARTMONTH,1,year,actualMonth,day)/365.0, 2) dictColumnValues[u'代码'] = code[i] dictColumnValues[u'名称'] = name[i] dictColumnValues[u'投资年数'] = investPeriod dictColumnValues[u'投资起始时间'] = sT.getDateString(STARTYEAR,STARTMONTH,1) dictColumnValues[u'卖出股份时间'] = sT.getDateString(ENDYEAR,ENDMONTH,ENDDAY) dictColumnValues[u'投资总成本'] = nCapitalInvest dictColumnValues[u'投资总市值'] = nCapitalTotal dictColumnValues[u'投资总收益'] = income dictColumnValues[u'分红'] = ndividend dictColumnValues[u'平均年收益'] = round(income/investPeriod,2) dictColumnValues[u'投资收益率'] = round(incomeRate,4) dictColumnValues[u'投资年化复合收益率'] = round(((incomeRate+1)**(1.0/investPeriod)-1),4) dictColumnValues[u'总股本'] = nStockTotal dictColumnValues[u'购买股本'] = nStockInvest dictColumnValues[u"每月最小投资额"] = nMinInvPerMonth
if year > LASTYEAR: _, closePrice, _, _ = sT.getClosePriceForward(code, date) else: _, closePrice, m2, d2 = sT.getClosePriceForward(code, year, 12, 31) PEList.append(0 if EPS <= 0 else closePrice / EPS) PEDiscList.append(0 if epsdic <= 0 else closePrice / epsdic) PriceList.append(closePrice * totalStock) # 得到当年总市值 print( sT.getDateString(year,m2,d2),",BasicPETTM=",PEList[-1],", ","discountPETTM=",PEDiscList[-1],\ "stockcount=",totalStock,"priceTotal=", round(PriceList[-1]/10**4,0), ",EPSTTM=",EPS,\ ",EPSDicountTTM=",epsdic) drawPE = PEList[-1] for dt in DATA2WATCH: y1, m1, d1 = sT.splitDateString(dt) if y1 == year: foundData = False qt = sT.createCalender().getQuarter(m1) if qt == 1: foundData, EPSTTM = sT.getStockEPSTTM(code, y1 - 1, 4) _, EPSdiscountTTM = sT.getStockEPSdiscountTTM(code, y1 - 1, 4) #totalStock = sT.getStockCountQuarter(code, y1 - 1, 4) totalStock = sT.getStockCount(code, y1, m1, d1) else: qt = qt - 1 #本季度报表没有出来,因此使用上季度报表 while qt > 0 and not foundData: foundData, EPSTTM = sT.getStockEPSTTM(code, y1, qt) if not foundData: qt = qt - 1 continue #totalStock = sT.getStockCountQuarter(code, y1, qt) totalStock = sT.getStockCount(code, y1, m1, d1) _, EPSdiscountTTM = sT.getStockEPSdiscountTTM(code, y1, qt)
rateWorst = rate dateRateWorst = t[0] lostWorst = diff if rateBest < rate: rateBest = rate dateRateBest = t[0] earnBest = diff # print(totalValue-investTotal) # print(shareTotal*sT.getFundPrice(code[i], endDate)[1]-moneyTotal) # print(totalValue==shareTotal*sT.getFundPrice(code[i], endDate)[1],investTotal==moneyTotal ) # print shareTotal, totalValue/sT.getFundPrice(code[i], endDate)[1] rate = (totalValue - investTotal) / investTotal #float(infoStr[6][:-1])/100.0 investPeriod = round( sT.createCalender().dayDiff(STARTYEAR, STARTMONTH, STARTDAY, ENDYEAR, ENDMONTH, ENDDAY) / 365.0, 2) ratePerYear = round(((rate + 1)**(1.0 / investPeriod) - 1), 4) dictColumnValues[u'代码'] = code[i] dictColumnValues[u'名称'] = name[i] dictColumnValues[u'定投年数'] = investPeriod dictColumnValues[u'定投起始时间'] = startDate #dictColumnValues[u'定投结束时间'] = endDate dictColumnValues[u'卖出基金时间'] = endDate dictColumnValues[u'投资总成本'] = moneyTotal dictColumnValues[u'投资总市值'] = moneyTotal * (1 + rate) dictColumnValues[u'投资总收益'] = moneyTotal * rate dictColumnValues[u'分红'] = bonusTotal dictColumnValues[u'平均年收益'] = round( dictColumnValues[u'投资总收益'] / investPeriod, 2) dictColumnValues[u'投资收益率'] = round(rate, 4) dictColumnValues[u'投资年化复合收益率'] = ratePerYear
else: lost = nStockTotal * price + ndividend - nCapitalInvest if lostMoneyMax > lost: #由于计算时只计算检查日时的最大回撤,可能有比检查日回撤更大的时候,尤其是最后卖出时。 lostMoneyMax = lost lostMoneyMaxCaption = nCapitalInvest lostMoneyMaxTime = sT.getDateString(year, m, d) foundData, closePrice, saleMonth, actualsaleDay = sT.getClosePriceBackward( code[i], ENDYEAR, ENDMONTH, saleDay) #year = ENDYEAR if foundData == True: nCapitalTotal = nStockTotal * closePrice + ndividend income = nCapitalTotal - nCapitalInvest incomeRate = income / nCapitalInvest investPeriod = round( sT.createCalender().dayDiff(STARTYEAR, STARTMONTH, buyDay, ENDYEAR, ENDMONTH, saleDay) / 365.0, 2) dictColumnValues[u'代码'] = code[i] dictColumnValues[u'名称'] = name[i] dictColumnValues[u'投资时长(年)'] = investPeriod dictColumnValues[u'投资起始时间'] = sT.getDateString(STARTYEAR, STARTMONTH, buyDay) dictColumnValues[u'卖出股份时间'] = sT.getDateString(year, saleMonth, actualsaleDay) dictColumnValues[u'投资总成本'] = nCapitalInvest dictColumnValues[u'投资总市值'] = nCapitalTotal dictColumnValues[u'投资总收益'] = income dictColumnValues[u'分红'] = ndividend dictColumnValues[u'平均年收益'] = round(income / investPeriod, 2) dictColumnValues[u'投资收益率'] = round(incomeRate, 4) dictColumnValues[u'投资年化复合收益率'] = round( ((incomeRate + 1)**(1.0 / investPeriod) - 1), 4)
url = "http://fund.eastmoney.com/f10/F10DataApi.aspx?type=lsjz&code=" + code[ i] url = url + "&page=1&per=20&sdate=" url = url + dateToSearch url = url + "&edate=" url = url + dateToSearch url = url + "&rt=0.19110643402290917" data = urllib.urlopen(url).read() bs = bs4.BeautifulSoup(data, "html.parser") try: closePrice = float(bs.find_all("td")[2].get_text()) foundData = 1 except Exception, e: print code[i], name[i], u"没有今日数据!", dateToSearch y, m, d = sT.splitDateString(dateToSearch) y, m, d = sT.createCalender().getPrevWorkday(y, m, d) dateToSearch = sT.getDateString(y, m, d) elif market[i] != "fund": found, closePrice, am, actualDay = sT.getClosePriceForward(code[i], date, autp=None) dateToSearch = sT.getDateString(y, am, actualDay) if found == True: foundData = 1 else: foundData = 0 if foundData == 1: print code[i], name[i], closePrice, dateToSearch #如果中间有既不是股票也不是基金的行,i值也会+1,就相当于在excel中插入不是股票和基金的空行 worksheet.write(i, 0, code[i])
for i in range(count): foundData = 0 if code[i] == u'' : continue url = "http://fundex.eastmoney.com/FundWebServices/FundSylCalculator.aspx?fc=" + code[i] url = url + "&stime=" + startDate + "&etime=" + saleDate url = url + "&stype=" + stype + "&sgfl=" + "0" + "&shfl=" + "0" + "&sg=" + "10000" + "&lx=1" data = urllib.urlopen(url).read() time.sleep(1) infoStr = data.split(':') if infoStr[0]=='var Result={"error"': print data continue rateList = data.split(":")[4].split(",")[0].split('"') rate = float(rateList[1])/100.0 investPeriod = round(sT.createCalender().dayDiff(STARTYEAR,STARTMONTH,1,ENDYEAR,ENDMONTH,endDay)/365.0, 2) ratePerYear = round(((rate + 1) ** (1.0 / investPeriod) - 1), 4) worksheet.write(i+1, 0, code[i]) worksheet.write(i+1, 1, name[i]) worksheet.write(i+1, 2, rate, style_percent) worksheet.write(i+1, 3, ratePerYear, style_percent) worksheet.write(i+1, 4, startDate) worksheet.write(i+1, 5, saleDate) print code[i], name[i], "收益:%.2f%%" % (rate * 100.0), "年化收益:%.2f%%" % (ratePerYear * 100.0) workbook.save('.\\data\\dataResult.xls') print "Invest result has been wrotten to dataResult.xls"