首先先导入apple的股票,这里已经把股票下载为csv文件了,直接用panda来加载
import pandas as pd
stocks=pd.read_csv("1Appl2010-2021.csv",header=[0,1])
stocks
接着我们可以查看股票的列名
也可以用to_flat_index()方法将其扁平化,方便查看
#convert multi index to one tuple
stocks.columns=stocks.columns.to_flat_index()
stocks.columns
这里用loc方法截取Close这一列的所有数据
import pandas as pd
stocks=pd.read_csv("1Appl2010-2021.csv",header=[0,1])
stocks.loc[:,'Close']
这里用copy方法先把Close这列信息传给close
import pandas as pd
stocks=pd.read_csv("2spy_aapl_ko_2010-2021.csv",header=[0,1])
close=stocks.loc[:,'Close'].copy()
close
然后我们可以用seaborn样式画个图,清晰得知这三个股票的走势差距
close.AAPL.div(close.iloc[0,0])#与第一位的值进行比较
差距除了图像上也可以从树枝上体现,这里用的div方法,将这列数值与第一个值进行一个除法得出比值
normclose=close.div(close.iloc[0]).mul(100)
plt.style.use("seaborn")
normclose.plot(figsize=(15,8),fontsize=12)
这里的normclose表示了之后的值的相对于第一排的变化率,mul(100)相当于乘以100,所以这里其实是一个百分比
aapl['lag1']=aapl.shift(periods=1)
shift方法就是将数值往下拉一格,移动多少取决于period
这里用sub方法,将原数组减去移动后数组,得出difference记作diff
aapl['Diff']=aapl.AAPL.sub(aapl.lag1)
aapl
aapl['% Change']=aapl.AAPL.div((aapl.lag1)).sub(1).mul(100)
aapl
这里用原数组除以移动后数组后减去1然后乘以100,就是为了得到变化的百分比形式
这里用了pct_change方法,直接得到aapl除以移动后的aapl数据的百分比
del aapl['Diff2']
如果要删除数据的话直接用del
aapl.rename(columns={'% Change':'Change'},inplace=True)
aapl
rename方法可用来改变列名和行名
若是要将数据按照时间分段列出来可以用
我们可以根据日期来分割信息
ret=aapl.pct_change().dropna()
ret
dropna方法可以去除掉那些为空值的
info方法可以得知表格的各个属性
通过hist方法可以看出aapl大致区间在于0左右
var_daily_ret=ret.var()
var_daily_ret
得到方差
import numpy as np
std_daily_ret=np.sqrt(var_daily_ret)
std_daily_ret
得到每天的标准差
ret.std()
annual_mean_ret=daily_mean_ret*252
annual_mean_ret
得到每年的平均值
annual_var_ret=var_daily_ret*252
annual_var_ret
得到每年的方差
annual_std_ret=np.sqrt(var_daily_ret)
annual_std_ret
得到每年的标准差
import pandas as pd
stocks=pd.read_csv("3spy_aapl_ko_ibm_dis_msft_2010-2021.csv",header=[0,1])
close=stocks.loc[:,'Close'].copy()
close
normclose=close.div(close.iloc[0]).mul(100)
plt.style.use("seaborn")
normclose.plot(figsize=(15,8),fontsize=12)
这与之前的相似,但是多了许多股票
用T方法可以让列和行反过来
summary.plot.scatter(x='std',y='mean',figsize=(12,8),s=50,fontsize=15)
for i in summary.index:
plt.annotate(i,xy=(summary.loc[i,'std']+0.002,summary.loc[i,'mean']+0.002),size=15)
由图中我们可以看到这些股票的标准差和平均值的方位,标准差越小说明越稳定,因此我们最好选用SPY
cov和corr方法分别是协方差
import seaborn as sns
plt.figure(figsize=(12,8))
sns.set(font_scale=1.4)
sns.heatmap(ret.corr(),cmap='Reds',annot=True,annot_kws={'size':15},vmax=0.6)
plt.show()
通过热图我们可以看出这些股票的协方差的值的变化,
simplereturns=df.pct_change().dropna()
simplereturns
simplereturns.mean()
simplereturns就是简单的将每年的数值与前一年进行一个比值,得出变化
logreturns更加准确,用原数组除以移动后数组后再取平均值
spy.rolling(window=10,min_periods=5).max().head(15)
这里用了rolling方法,window相当于确定一个大范围,min_periods就是运行的最小区间
spy["SMA50"]=spy.Close.rolling(window=50,min_periods=50).mean()
spy.plot(figsize=(12,8),fontsize=15)
plt.legend(loc='upper left',fontsize=15)
这里可以得知以50个数据得平均值的曲线
可以看出数量越大,取得得曲线就越平滑
index.day_name和index.quarter分别表示为星期几和月季度来表示
这里可以通过set_index改变序号
也可以通过fillna方法中ffill和bfill分别向前向后调整数据
这里d_returns跟之前一样处理得到比值
然后我们运用consum累加函数得到比值的和
通过累加的比值和我们画出的曲线可以表达出来股票的上升走势
通过cummax方法我们可以得到累加和的最大值
由此我们可以得到提款drawdown
对此我们可以进行索引得到精准的时间序号
apple.drawdowns.max()apple.drawdowns.idxmax()apple.loc[(apple.index==2696)]
apple['drawdowns%']=(apple['drawdowns']/apple['cummax'])
apple
也可以通过百分比来精确得知其变化率
最后我们可以得到变化率最大值的索引,之后就可以看看当天的具体变化
apple['drawdowns%'].max()
apple['drawdowns%'].idxmax()
apple.loc[(apple.index==828)]