作者:老余捞鱼
原创不易,转载请标明出处及原作者。
写在前面的话:之前我写了很多用 python 实现各种投资工具的文章,有读者留言希望我多写一些适合“小白”学习的课程,或者相对容易上手的内容。本文就是一篇入门级的教程,我们将深入探讨如何使用 Python 和 yfinance 来轻松计算任何股票的月收益Ὁ,并将其与标准普尔(SPY) 500 指数进行比较,从而分析你的股票在一段时间内相对于整个市场的表现。
一、为什么要拿月回报率和标准普尔500 进行对比
探索一只股票在一定时间框架内的轨迹,月度回报率无疑是一扇洞察其表现的窗户。不论您是资深的市场老手,还是初涉股市的新手,这种简洁而有力的分析方法都能清晰地揭示出股票相对于整体市场的走势和表现。每月的收益波动,为您勾勒出一幅投资故事的轮廓,助您在投资的征途中做出更为明智的决策。
当然,你通过股票app上能看到你每只股票的收益情况,还可以在电脑端通过划线工具同指数进行各时间段收益率比较。但如果你要进一步的实现自己想要的功能,打造专属于自己调性的投资工具,比如生成各种技术分析图:《手把手教你AI顾投:轻松自动生成A股多技术指标K线图的方法》、《手把手带你用 Python 画出可视化交易信号》。比如进行API调用和策略编写:《手把手教你 AI 顾投:在 Ollama 中使用 Python 调用金融 API 服务》、《手把手教你 AI 顾投: Python 助力,轻松迈入算法交易员之门》、《真正手把手教会你:用 Python 构建网格交易策略》。再比如和AI助手结合进行市场洞察和预测:《Ollama 出马,为您创建实时 AI 股票顾问》、《手把手教会你用 AI 和 Python 进行股票交易预测(完整代码干货)》、《融合篇:用 OpenAI o1 草莓模型和 Python 预测股市行情》等等。如果没有基础的铺垫,上面这些文章可能你很难活学活用好。
那为什么自己的股票一定要和指数比较回报率呢?很简单,就是我认为总体上来讲就是下面三点原因:
而本文选取标准普尔(SPY) 500 指数的原因如下:
二、实现方法
方法只需要以下三步:
- 下载历史股票数据。
- 计算每月回报率--每月最后一天的价格变化百分比。
- 将这些回报与标准普尔 500 指数(更广泛市场的基准)进行比较。
假设我们想从 2023 年 1 月开始分析苹果公司 (AAPL) 的股票(这个票子在科技7雄中表现的不温不火,所以拿它出来比较 SPY,你觉得谁输谁赢?)。运行代码后,我们将得到:
Monthly Returns Comparison:
Date AAPL Price AAPL Return (%) S&P 500 Price S&P 500 Return (%) Return Difference (%)
2023-01 142.95 NaN 4076.60 NaN NaN
2023-02 146.26 2.32 3970.15 -2.61 4.93
2023-03 163.61 11.86 4109.31 3.51 8.36
2023-04 168.36 2.90 4169.48 1.46 1.43
2023-05 176.11 4.61 4179.83 0.25 4.36
2023-06 192.72 9.43 4450.38 6.47 2.96
2023-07 195.19 1.28 4588.96 3.11 -1.84
2023-08 186.91 -4.24 4507.66 -1.77 -2.47
2023-09 170.34 -8.87 4288.05 -4.87 -4.00
2023-10 169.90 -0.26 4193.80 -2.20 1.94
2023-11 189.23 11.38 4567.80 8.92 2.46
2023-12 191.80 1.36 4769.83 4.42 -3.06
2024-01 183.70 -4.22 4845.65 1.59 -5.81
2024-02 180.30 -1.85 5096.27 5.17 -7.03
2024-03 171.05 -5.13 5254.35 3.10 -8.23
2024-04 169.90 -0.67 5035.69 -4.16 3.49
2024-05 192.03 13.02 5277.51 4.80 8.22
2024-06 210.38 9.56 5460.48 3.47 6.09
2024-07 221.82 5.44 5522.30 1.13 4.31
2024-08 229.00 3.24 5648.40 2.28 0.95
2024-09 233.00 1.75 5762.48 2.02 -0.27
2024-10 225.91 -3.04 5705.45 -0.99 -2.05
2024-11 226.96 0.46 5995.54 5.08 -4.62
Summary Statistics:
AAPL Mean Monthly Return (%): 2.29%
AAPL Total Return (%): 58.77%
S&P 500 Mean Monthly Return (%): 1.83%
S&P 500 Total Return (%): 47.07%
苹果股票这段时间内的总回报率为58.77% ,是优于标准普尔 500 指数47.07%的,但从长远来看谁知道会发生什么呢?这些统计数据可以帮助投资者根据一贯的趋势做出决策。
就是下面的 Python 代码为我们完成了所有繁重的工作。它干净、简单、高效。
import yfinance as yf
import pandas as pd
def calculate_monthly_returns(ticker_symbol='AAPL', start_date='2020-01-01', compare_to_sp500=True):
"""
Calculate monthly returns for a given stock ticker and optionally compare to S&P 500
Parameters:
ticker_symbol (str): Stock ticker symbol
start_date (str): Start date in YYYY-MM-DD format
compare_to_sp500 (bool): Whether to include S&P 500 comparison
Returns:
pandas.DataFrame: Monthly returns data
"""
# Download stock data
stock = yf.Ticker(ticker_symbol)
df = stock.history(start=start_date, interval='1d')
# Download S&P 500 data if requested
if compare_to_sp500:
sp500 = yf.Ticker('^GSPC')
sp500_df = sp500.history(start=start_date, interval='1d')
# Resample to monthly data using 'ME' (Month End) and get last price of each month
monthly_prices = df['Close'].resample('ME').last()
monthly_returns = monthly_prices.pct_change() * 100
result_data = {
'Date': monthly_returns.index.strftime('%Y-%m'),
f'{ticker_symbol} Price': monthly_prices.round(2),
f'{ticker_symbol} Return (%)': monthly_returns.round(2)
}
if compare_to_sp500:
sp500_monthly_prices = sp500_df['Close'].resample('ME').last()
sp500_monthly_returns = sp500_monthly_prices.pct_change() * 100
result_data.update({
'S&P 500 Price': sp500_monthly_prices.round(2),
'S&P 500 Return (%)': sp500_monthly_returns.round(2),
'Return Difference (%)': (monthly_returns - sp500_monthly_returns).round(2)
})
result_df = pd.DataFrame(result_data)
# Calculate summary statistics
summary = {
f'{ticker_symbol} Mean Monthly Return (%)': monthly_returns.mean().round(2),
f'{ticker_symbol} Total Return (%)': ((1 + monthly_returns/100).prod() - 1) * 100
}
if compare_to_sp500:
summary.update({
'S&P 500 Mean Monthly Return (%)': sp500_monthly_returns.mean().round(2),
'S&P 500 Total Return (%)': ((1 + sp500_monthly_returns/100).prod() - 1) * 100
})
return result_df, summary
# Example usage
if __name__ == "__main__":
returns_df, summary = calculate_monthly_returns('AAPL', '2023-01-01')
print("\nMonthly Returns Comparison:")
print(returns_df.to_string(index=False))
print("\nSummary Statistics:")
for metric, value in summary.items():
print(f"{metric}: {value:.2f}%")
代码的主要内容说明:
- 股票数据下载 :我们使用
yfinance
获取历史股票价格。我们获取股票代码(如苹果公司,"AAPL")和标准普尔 500 指数(^GSPC)的每日数据。 - 月度数据重采样:我们使用
.resample('ME')
方法将每日数据转换为月度数据,该方法会抓取每个月的最后收盘价。这样我们就能得到一个更简洁、更易理解的数据集。 - 月回报计算:使用
pct_change()
,我们可以计算出月与月之间的价格变化百分比。这显示了股票和标准普尔 500 指数在一个月内的百分比变化。 - 结果数据:然后,我们准备一个 DataFrame,其中包含股票和标准普尔 500 指数的月度价格和收益,以及收益的差异。
- 简要统计:最后,我们会计算平均月回报率(所有月份的平均回报率)和总回报率(整个期间股票的涨跌幅)。
三、观点总结
对于想要快速评估自己的投资在大盘背景下的表现的人来说,这项分析改变了游戏规则。无论您是将苹果与标准普尔 500 或任何其他股票进行比较,这些见解都能帮助您做出更明智的投资选择。只需几行代码,即可开始分析自己的投资组合!你学会了吗?
- 股票月度回报率的计算:通过Python编程和yfinance库,可以轻松获取和计算股票的月度回报率,这为分析股票表现提供了一个简单而强大的方法。
- 与标准普尔500的比较:将股票的月度回报率与标准普尔500指数进行比较,可以帮助投资者了解其投资是否跑赢了市场,或者是否存在滞后。
- 市场趋势的理解:股票表现可能会受到市场整体因素的影响,包括经济、地缘政治或全球事件,这些因素会影响整个市场环境和投资者情绪。
- 长期表现的跟踪:月度回报率的数据使得投资者可以轻松跟踪股票的长期表现,并识别一致的趋势,以便做出基于数据的投资决策。
- 数据驱动的投资决策:通过计算平均月度回报率和总回报率,投资者可以更好地理解自己的投资组合,并根据一贯的趋势做出决策。
感谢您阅读到最后,希望本文能给您带来新的收获。祝您投资顺利!如果对文中的内容有任何疑问,请给我留言,必复。
本文内容仅仅是技术探讨和学习,并不构成任何投资建议。