#划分训练集和测试集
“”“使用了NumPy库中的where函数,传入的3个参数的含义分别为判断条件、满足条件的赋值、不满足条件的赋值。其中df[‘price_change’].shift是利用shift函数将price_change这一列的所有数据向上移动1行,这样就获得了每一行对应的下一天的股价变化。这里的判断条件就是下一天的股价变化是否大于0,如果大于0,说明下一天股价涨了,则y赋值为1;如果不大于0,说明下一天股价不变或跌了,则y赋值为-预测结果就只有1或-1两种分类。”“”y=np.where>0,1,-
“”“n_estimators参数的候选值范围为{20},max_depth参数的候选值范围为{5},min_samples_leaf参数的候选值范围为{20,30}。”“”parameters={‘n_estimators’:[5,10,20],‘max_depth’:[2,3,4,5],‘min_samples_leaf’:[5,10,20,30]}new_rfc=RandomForestClassifier#构建的随机森林模型
模型准确度评估
df=ts.get_k_datadf=df.set_index#将日期作为索引值
X_test[‘p_change’]=)/X_test[‘close’].shift
移动平均线相关数据构造
“”“设置cv参数为表示交叉验证6次;设置模型评估标准scoring参数为’accuracy’,即以准确度作为评估标准,如果设置成’roc_auc’则表示以ROC曲线的AUC值作为评估标准。”“”grid_search=GridSearchCV
#参数调优
#分析特征变量的重要性
df[‘RSI’]=talib.RSIdf[‘MOM’]=talib.MOMdf[‘EMA12’]=talib.EMAdf[‘EMA26’]=talib.EMAdf[‘MACD’],df[‘MACDsignal’],df[‘MACDhist’]=talib.MACDdf.dropna
简单衍生变量数据构造
通过TA_Lib库构造衍生变量数据
X=df[[‘close’,‘volume’,‘close-open’,‘MA5’,‘MA10’,‘high-low’,‘RSI’,‘MOM’,‘EMA12’,‘MACD’,‘MACDsignal’,‘MACDhist’]]
对特征按照计算出来的特征重要性进行排序
#提取特征变量和目标变量
“”“决策树的最大深度max_depth设置为即每个决策树最多只有3层;弱学习器的个数n_estimators设置为即该随机森林中共有10个决策树;叶子节点的最小样本数min_samples_leaf设置为即如果叶子节点的样本数小于10则停止分裂;随机状态参数random_state的作用是使每次运行结果保持一致,这里设置的数字1没有特殊含义,可以换成其他数字。”“”rfc=RandomForestClassifier
#模型搭建
df[‘MA5’]=df[‘close’].rolling.meandf[‘MA10’]=df[‘close’].rolling.meandf.dropna
最佳运行参数{‘max_depth’:2,‘min_samples_leaf’:30,‘n_estimators’:20}
df[‘close-open’]=/df[‘open’]df[‘high-low’]=/df[‘low’]df[‘pre_close’]=df[‘close’].shiftdf[‘price_change’]=df[‘close’]-df[‘pre_close’]df[‘p_change’]=/df[‘pre_close’]*100
“”“预测属于各个分类的概率,获得的y_pred_proba是一个二维数组,其第1列为分类为-1的概率,第2列为分类为1的概率”“”y_pred_proba=rfc.predict_proba
计算每天的股价变化率,即/前一天的收盘价。
X_test[‘origin’]=.cumprod“”“因为是根据当天的股价数据预测下一天的股价涨跌情况,如果预测为则在下一天买入,如果预测为-则在下一天卖出,所以这里通过shift将预测结果这一列向下移一行,这样才能和下一天的股价变化率相匹配,再用cumprod函数来计算收益率。”“”X_test[‘strategy’]=*X_test[‘p_change’]+.cumprod
features=X.columnsimportances=rfc.feature_importances_a=pd.DataFramea[‘特征’]=featuresa[‘特征重要性’]=importancesa=a.sort_valuesprint
score=accuracy_scoreprintprint)#和score值一样,等价操作
获取股票基本数据
“”“需要注意的是,划分要按照时间序列进行,而不能用train_test_split函数进行随机划分。这是因为股价的变化趋势具有时间性特征,而随机划分会破坏这种特征,所以需要根据当天的股价数据预测下一天的股价涨跌情况,而不能根据任意一天的股价数据预测下一天的股价涨跌情况。”“”X_length=X.shape[0]#shape属性获取X的行数和列数,shape[0]即为行数split=intX_train,X_test=X[:split],X[:split]y_train,y_test=y[:split],y[:split]
文章为作者独立观点,不代表观点