掌握知识点:
1.data.cumsum()和data.cumprod()函数是累积和和累积积,data.prod()函数是计算连乘积;
2.pd.set_option(‘display.max_row’,500) 的用法
3.pd.rolling_max()和pd.expanding_max()函数用法
4.dataframe.fillna()函数用法,method=ffill为默认向后填充
5.data.loc[sell,’收盘发出的信号’]=0函数用法
6.resample()方法处理时间序列数据
7.shift()函数用法,shift(1)是往时间序列前一项;
8.为DataFrame表格添加行,统计下各列的方差(或者均值等),并汇总为一行
9 备注:掌握loc,iloc,ix的区别和应用
10.pd.set_option(‘display.max_row’,500) #设置最多可以显示500行
11.pd.set_option(‘display.max_columns’,100) #设置最多可以显示100列
第一步:导入数据,并按照交易日期排序,把交易时间转换为可以时间序列处理的datetime类型,之后选择交易日期在20050315之后的数据
import pandas as pd
data=pd.read_csv(‘sh600027.csv’,encoding=’gbk’)
data=data[[‘股票代码’,’股票名称’,’交易日期’,’涨跌幅’,’最高价’,’最低价’,’收盘价’]]
data.交易日期=pd.to_datetime(data.交易日期)
data=data.sort(‘交易日期’)
第二步,对数据进行整理,计算每天的仓位,用仓位*(涨跌幅+1).cumprod()就能计算累计涨幅了;
1.用pd.rolling_max()和pd.expanding_max()函数用海龟法则对数据进行加工处理
2.海龟法则:当收盘价大于等于过去N1天收盘价最高价时买入;当收盘价小于过去N2天收盘价时卖出;
N1=20
N2=10
data['最近N1个交易日最高价']=pd.rolling_max(data.最高价,N1)
data['最近N1个交易日最高价'].fillna(value=pd.expanding_max(data['最高价']),inplace=True)
data['最近N2个交易日最低价']=pd.rolling_min(data.最低价,N2)
data['最近N2个交易日最低价'].fillna(value=pd.expanding_min(data['最低价']),inplace=True)
buy=data[data.收盘价>=data.最近N1个交易日最高价.shift(1)].index
data.loc[buy,'收盘发出的信号']=1
sell=data[data.收盘价<data.最近N2个交易日最低价.shift(1)].index
data.loc[sell,'收盘发出的信号']=0
data['当天的仓位']=data.收盘发出的信号.shift(1)
用fillna()方法填充NaN,method=ffill为默认,向后填充
data['当天的仓位'].fillna(method='ffill',inplace=True)
选择交易日大于20050315的数据
data=data[data.交易日期>=pd.to_datetime('20050315')]
用cumprod()累积函数计算资金指数
data['资金指数']=((data.涨跌幅 +1)* data.当天的仓位).cumprod()
initial_idx=data.iloc[0]['收盘价']/(1+data.iloc[0]['涨跌幅'])
data['资金指数'] *=initial_idx
计算海龟法则每日涨跌幅
data['海龟法则每日涨跌幅']=data.涨跌幅 * data.当天的仓位
用resample()方法计算海龟法则每年涨跌幅
year_rtn=data.set_index('交易日期')[['涨跌幅','海龟法则每日涨跌幅']].resample('A',how=lambda x: (x+1.0).prod() -1.0)
year_rtn
看一下一直持股累积涨跌幅和海龟法则的累积涨跌幅,进行对比;
sum_cumprod_1=(year_rtn.涨跌幅+1).cumprod()
sum_cumprod_2=(year_rtn.海龟法则每日涨跌幅+1).cumprod()
year_rtn['累积涨跌幅']=sum_cumprod_1
year_rtn['海龟法则累积涨跌幅']=sum_cumprod_2
year_rtn
备注:cumsum()和cumprod()函数是累积和和累积积,prod()函数是计算连乘积;
d = arange(0, 10),cumsum(d)=array([ 0, 1, 3, 6, 10, 15, 21, 28, 36, 45])
cumprod(d+1)=array([ 1,2,6,24,120,720,5040, 40320, 362880, 3628800])
d=np.arange(1,5) ,d=d.prod()=24
我们发现海龟法则之所以累积能够战胜一直持股的策略,在于能够及时止损,跌的少才能保住青山在。
最简单的道理,如果跌去50%,要涨100%才能张回原来值,所以海龟法则的止损策略非常重要,也是该法则的核心。
为DataFrame表格添加行,统计下各列的方差(或者均值等),并汇总为一行
std_row=year_rtn[['涨跌幅','海龟法则每日涨跌幅','累积涨跌幅','海龟法则累积涨跌幅']].std()
std_row=pd.DataFrame(data=std_row).T
year_rtn=year_rtn.append(std_row)
year_rtn