动量策略momentum_selection

#动量策略(改进策略请咨询博主)

import pandas as pd
import numpy as np
import datetime as dt
import matplotlib.pyplot as plt
Mdata = pd.read_csv(r'C:\Users\Lenovo\Desktop\work\量化投资\TRD_Mnth.csv')

Mdata.info()    #or use Mdata.dtypes  
Mdata.head()
Mdata.tail()

Mdata['Trdmnt1']=pd.to_datetime(Mdata.Trdmnt)
Mdata['date2']=Mdata.Trdmnt1.dt.year
Mdata['date3']=Mdata.Trdmnt1.dt.month
Mdata['date']=pd.PeriodIndex(year=Mdata.date2,month=Mdata.date3,day=Mdata.Clsdt, freq="D")
del Mdata['Trdmnt1']
del Mdata['date2']
del Mdata['date3']
del Mdata['Clsdt']


#1.calculate returen_6month
Mdata=Mdata.sort_values(by=['Stkcd','Trdmnt'],ascending=[True,True])  
Mdata['ret_lag6']=(Mdata.Mclsprc-Mdata.Mclsprc.shift(6))/Mdata.Mclsprc.shift(6)
Mdata.loc[Mdata.loc[:,'date']<=dt.datetime(2011,6,30),'ret_lag6']=np.NaN




#2.select 10 stocks with highest return_6month
Mdata2=Mdata.dropna(subset=['ret_lag6']).loc[:,['Trdmnt','Stkcd','ret_lag6']]
Mdata2=Mdata2.sort_values(by=['Trdmnt','ret_lag6'],ascending=[True,False])  
Mdata2['r_rank']=Mdata2.groupby(['Trdmnt'])['ret_lag6'].rank(ascending=False,method='first')
Mdata3=Mdata2.loc[Mdata2['r_rank']<=10,:]

td=Mdata3.loc[:,['Trdmnt','Stkcd','r_rank']]
td=td.pivot(index='Trdmnt',columns='r_rank',values='Stkcd')



#3.set assets allocation according to holding period
index1=td.index
columns1=td.columns
col=['Asset1','Asset2','Asset3','Asset4','Asset5','Asset6','Asset7','Asset8','Asset9','Asset10','flag']
Allocation=pd.DataFrame(np.empty((len(index1),len(col)),dtype=np.int64),index=td.index,columns=col)
Allocation.iloc[:,:]=np.nan
j=1
i=1
while(j<=len(index1)-1):  
    Allocation.iloc[j,0:len(columns1)]=td.iloc[j-i,:].values
    Allocation.flag[j]=i
    j+=1
    if i<6:
        i+=1
    else:
        i=1
    

#4.calculate actural return
R_col=['MReturn1','MReturn2','MReturn3','MReturn4','MReturn5','MReturn6','MReturn7','MReturn8','MReturn9','MReturn10','flag']
MReturn=pd.DataFrame(np.empty((len(index1),len(R_col)),dtype=np.int64),index=td.index,columns=R_col) 
MReturn.iloc[:,:]=np.nan
for j in range(1,len(index1)):   #不包括len(index1)本身
    for i in range(0,len(R_col)):
        if i!=len(R_col)-1:
            month=index1[j]
            stock=Allocation.iloc[j,i]
            mr=Mdata[(Mdata.Trdmnt==month) & (Mdata.Stkcd==stock)].Mretwd
            if len(mr) ==1:
                MReturn.iloc[j,i]=mr.values
            else:
                MReturn.iloc[j,i]=0  #缺失的return用0代替
        else:
            MReturn.iloc[j,i]=Allocation.iloc[j,i] #flag

#求(每个配置期内累积收益率+1)和组合净值
CR_col=['CReturn1','CReturn2','CReturn3','CReturn4','CReturn5','CReturn6','CReturn7','CReturn8','CReturn9','CReturn10','flag','NetValue_P']
CReturn=pd.DataFrame(np.empty((len(index1),len(CR_col))),index=td.index,columns=CR_col) 
CReturn.iloc[:,:]=np.nan
CReturn.flag=MReturn.flag
f1=lambda x:x+1
MReturn1=MReturn.iloc[:,0:len(columns1)].apply(f1)
CReturn.NetValue_P[0]=100  #假设初始投资额为100
wt0=1/len(columns1)
wt=[wt0]*len(columns1)
for j in range(1,len(index1)): 
    lag=int(CReturn.flag[j])   
    if lag==1:
        CReturn.iloc[j,0:len(columns1)]=MReturn1.iloc[j,:].values 
    else:
        CReturn.iloc[j,0:len(columns1)]=MReturn1.iloc[j,:].values*CReturn.iloc[j-1,0:len(columns1)].values
    CReturn.NetValue_P[j]=CReturn.NetValue_P[j-lag]*(np.average(CReturn.iloc[j,0:len(columns1)].values,weights=wt)) 

