买基金时该如何记账?

文章介绍了如何使用Python进行基金交易数据的记录和整理,包括买入、卖出信息的处理,并通过一个名为“fund”的函数计算持有份额、成本单价、市场单价、总成本、总价格和总利润。示例展示了针对代码为001027的基金进行记账的结果,与支付宝信息进行了对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、记账时需要记录三种类型的数据

 

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

对比支付宝上的信息:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值