一、记账时需要记录三种类型的数据
1、第1种为买入信息
时间:2020-11-12
市场单价(元/份):1.322
投资金额(元):100
单次购买数量(份)=【投资金额(元)-手续费(元)】/市场单价(元/份)
75.55(是四舍五入后的结果)=(100-0.12)/1.322
2、第2种为卖出信息
时间:2021-02-19
市场单价(元/份):1.602
单次卖出数量(份):526.01
卖出金额(元)=市场单价(元/份)*单次卖出数量(份)-手续费
838.46(是四舍五入后的结果)=1.602*526.01-4.21
3、第3种为最新市场单价
时间:2023-07-21
市场单价(元/份):1.0824
二、数据整理
三、整理后的数据导入Python
import pandas as pd
df = pd.read_excel(r"文件地址.xlsx",
converters={"产品代码":str},
sheet_name = 0)
导入的数据显示为:
产品代码 time 市场单价 单次投资金额 单次购买数量 卖出金额
0 001027 2020-11-12 1.3220 100.0 75.55 NaN
1 001027 2020-11-13 1.3080 200.0 152.72 NaN
2 001027 2020-11-30 1.3280 200.0 150.42 NaN
3 001027 2020-12-18 1.3560 200.0 147.32 NaN
4 001027 2021-02-19 1.6020 0.0 -526.01 838.46
5 001027 2023-07-14 1.0714 100.0 93.22 NaN
6 001027 2023-07-21 1.0824 NaN NaN NaN
四、运行一个名为“fund”的函数用来记账
import numpy as np
from decimal import Decimal
def fund(product_code,df):
df = df.loc[df["产品代码"] == product_code,:]\
.reset_index(drop=True)
for i in ['市场单价', '单次投资金额', '单次购买数量']: df[i]=df[i].apply(lambda x :Decimal(str(x)))
del i
df.insert(6,'当时持有数量',np.nan)
for index in df.index[:-1]: df.loc[index,'当时持有数量'] = df.loc[0:index,'单次购买数量'].sum()
del index
df.insert(6,'其中现在持有数量',np.nan)
sell_all_num = -df.loc[df["单次购买数量"]<0,"单次购买数量"].sum()
if any( df["当时持有数量"] == sell_all_num):
sell_part = df[df["当时持有数量"]== sell_all_num].index[0]
df.loc[0:sell_part, "其中现在持有数量"] = 0
df.loc[sell_part+1:, "其中现在持有数量"] = df.loc[sell_part+1:, "单次购买数量"]
df.loc[df["单次购买数量"]<0,'其中现在持有数量'] = np.nan
all_cost = df.loc[df["其中现在持有数量"]!=0,'单次投资金额'].sum()
else:
sell_part = df[df["当时持有数量"] > sell_all_num].index[0]
df.loc[0:sell_part-1, "其中现在持有数量"] = 0
df.loc[sell_part, "其中现在持有数量"] = sell_all_num -df.loc[sell_part-1, "当时持有数量"]
df.loc[sell_part+1:, "其中现在持有数量"] = df.loc[sell_part+1:, "单次购买数量"]
df.loc[df["单次购买数量"]<0,'其中现在持有数量'] = np.nan
all_cost = df.loc[sell_part, "其中现在持有数量"]/df.loc[sell_part, "单次购买数量"]*df.loc[sell_part, "单次投资金额"]+df.loc[sell_part+1:,'单次投资金额'].sum()
all_num = df['当时持有数量'].iloc[-2]
unit_cost = (all_cost/all_num).quantize(Decimal('0.0000')) ; unit_price = df['市场单价'].iloc[-1]
all_value = (all_num*unit_price).quantize(Decimal('0.00'))
earn =all_value-all_cost
print(f"现在持有的份额:{all_num}")
print(f"现在成本单价:{unit_cost} 现在市场单价:{unit_price}")
print(f"总成本:{all_cost} 总价格:{all_value} 总利润:{earn}")
五、查看买卖基金的信息
对代码为"001027"的基金进行记账:
fund("001027",df)
输出为:
现在持有的份额:93.22
现在成本单价:1.0727 现在市场单价:1.0824
总成本:100.0 总价格:100.90 总利润:0.90
对比支付宝上的信息: