元组
案例1:基金定投
基金定投是定期定额投资基金的简称,是指在固定的时间以固定的金额投资到指定的开放式基金中。采用基金定期定额投资方式,不论市场行情如何波动,每个月固定一天定额投资基金,由银行自动扣款,自动依基金净值计算可买到的基金份额数。再用基金份额数X当期净值,得到期末资产。
每个月投入 一个金额num , 决定定期投几个月,invest_month
基金单位净值,是指当前的基金总净资产除以基金总份额。其计算公式为:基金单位净值=总净资产/基金份额。
基金总净资产:比如兴业基金,发行价1元,发行5000亿股,他去买下100只股票,每天这100只股票股价就会变动,有可能今天变成5010亿,明天变成4900亿
第一天基金净值=5010亿/5000亿股=1.002元, 第二天基金净值=4900亿/5000亿股=0.98元,
学会当期份额fund_share_today 份额=(投入金额-手续费)/基金净值 比如投入1000元,手续费是0.6%,净值是1元,那么你持有的份额. =num_today / net_value_f (投资/净值)
总份额怎么计算
coef = int(earning_rate/0.05) #投入资金时每次跌幅超过5%,定投金额追加额度的25%,
num_today = num*(1-0.25*coef) #份数
fund_share_today = round(num_today/net_value_f,2)
在低价的时候购入,在高价的时候卖出。
每年必考题
"""
作者:张三
功能:实现基金定投(AIP)的收益计算
基金定期定额投资的微笑曲线:指投资者在股市下跌时仍坚持基金“定投”(定期投入相同金额,如每月8日买入2000元),
积累更多廉价筹码(更多份额),待股市上涨至“止盈点”(比如基金涨幅30%)时赎回。
假设投资曲线为:f = 0.0008 * (x - 17)**2 + 0.8599 (此处为模拟,真正的基金净值可通过网络爬虫从网上获得)
公式说明:x为投资的第x个月份,f为当前月份指定日期的基金净值
版本:2.0
日期:3/15/2022
2.0版本新增功能:实现智能定投,投入资金时每次跌幅超过5%,定投金额追加额度的25%,
每次投入时涨幅超过5%,则减少额度的25%(减少到0为止),计算投资收益。
每期信息存储到嵌套元组的列表:[(当前净值,当前总份额,本期份额,当前投资总额,本期投入,当前收益),...]
"""
"""
tuple() 构造函数
一旦定义不能修改。
元组稳定,不会改变。列表可以改变,元组内的列表可以改变。
元组转列表,再排序,再转元组
"""
def main():
iaip_list = [] # 智能定投信息列表:[(当前净值,当前总份额,本期份额,当前投资总额,本期投入,当前收益),...]
num = int(input("请输入您每月定投的金额(单位:元):"))
invest_month = int(input("请输入定投投资的月数:"))
# 首月投资信息放入列表
net_value_f = 0.001 * pow(0 - 17, 2) + 0.8599 #计算当前净值 #即: (x-17)=-17 求 -17的平方,是289
#print(pow(0 - 17, 2))
num_sum = num_today = num
fund_share_sum = fund_share_today = round(num / net_value_f, 2)
iaip_list.append((net_value_f, fund_share_sum, fund_share_today, num_sum, num_today, 0))
# 任务:完成后续智能定投信息列表,注意每一期投资额度的增减
for i in range(1,invest_month-1):
net_value_f = round(0.001*pow(i-17,2)+0.8599,4)
earning_rate=(iaip_list[i-1][1]*net_value_f/iaip_list[i-1][3])-1
coef = int(earning_rate/0.05)
num_today = num*(1-0.25*coef)
fund_share_today = round(num_today/net_value_f,2)
earnings= round(net_value_f*fund_share_sum-num_sum,2)
information=(net_value_f, fund_share_sum, fund_share_today, num_sum, num_today, earnings)
iaip_list.append(information)
print("您定投月份为{:*^6}月,总投资{:^10,}元,投资的份额为:{:^10,.2f}".format(invest_month, iaip_list[-1][3], iaip_list[-1][1]))
print("您投资基金的当前净值为每份{}元,期末资产为{:^10,.2f}元,".format(iaip_list[-1][0], iaip_list[-1][0] * iaip_list[-1][1]))
print("期末收益为{:^10,.2f}元,收益率为:{:.2f}%".format(iaip_list[-1][-1], iaip_list[-1][-1] / iaip_list[-1][3] * 100))
for month in range(1, invest_month+1):
if iaip_list[month][-1] > 0:
break
print('当您定投投资到第{}个月开始有正收益,此时的基金净值为每分{}元'.format(month, iaip_list[month][0]))
if __name__ == '__main__':
main()
案例二、
“”"
功能:推荐评分最高的三部电影
作者:张三
版本:1.0
日期:3/15/2022
“”"
def k(item):
return item[2] #==>按成绩排序,成绩是第二个字段
电影名称列表
films = [‘地道战’,‘英雄儿女’,‘上甘岭’,‘铁道游击队’,‘长津湖’,‘水门桥’,‘狙击手’]
电影对应评分列表
scores = [9.0, 9.2, 8.9, 8.6, 9.4, 9.2, 9.5]
任务1:生成电影信息列表film_info,格式为:[(电影编号,电影名称,评分),…],假设电影编号为1、2、3 …
法一、
films = ['地道战','英雄儿女','上甘岭','铁道游击队','长津湖','水门桥','狙击手']
scores = [9.0, 9.2, 8.9, 8.6, 9.4, 9.2, 9.5]
list=[]
for i in range(len(films)):
tu=(i,films[1],scores[i]) #tu=i,films[1],scores[i]
list.append(tu)
print(list)
法二、
film_list = list(zip(range(1,len(films)+1),films,scores))
任务2:按电影评分由高到低排序得到有序电影信息列表film_info_sorted
film_info_sorted.sort() 没有返回值,只能按序号排
法一、sort() 函数
film_list = list(zip(range(1,len(films)+1),films,scores)) #在内部加循环,形成列表
film_list.sort(key = lambda x:x[2],reverse=True)
print("使用key排序的列表",film_list) #lambda的使用,改名。
lambda函数可以使用
法二、 sorted()函数(自己的方法)
film_info_sorted=[]
for i in range(7):
tu2=(i,films[1],scores[i])
film_info_sorted.append(tu2)
list2=sorted(film_info_sorted,key=k,reverse=True)
任务3:输出电影评分前三名的名次、电影名称、评分,第三名评分相同的均需要列出
print(film_list[:3],end=’ ') #切片操作,不需要for循环。
po=film_list[:3]
for file in film_list[3:]: #注意不要再for循环了,注意用切片的操作
if(file[2]!=film_list[2][2]):
break
else:
po.append(file)
print(po)
案例三、水仙花数
“”"
功能:求所有水仙花数(三位数中个位十位百位的立方和等于它本身)
作者:张三
版本:1.0
日期:3/15/2022
“”"
方法1:
for num in range(100, 1000):
ge=num%10
shi=num//10%10
bai=num//100
sum = ge*ge*ge+shi*shi*shi+bai*bai*bai
if sum==num:
print(sum)
# print(ge,shi,bai)
方法2:利用map函数求所有水仙花数
for num in range(100, 1000):
x,y,z= list(map(int , str(num)))
# int 是整数类的构造函数,对后面的数据需要做转换成整数操作。
#print(x**3+y**3+z**3)
if(x**3+y**3+z**3)==num:
print(num)
#print(sum)