python金融应用实验

投资者B采用的投资策略是“定投策略”,即从2020年首个交易日在每个交易日均按照当日收盘价对每只股票各购买100股,计算每个交易日投资者B持有每只股票市值的盈亏情况并可视化,再计算每个交易日投资者B投资组合的整体市值盈亏情况并可视化,对数据分析结果进行解释阐述。
现在已经得到了5只股票的每日收盘价数据框,每日以收盘价数据买入100股,然后根据当天收盘价数据表示出股票每日市值,盈亏情况就是今日收盘价减去上一日收盘价乘以股数,总手数是360手。

              jqr    ndsd   lcxx  zggj  zwzx
Date                                        
2020-01-02  14.31  107.52  28.44  9.88  4.26
2020-01-03  14.36  109.55  29.28  9.83  4.26
2020-01-06  14.63  109.09  29.03  9.75  4.38
2020-01-07  14.74  108.50  28.97  9.79  4.50
2020-01-08  14.60  109.60  27.68  9.56  4.26
          ...     ...    ...   ...   ...
2021-06-24  10.22  467.30  28.21  6.38  6.23
2021-06-25  10.55  476.23  28.38  6.45  6.25
2021-06-28  10.51  493.90  28.47  6.38  6.28
2021-06-29  10.54  508.51  28.02  6.38  6.22
2021-06-30  10.67  534.80  28.13  6.37  6.14
#已经有了5只股票收盘价数据库
shares=pd.DataFrame(0, index=data.index,columns=data.columns)#这是AI给的代码,运行了之后报AttributeError: 'DataFrame' object has no attribute 'DataFrame'错误
portfolio_value=pd.Series()
for date, prices in data.iterrows():
    shares.loc[date] += 100
    value = (shares * prices).sum(axis=1)
    pnl=value-(shares * data.iloc[0]).sum(axis=1)
    portfolio_value[date] = value.sum()
    daily_returns = pnl.sum() / (shares * data.iloc[0]).sum().sum()
print(portfolio_value)
print(daily_returns)

引用chatGPT作答,根据代码的第一行shares=pd.DataFrame(0, index=data.index,columns=data.columns),看起来data应该是另一个DataFrame对象。但是在给出的问题描述中没有提供data的定义,因此我们无法确定是否存在这个DataFrame对象。根据错误信息,很可能是在data.iterrows()这一行的代码中出现了问题。

另外,对于这种错误,通常需要查看完整的错误信息,以确定错误发生的确切位置。因此建议您提供完整的错误信息,以便更好地排查问题。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
缺少一个变量data来存储5只股票的每日收盘价数据,可以先将数据导入到DataFrame中,然后运行以下代码:

import pandas as pd

data = pd.read_csv('path/to/file.csv', index_col='Date') # 假设数据保存在CSV文件中,用read_csv读取

shares = pd.DataFrame(0, index=data.index, columns=data.columns)
portfolio_value = pd.Series()
for date, prices in data.iterrows():
    shares.loc[date] += 100
    value = (shares * prices).sum(axis=1)
    pnl = value - (shares * data.iloc[0]).sum(axis=1)
    portfolio_value[date] = value.sum()

daily_returns = portfolio_value.pct_change()

代码解释:

  • shares:初始化持仓数量的DataFrame,所有值都为0,行索引和列标签与股票价格DataFrame (data) 一致;
  • portfolio_value:初始化投资组合价值 (即所有股票的市值之和) 的Series;
  • for 循环:对于每个交易日,将所有股票的持仓数量增加100股,计算当日每个股票的市值,并累加得到投资组合价值。由于所有股票都是同时购买的,因此第一个交易日的持仓数量就是100股,可以使用 data.iloc[0] 获取第一天的股票价格;
  • pnl:计算当日投资组合的盈亏,即当日投资组合价值减去当日之前购买时的成本;
  • daily_returns:用 pct_change() 方法计算每日投资组合的收益率。

注意,上述代码没有使用 shares * data.iloc[0] 来计算投资组合成本,在例子中当天买入的股票价格和第一天的价格是一样的,因此直接用第一天的价格计算成本就可以了。如果在实际的股票交易中有价格变动,就需要使用实际的成本来计算盈亏了。
如果我的回答解决了您的问题,请采纳!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7772722
  • 除此之外, 这篇博客: python 入门题库————python语句和基础数理中的 现分别有A,B两个容器,在容器A里分别有7个红球和3个白球,在容器B有1个红球和9个白球,现已知从这两个容器里任意抽出了一个球,且是红球,问这个红球是来自容器B的概率是 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    答案:1/8


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^