python画股票收益率acf图
时间: 2023-05-25 17:05:33 浏览: 337
以下是使用Python绘制股票收益率ACF图的示例代码:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
# 读取股票数据
df = pd.read_csv('stock_data.csv')
df.index = pd.to_datetime(df['date'])
df = df[['close']]
df = df.resample('D').ffill()
# 计算收益率
returns = df['close'].pct_change().dropna()
# 绘制ACF图
plot_acf(returns, lags=50)
plt.show()
```
在此示例中,我们首先读取股票数据,并将其重采样为每日收盘价。然后,使用pct_change()函数计算收益率。最后,使用plot_acf()函数绘制收益率的ACF图,其中lags参数指定要绘制的滞后阶数。最后,通过plt.show()函数显示图形。
相关问题
用Python对股票日度收盘价计算收益率,画收益率直方图,计算收益率的均值、方差、峰度和偏度,并画acf图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
# 读取股票数据
data = pd.read_csv('stock_price.csv', parse_dates=['date'])
data = data.set_index('date')
# 计算收益率
returns = data.pct_change()
returns = returns.iloc[1:]
# 画收益率直方图
plt.hist(returns['close'], bins=50)
plt.title('Histogram of Daily Returns')
plt.xlabel('Daily Returns')
plt.ylabel('Frequency')
plt.show()
# 计算收益率的均值、方差、峰度和偏度
mean_return = np.mean(returns)
var_return = np.var(returns)
skewness = returns.skew()
kurtosis = returns.kurtosis()
print('Mean Return:', mean_return)
print('Variance of Return:', var_return)
print('Skewness:', skewness)
print('Kurtosis:', kurtosis)
# 画ACF图
sm.graphics.tsa.plot_acf(returns, lags=20)
plt.title('Autocorrelation Function of Daily Returns')
plt.xlabel('Lags')
plt.ylabel('ACF')
plt.show()
写一个可以直接带入股票数据,马可威茨模型python代码
### 回答1:
好的,以下是一段使用马可夫-沃斯基-茨曼模型的 Python 代码:
```
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读入股票数据
data = pd.read_csv('stock_data.csv')
# 计算价格变动率
price_change = data['Adj Close'].pct_change().dropna()
# 计算价格变动率的对数
log_return = np.log(1 + price_change)
# 将价格变动率的对数转换为时间序列
ts = pd.Series(log_return.values, index=data['Date'].iloc[1:])
# 建立马可夫-沃斯基-茨曼模型
from statsmodels.tsa.stattools import acf, pacf
# 计算自相关系数和偏自相关系数
acf_value = acf(ts)
pacf_value = pacf(ts)
# 画出自相关图和偏自相关图
plt.figure(figsize=(12,6))
plt.subplot(121)
plt.plot(acf_value)
plt.axhline(y=0, linestyle='--', color='gray')
plt.axhline(y=-1.96/np.sqrt(len(ts)), linestyle='--', color='gray')
plt.axhline(y=1.96/np.sqrt(len(ts)), linestyle='--', color='gray')
plt.title('Autocorrelation Function')
plt.subplot(122)
plt.plot(pacf_value)
plt.axhline(y=0, linestyle='--', color='gray')
plt.axhline(y=-1.96/np.sqrt(len(ts)), linestyle='--', color='gray')
plt.axhline(y=1.96/np.sqrt(len(ts)), linestyle='--', color='gray')
plt.title('Partial Autocorrelation Function')
plt.tight_layout()
plt.show()
# 根据自相关图和偏自相关图确定 p 和 q 值
from statsmodels.tsa.arima.model import ARIMA
model = ARIMA(ts, order=(p, d, q))
results = model.fit()
#
### 回答2:
马可威茨模型(Markowitz Model),也称为现代投资组合理论,是由美国经济学家哈里·马科威茨于1952年提出的,用于衡量并优化投资组合的风险和回报之间的关系。
以下是一个可以直接带入股票数据的马可威茨模型的Python代码示例:
```python
import pandas as pd
import numpy as np
def markowitz_portfolio(stocks_data):
# 计算每只股票的预期收益率和协方差矩阵
returns = stocks_data.pct_change()
mean_returns = returns.mean()
cov_matrix = returns.cov()
num_assets = len(stocks_data.columns)
num_portfolios = 20000
results = np.zeros((3, num_portfolios))
weights_record = []
for i in range(num_portfolios):
# 随机生成权重
weights = np.random.random(num_assets)
weights /= np.sum(weights)
# 计算预期组合收益率和风险
portfolio_return = np.sum(mean_returns * weights)
portfolio_std_dev = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
# 记录结果
results[0, i] = portfolio_return
results[1, i] = portfolio_std_dev
results[2, i] = results[0, i] / results[1, i]
# 记录权重
weights_record.append(weights)
# 找到最优组合
max_sharpe_idx = np.argmax(results[2])
max_sharpe_ratio = results[2, max_sharpe_idx]
optimal_weights = weights_record[max_sharpe_idx]
return optimal_weights, max_sharpe_ratio
# 股票数据
stocks_data = pd.DataFrame({'AAPL': [0.05, 0.06, 0.03, 0.04],
'GOOGL': [0.04, 0.07, 0.045, 0.02],
'MSFT': [0.03, 0.025, 0.035, 0.04],
'AMZN': [0.025, 0.03, 0.02, 0.015]})
optimal_weights, max_sharpe_ratio = markowitz_portfolio(stocks_data)
print("最优权重:", optimal_weights)
print("最大夏普比率:", max_sharpe_ratio)
```
此代码使用了numpy和pandas库来进行计算和数据处理。首先,输入股票数据需要按照时间顺序,每一列为一只股票的收益率数据。函数markowitz_portfolio计算了每只股票的预期收益率和协方差矩阵,然后通过随机生成权重的方式计算了不同权重下的组合收益率和风险。最后,根据计算结果找到了最优组合的权重和对应的夏普比率。
需要注意的是,以上的代码示例仅演示了马可威茨模型的一个简单实现,实际应用中可能需要考虑更多的因素和调整。
### 回答3:
以下是一个可以直接带入股票数据的基于马可威茨模型的简单Python代码:
```python
import numpy as np
def markowitz_model(stock_returns, risk_free_rate):
# 计算协方差矩阵
cov_matrix = np.cov(stock_returns, rowvar=False)
# 计算股票的预期收益率
expected_returns = np.mean(stock_returns, axis=0)
# 定义一个目标函数,最小化风险
def objective(weights):
return np.dot(np.dot(weights, cov_matrix), weights.T)
# 约束条件,权重和为1,利用线性规划库求解
constraints = [{'type': 'eq', 'fun': lambda x: np.sum(x) - 1}]
# 定义一个辅助函数,使函数优化的结果符合约束条件
def minimize_volatility(weights):
return np.dot(np.dot(weights, cov_matrix), weights.T) / np.dot(weights, expected_returns)
# 使用scipy库中的优化器最小化目标函数
from scipy.optimize import minimize
result = minimize(minimize_volatility, [1/len(stock_returns)]*len(stock_returns), method='SLSQP', constraints=constraints)
# 解的权重即为资产配置比例
weights = result['x']
# 计算投资组合的预期收益、方差和夏普比率
expected_return = np.dot(weights, expected_returns)
portfolio_variance = np.dot(np.dot(weights, cov_matrix), weights.T)
sharpe_ratio = (expected_return - risk_free_rate) / np.sqrt(portfolio_variance)
return weights, expected_return, portfolio_variance, sharpe_ratio
if __name__ == '__main__':
# 假设有三只股票的收益率数据,每天的收益率依次为[0.01, 0.015, 0.02]
stock_returns = np.array([[0.01, 0.015, 0.02]])
# 假设无风险利率为0.005
risk_free_rate = 0.005
weights, expected_return, portfolio_variance, sharpe_ratio = markowitz_model(stock_returns, risk_free_rate)
print("权重:", weights)
print("预期收益率:", expected_return)
print("投资组合方差:", portfolio_variance)
print("夏普比率:", sharpe_ratio)
```
这段代码中,首先计算了股票数据的协方差矩阵和预期收益率,然后定义了目标函数和约束条件,利用scipy库中的优化器对目标函数进行最小化。最后,计算了投资组合的预期收益、方差和夏普比率,并打印输出结果。
注意,这只是一个简单的马可威茨模型实现,实际应用中需要考虑更多因素,例如资产类别、期望约束等。需要根据具体情况进行调整和扩展。
阅读全文