from openpyxl import load_workbook import datetime from fund import FundData, buyFund, sellFund # 打开 Excel 文件和工作表 wb = load_workbook('指数数据.xlsx') sheet = wb['指数数据'] # 取出我们需要用到的数据 dataList = [] for i inrange(sheet.max_row): if(i == 0): # 第一行是表格标题,直接略过 continue # 获取日期 date = sheet.cell(row=i+1, column=1) # 字符串转日期 dateTime = datetime.datetime.strptime(date.value,'%Y-%m-%d') # 不是周一则跳过(0 是周一,1 是周二,以此类推) if(dateTime.weekday() != 0): continue data = FundData() data.date = date.value # 获取价格 price = sheet.cell(row=i+1, column=2) data.price = float(price.value)/1000 # 获取市盈率分位点 position = sheet.cell(row=i+1, column=4) data.position = float(position.value) dataList.append(data) # 开始模拟 dataRecords = [] lastData = FundData() lastSellPosition = 0.0 for data in dataList: if data.position <= 0.1: # 买入500元的 data = buyFund(lastData, data, 500) lastSellPosition = 0.0 elif data.position <= 0.2: # 买入200元的 data = buyFund(lastData, data, 200) lastSellPosition = 0.0 elif data.position <= 0.3: # 买入100元的 data = buyFund(lastData, data, 100) lastSellPosition = 0.0 elif data.position <= 0.6: continue elif data.position <= 0.7: # 已经卖完了,或者当前阶段卖过了,不再重复卖 if lastData.volumeTotal == 0or lastSellPosition > 0.6: continue # 卖出四分之一 data = sellFund(lastData, data, 0.25) lastSellPosition = data.position elif data.position <= 0.8: # 已经卖完了,或者当前阶段卖过了,不再重复卖 if lastData.volumeTotal == 0or lastSellPosition > 0.7: continue # 卖出一半,就是剩下的三分之二 data = sellFund(lastData, data, 0.66667) lastSellPosition = data.position else: # 已经卖完了,或者当前阶段卖过了,不再重复卖 if lastData.volumeTotal == 0or lastSellPosition > 0.8: continue # 卖出四分之一,就是剩下的全部 data = sellFund(lastData, data, 1) lastSellPosition = data.position print(data) lastData = data dataRecords.append(data) print('最高投入金额: %.2f' % (lastData.amountMax)) print('手续费总计: %.2f' % (lastData.feeTotal)) # 计算盈利时应当算上浮动盈利 finalData = dataList[len(dataList)-1] profit = lastData.profit+lastData.volumeTotal*finalData.price-lastData.amountTotal print('总盈利: %.2f' % (profit)) rate = profit/lastData.amountMax/10 * 100 print('平均每年收益: %.2f%%' % (rate)) |