余利区

 找回密码
 立即注册
查看: 98|回复: 11

股票分析之——收益率(附完整代码和讲解)

[复制链接]

2

主题

8

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2023-1-12 08:46:52 | 显示全部楼层 |阅读模式
本节将介绍常见股票分析中的基础分析:收益率。股票收益的两大源头为:红利和股票价值变动的部分。由于我们只使用雅虎财经接口获取股票的相关数据,因此就并不考虑红利和其他因素,只考虑在某个时段的交易中股票本身价值变化的百分比。实际上,从日常经验看,我们也只考虑股票价值本身的变化。
如果有读者对Python语言不熟悉,没关系,这里有一个港大毕业并一直在做量化分析的老师的良好建议。反正做事情没那么简单,也没那么难啦!





<hr/>目录:

1.数据是数据分析的基础
2.收益率的计算
    2.1每日收益率
    2.2查看对数收益率
    2.3月度或季度的收益率
2.4绘制每日百分比变化daily_pct_change的分布
   2.5累计收益率
   2.6月回报收益率
   2.7与其他股票进行比较

1.数据是数据分析的基础

1.1导入数据(数据链接:https://pan.baidu.com/s/1u2HGoAKdfOXACONmIpD60A)
代码示例:
#导入apple公司股票数据
import pandas as pd
import pandas_datareader as pdr
import datetime
aapl = pdr.get_data_yahoo(
        'AAPL',
        start=datetime.datetime(1980,1,1),
        end=datetime.datetime(2019,12,29))
print(aapl)
#下面这一步,在本次分析中,可不做
aapl.to_csv(r'E:\stock\apple.csv',index=True)


部分数据的截图

1.2查看数据的基本信息
代码示例
information = aapl.info()

数据的基本信息需要注意的最关键点是:
                                             有无缺失值!!!
2.收益率的计算

2.1每日收益率
简单的每日百分比变化不考虑红利和其他因素,而是指在一天的交易中股票价值变化的百分比。每日百分比变化的计算很简单,只需使用 Pandas 包中的pct_change()函数。
代码示例
#导入numpy和pandas
import numpy as np
import pandas as pd
#将aapl数据框中'Adj Close'列数据赋值给变量'daily_close'
daily_close = aapl[['Adj Close']]
#计算每日收益率
daily_pct_change = daily_close.pct_change()
#用0填补缺失值NA
daily_pct_change.fillna(0, inplace=True)
#查看每日收益率的前几行
print(daily_pct_change.head())

计算收益率的另一种办法:
代码示例
# 每日收益率
daily_pct_change = daily_close / daily_close.shift(1) - 1这两种办法的幕后大佬是:



p是价格,t是时间(这里是天),r是收益率

只不过第二种更直观点,然而使用这一函数会使计算得到的数据框的开头存在缺失值NA 。

2.2查看对数收益率
计算对数收益率可以使你更好地了解回报随时间的增长。
代码示例
#计算每日对数收益率
daily_log_returns = np.log(daily_close.pct_change()+1)
#查看每日对数收益率的前几行
print(daily_log_returns.head())

2.3月度或季度的收益率
计算这两个分析指标时,我们将使用resample函数。
代码示例(分别按月和季度)
#按营业月对'aapl'数据进行重采样,取每月最后一项
monthly = aapl.resample('BM').apply(lambda x: x[-1])
#计算每月的百分比变化,并输出前几行
print(monthly.pct_change().head())

#按季度对'aapl'数据进行重采样,将均值改为每季度的数值
quarter = aapl.resample('3M').mean()
#计算每季度的百分比变化,并输出前几行
print(quarter.pct_change().head())

2.4绘制每日百分比变化daily_pct_change的分布
代码示例
#导入matplotlib
import matplotlib.pyplot as plt
#绘制直方图
daily_pct_change.hist(bins=50)
plt.savefig(r'E:\stock\return_hist',dpi=400,bbox_inches='tight')#将图片另存为
plt.show()

对daily_pct_change使用describe()函数,以确保正确解读了直方图。


从统计摘要的结果中知道,其均值非常接近0.00,标准差是0.02。同时,查看百分位数,有25%的结果落在-0.518692至-0.013277之间,有75%的值落在-0.518692至0.014749之间。
2.5累计收益率
累积日收益率有助于定期确定投资价值。可以使用每日百分比变化的数值来计算累积日收益率,只需将其加上1并计算累积的乘积。
代码示例
#计算累积日收益率
cum_daily_return = (1 + daily_pct_change).cumprod()
#输出'cum_daily_return'
print(cum_daily_return)
#绘制累积日收益率曲线
cum_daily_return.plot(figsize=(12,8))
plt.savefig(r'E:\stock\cum_daily_return',dpi=400,bbox_inches='tight')
plt.title('cum_daily_return')
plt.show()

2.6月回报收益率
如果你不想使用日回报率,而是用月回报率,那么对cum_daily_return使用resample()函数就可轻松实现月度水平的统计。


现在我们已经完成计算收益率(也有叫回报率),真的,这是一个非常基础且有意思的技能。
但是如果没有将其与其他股票进行比较,就没有太大的意义。就日常经验来看,我们总不能判断一件事情时,没有参照物嘛!因此我们经常会比较多只股票。
2.7与其他股票进行比较
我们仍然从雅虎财经接口获取更多的数据以便能比较不同股票的日收益率。
很自然,我们的思路是:要与几个股票比较,就用几次第一节中获取数据的方法,再把这些放到一个更大的dataframe中(dataframe是pandas的一个基础数据结构,如需更深入的了解,请看https://pandas.pydata.org/pandas-docs/stable/getting_started/dsintro.html)。
总体思路是对的,但是我们用一种更简便的方式。我们用fix_yahoo_finance来辅助我们,下面来看具体操作:
这个包的安装方式是:在Python的命令行中输入:


如果你把python安装在anaconda中,你可以这样:





看到个Successfully installed .......就表示你安装某个包安装成了。

那现在应该怎么用这个包((module)呢?
其实面向对象编程思想一个基础概念是:给使用者去知道怎么用,而不用去关心其内部细节。
当然在现在,这句话好似废话,但是我们得从历史的眼光来看问题,嗯,好,严肃风又起了,可以看看《十分钟计算机科学速成课》的10、11、12、13节https://www.bilibili.com/video/av8694900?p=13。
说到底还是一个万能准则:拿来就用!!!所以接下来,我们将在github中的这个说明中(https://github.com/ranaroussi/yfinance)边看边用。
先来波思路:
创建一个 get() 函数。
该函数将股票代码列表 tickers 以及开始和结束日期作为输入参数
第二个函数 data() 将 ticker 作为输入,用于获取 startdate 和 enddate 日期之间的股票数据并将其返回。
将 tickers 列表中的元素通过 map() 函数映射,获取所有股票的数据并将它们合并在一个数据框中。
代码示例
#获取Apple、Microsoft、IBM和Google的股票数据,并将它们合并在一个大的数据框中
import pandas_datareader as pdr
import datetime
import yfinance

def get(tickers, startdate, enddate):
    def data(ticker):
        return (pdr.get_data_yahoo(ticker, start=startdate,end=enddate))
    datas = map(data, tickers)
    return (pd.concat(datas, keys=tickers,names=['Ticker','Date']))
tickers = ['AAPL','MSFT','IBM','GOOG']
all_data = get(tickers, datetime.datetime(1980,1,1),datetime.datetime(2019,12,29))
print(all_data.head())
print(all_data)
#看看有没有缺失值
all_data.info()接下来,我们用这个大的数据框做一些有趣的图表:
#选取'Adj Close'这一列并变换数据框
daily_close_px = all_data[['Adj Close']].reset_index().pivot('Date','Ticker','Adj Close')
#对'daily_close_px'计算每日百分比变化
daily_pct_change = daily_close_px.pct_change()
#绘制分布直方图
daily_pct_change.hist(bins=50,sharex=True,figsize=(12,8))
#将绘图效果另存为
plt.savefig(r'E:\all_data',dpi=400,bbox_inches='tight')
#显示绘图结果
plt.show()

至此,我们已经完成了第一项常见的金融分析:收益率探索

结尾:
以下链接的内容,对本文有重大帮助作用:
回复

使用道具 举报

0

主题

6

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-1-12 08:47:32 | 显示全部楼层
在吗,请问根据历史收盘价怎么计算五日收益率啊,不知道Python代码怎么写
回复

使用道具 举报

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-1-12 08:47:37 | 显示全部楼层
请问原始数据中的Adj-close是股票的什么值啊
回复

使用道具 举报

3

主题

8

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2023-1-12 08:48:08 | 显示全部楼层
请问这个值可以用别的代替吗
回复

使用道具 举报

1

主题

4

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2023-1-12 08:48:48 | 显示全部楼层
调整收益率
回复

使用道具 举报

3

主题

8

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2023-1-12 08:49:27 | 显示全部楼层
是调整收盘价吧?想问下如果原数据里没有这个值,想计算日收益率的话该怎么办,我的原数据有 low high open close  pre-close change-pct volume   求问!
回复

使用道具 举报

1

主题

5

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-1-12 08:49:54 | 显示全部楼层
能问一下,为什么可以不把股利算进收益率里吗
[疑惑]
回复

使用道具 举报

1

主题

2

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2023-1-12 08:50:21 | 显示全部楼层
请问如果有缺失值该怎么处理比较好呢?插值可以嘛?
回复

使用道具 举报

2

主题

5

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2023-1-12 08:50:47 | 显示全部楼层
插值的方式有多种,具体每种方式的使用条件,百度下[捂脸]
回复

使用道具 举报

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-1-12 08:51:39 | 显示全部楼层
刚接触这个领域,请问Pt 是指股票的哪个价格??开盘?收盘?最低?最高?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

云顶设计嘉兴有限公司模板设计.

免责声明:本站上数据均为演示站数据,如购买模板可以上DISCUZ应用中心购买,欢迎惠顾.

云顶官方站点:云顶设计 模板原创设计:云顶模板   Powered by Discuz! X3.4© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表