#求月度收益率、年度收益率     
CReturn['Return_month']=CReturn['NetValue_P']/CReturn['NetValue_P'].shift(1)-1

CReturn['a']=pd.to_datetime(CReturn.index)
CReturn['b']=CReturn['a'].dt.year
CReturn['c']=CReturn['a'].dt.month  
YReturn=CReturn.loc[CReturn['c']==12,['NetValue_P','a','b']]  
YReturn['Return_year']= YReturn['NetValue_P']/YReturn['NetValue_P'].shift(1)-1
AveReturn_year=YReturn['Return_year'].mean()
AveReturn_year


#绘图
plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"] #解决中文显示的问题
plt.rcParams['axes.unicode_minus'] = False


ax1=plt.subplot(311)
ax2=plt.subplot(312)
ax3=plt.subplot(313)

plt.subplots_adjust(wspace=0.8,hspace=0.8)

ax1.bar(YReturn['b'],YReturn['Return_year'])  
ax1.set_title('中国A股动量策略组合年度收益率柱状图')


ax2.bar(CReturn.index,CReturn['Return_month'],color='y')
ax2.set_title('中国A股动量策略组合月度收益率柱状图')


ax3.plot(CReturn['NetValue_P'],color='k')  #净值曲线
ax3.set_title('中国A股动量策略组合净值曲线')

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: `momentum_buffer` 通常是在优化器的动量 (momentum) 算法中使用的一个变量。动量算法是一种常用的优化算法,它可以加速模型的训练过程。在这个算法中,每个参数的更新值不仅取决于当前的梯度,还取决于之前的更新值。`momentum_buffer` 存储了每个参数的历史更新值,可以在每次更新时使用。这样,参数更新的方向会更加平滑,可以避免陷入局部最优解。 ### 回答2: momentum_buffer是深度学习中优化算法中的一个概念,指的是动量缓冲。在反向传播算法中,优化器使用动量来加速梯度下降的过程,通过积累之前梯度的动量来影响当前的梯度更新。 momentum_buffer是一个与模型参数形状相同的缓冲张量,用于存储动量值。在每次参数更新时,动量会根据当前的梯度和学习率进行更新。当一个参数的梯度方向在连续的迭代中保持一致时,动量将会不断增大,从而加快了参数更新的速度。 通过动量缓冲,我们可以利用之前参数的历史信息,帮助算法更好地适应更新。动量缓冲在训练过程中起到平滑梯度的作用,同时也有助于跳出局部最优解,加快收敛速度。 在具体的数学计算上,动量缓冲的更新公式为: momentum_buffer = beta * momentum_buffer + (1 - beta) * gradients 其中,beta是一个[0, 1)范围内的超参数,控制着动量的大小。通常情况下,beta的值会设置为接近1的较小值,例如0.9。 总而言之,momentum_buffer是一个用于存储动量值的缓冲张量,通过积累之前梯度的动量来影响当前的梯度更新,加快参数更新的速度,平滑梯度,加快收敛速度。 ### 回答3: momentum_buffer 是在优化算法中使用的一个缓冲区。在某些优化算法中,例如动量优化算法,我们引入动量来加速训练过程。动量可以被看作是模拟物体运动的力量,它可以让优化算法在前进方向上积累速度,并且在遇到障碍物时有一定的惯性,从而更容易跳出局部极小值。 momentum_buffer 就是用来保存这个动量的缓冲区。 在每个迭代步骤中,动量优化算法会根据当前的梯度方向和动量大小对参数进行更新,同时也会更新 momentum_buffer 的值。具体来说,对于每个参数向量,更新规则如下: momentum_buffer = momentum * momentum_buffer + learning_rate * gradient 其中,momentum动量系数,learning_rate 是学习率,gradient 是当前参数的梯度。这个更新规则将当前梯度的加权平均值添加到 momentum_buffer 中,随着训练的进行,momentum_buffer 会不断积累并记录之前的梯度信息。 在优化算法的迭代过程中,momentum_buffer 起到了平滑梯度方向的作用。它可以让梯度更新更加稳定,并且在参数更新时充分利用之前的梯度信息,从而提高收敛速度和训练效果。 总之,momentum_buffer 在优化算法中起到了记录和平滑之前梯度信息的作用,它是动量优化算法中一个重要的缓冲区。通过动量优化算法的参数更新规则,我们可以很方便地使用 momentum_buffer 来实现参数的累积更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值