import os
import sys
import time
import random
import math
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from itertools import accumulate
os.chdir('C:/Users\Administrator\.spyder-py3\Daily')
time0=time.time()
files=os.listdir()
#剔除无效文件
files=[x for x in files if len(x)==11 and x.endswith('csv')]
print('股票数量: ',len(files))
#根据数据长度确定完整的交易日,随机选择100个文件以最长行数为基准
maxlength=max([len(pd.read_csv(file)) for file in random.sample(files,100)])
#print('交易周期: ',maxlength)
#print('运行时间: ',time.time()-time0)
data=pd.read_csv('000001D.csv').iloc[:,[0,2]]
for file in files[1:]:
stock=pd.read_csv(file).iloc[:,[0,2]]
if len(stock)==maxlength:
data=pd.merge(data,stock,how='inner',on='datetime')
data.to_csv('data.csv')
data=pd.read_csv('data.csv')
#print('占用内存: ',sys.getsizeof(data))
p1=data.iloc[1:,2:].values
p2=data.iloc[:-1,2:].values
#计算每日的对数收益率,若价格中含有0则将收益值设置为1
diff=np.log(np.divide(p1,p2,out=np.ones(p1.shape),where=(p1*p2!=0)))
net=list(accumulate([np.mean(np.random.choice(diff[i],size=10)) for i in range(len(diff))]))
#计算每只股票的总收益率
#sum_diff=np.sum(diff,axis=0)
#对每日的收益率自小到大排序,类似每日的涨跌排行榜
rank=np.argsort(diff,axis=1)
#根据上一日的收益排行序列,筛选作为下一交易日的交易对象
index=[np.mean(diff[i-5,rank[i-5,100:200]]) for i in range(len(rank))]
strategy=[np.mean(diff[i,rank[i-5,100:200]]) for i in range(len(rank))]
#计算所有日的收益累计净值
net=list(accumulate(strategy))
import numpy as np
# 计算总收益率
total_returns = net[-1] - 1
# 计算年化收益率
total_trading_days = len(net)
annual_returns = (total_returns + 1) ** (250 / total_trading_days) - 1
# 计算年化收益率的标准差
daily_returns = np.diff(net) / net[:-1]
std_dev = np.std(daily_returns) * np.sqrt(250)
# 假设无风险利率为0.05(可根据实际情况调整)
risk_free_rate = 0.05
# 计算夏普比率
sharpe_ratio = (annual_returns - risk_free_rate) / std_dev
print("年化收益率:", annual_returns)
print("夏普比率:", sharpe_ratio)
python股票收益率计算_股票分析之——收益率(附完整代码和讲解)
可以借鉴下
https://blog.csdn.net/weixin_39886547/article/details/110780424
C:/Users\Administrator.spyder-py3\Daily
害,文件都没有