python应⽤(3)svm模型预测股票涨跌
最近接了⼀个私活,指导学妹完成毕业设计。核⼼思想就是利⽤SVM模型来预测股票涨跌,并完成策略构建,⾃动化选择最优秀的股票进⾏资产配置。
在做这个项⽬的过程中,我体会到想成为⼀个合格的数据分析或者数据挖掘⼯程师不仅技术要过关,还需要了解所要挖掘数据涉及到的领域的相关知识。举个例⼦,在做数据预处理的时候,不知道超额收益率是怎么个意思,查阅资料才了解,超额收益率是股票⾏业⾥的⼀个专有名词,指⼤于⽆风险投资的收益率,在我国⽆风险投资收益率即是银⾏定期存款。
也稍微打个⼩⼴告,简书上如果有需要做毕业设计的同学可以找我私聊哦。⽽且如果只是简单咨询⼀些技术问题,学长会很热⼼得解答。
废话少说,⾔归正传。这⾥有关SVM、PCA等等这些与项⽬相关的数学知识不会提及,我以后会在算法专题⾥详细描述。
本项⽬⽤pycharm + anaconda3.6开发,涉及到的第三⽅库有pandas,numpy,matplotlib,skllearn。
流程图
参数设置
class Para:
method = 'SVM' #模型选择为SVM
month_in_sample = range(1, 7 + 1) #训练集数据对应⽉份
month_test = range(8, 12 + 1) #测试集数据对应⽉份
percent_lect = [0.3, 0.3] #正反例股票选取⽐例
percent_cv = 0.1 #交互验证机占样本内数据⽐例
path_data = 'C:/my python/python code/stock predict/Datas/Tests/Tests/' #输⼊数据⽂件路径
path_result = 'C:/my python/python code/stock predict/Datas/Results/' #输出数据⽂件路径
ed = 42 #random ed设置随机种⼦,制造伪随机数
svm_kernel = 'linear' #⽀持向量机的核函数类型
svm_c = 0.01 #线性⽀持向量机的惩罚系数
para = Para()
这个就是参数的初始化,没有什么要说的。
数据读取以及标记
#function: label data
#3数据标记
def label_data(data):
data['return_bin'] = np.nan #在data表格最后添加⼀列,并命名为return_bin,这⼀列将记录每个样本的标签
data = data.sort_values(by = '超额收益', ascending = F立冬吃饺子的由来
al) #将整个表格按照return列的值降序排列
n_stock_lect = np.multiply(para.percent_lect, data.shape[0]) #选取的股票个数
n_stock_lect = np.around(n_stock_lect).astype(int) #将上⾏所选取的股票个数取整,注意n_stock_lect是个含有两个整数的列表
data.iloc[0:n_stock_lect[0],-1] = 1
data.iloc[-n_stock_lect[1]:, -1] = 0 #这两⾏将表现好的股票标签置1,差的置0
data = data.dropna(axis = 0) #将没有1,0标签的,即不是最好的前百分之三⼗也不是最差的前百分之三⼗股票从表格⾥剔除
return data
#4数据读取
for i_month h_in_sample:
file_name = para.path_data + str(i_month) + '.csv'
data_curr_month = pd.read_csv(file_name, header = 0) 生白芍的功效与作用
#header=0意思是将表格第⼀⾏作为列名
para.n_stcok = data_curr_month.shape[0]
data_curr_month = data_curr_month.dropna(axis = 0) #去除缺省值
data_curr_month = label_data(data_curr_month) 60公分
#将读⼊的数据进⾏标记
if i_month == h_in_sample[0]:
data_in_sample = data_curr_month
el:
data_in_sample = data_in_sample.append(data_curr_month)
print('数据读取完成')
#5数据预处理
X_in_sample = data_in_sample.loc[:,'货币资⾦(万元)':'应收分保账款(万元)']
y_in_sample = data_in_sample.loc[:,'return_bin'] #从样本内数据中分别提取特征与标签因⼦
X_train,X_cv,y_train,y_cv = train_test_split(X_in_sample,y_in_sample,test_size=para.percent_cv, random_state=para.ed)#按照固定⽐例随机分配训练集与交叉验证集
pca = decomposition.PCA(n_components=0.95)
pca.fit(X_train)
X_train = ansform(X_train)
X_cv = ansform(X_cv) #以上是关于主成分分析模型的代码
print('数据预处理完成')
代码的基本功能注释⾥也写了⼀些,不过不够全⾯,我再详细说⼀下。这三部分代码所实现的功能是读取数据,并对数据进⾏预处理。我已经把最原始的数据整理好放在了excel表格⾥,并且将第⼀个⽉的全部股票的参数放在⼀个excel⾥,并将其命名为1.csv,以此类推,我爬取了157个⽉的数据,总共有157个excel。因此代码⾥循环的便是excel的⽂件名,也就是依次读取excel⽂件。因为数据量太⼤,所以我⼀般调试的时候只跑12个⽉。所以我在参数初始化阶段,训练集(1,8),测试集(8,12)。
将数据读取到DataFrame表格⾥后,并不是全部使⽤,⽽是取超额收益值最好的前百分之三⼗,以及最差的后百分之三⼗,并在表格后追加⼀列,列名叫return_bin,将最好最差的百分之三⼗的股票的return_bin列各赋值1,0。然后将每个读取并加⼯的excel表格拼接在⼀起形成⼀个⼤表格,从总抽取70个因⼦作为X_in_sample,抽取return_bin作为y_in_sample作为训练集。
训练模型
#6
print('选择模型')
hod == 'SVM':
model = svm.SVC(kernel=para.svm_kernel, C=para.svm_c)
print('模型选择为SVM')
#7⽤训练好的模型分别放到训练集和验证集上去预测,⽤来调参
print('模型开始训练')
hod == 'SVM':
model.fit(X_train, y_train)
y_pred_train = model.predict(X_train)
y_score_train = model.decision_function(X_train)
y_pred_cv = model.predict(X_cv)
y_score_cv = model.decision_function(X_cv)
print('模型训练结束')
这个也⽐较好理解,就是选择sklearn库⾥的svm模块对数据进⾏训练。svm模型是集成封装好的,拿来⽤就可以。
模型预测与评价
#8使⽤训练完成的模型再测试集上做预测
print('模型预测开始')
y_true_test = pd.DataFrame([np.nan] * np.ones((para.n_stcok, h_test[-1])))
y_pred_test = pd.DataFrame([np.nan] * np.ones((para.n_stcok, h_test[-1])))
y_score_test = pd.DataFrame([np.nan] * np.ones((para.n_stcok, h_test[-1]))) #先对各种参数做⼀个初始化
print(y_true_test)
for i新冠英语作文
_month h_test: #遍历测试集的每⼀个⽉份,每个
⽉份都有上市的所有股票 file_name = para.path_data + str(i_month) + '.csv' #读取预测集上的数据
data_curr_month = pd.read_csv(file_name, header=0)
data_curr_month = data_curr_month.dropna(axis=0)
X_curr_month = data_curr_month.loc[:,'货币资⾦(万元)':'应收分保账款(万元)']
X_curr_month = ansform(X_curr_month)
hod == 'SVM':
y_pred_curr_month = model.predict(X_curr_month)居住证明
y_score_curr_month = model.decision_function(X_curr_month)
y_true_test.iloc[data_curr_month.index, i_month - 1] = data_curr_month['超额收益'][data_curr_month.index]
y_pred_test.iloc[data_curr_month.index, i_month - 1] = y_pred_curr_month
y_score_test.iloc[data_curr_month.index, i_month - 1] = y_score_curr_month
print(y_true_test)
print('模型预测结束')
#9模型评价
print('模型开始评价')
print('training t, accuracy = %.2f'%metrics.accuracy_score(y_train, y_pred_train))
print('training t, ACU = %.2f'%_auc_score(y_train, y_score_train))
print('cv t, accuracy = %.2f'%metrics.accuracy_score(y_cv, y_pred_cv))
print('cv t, ACU = %.2f'%_auc_score(y_cv, y_score_cv))
for i_month h_test:
y_true_curr_month = pd军队英语
.DataFrame({'超额收益':y_true_test.iloc[:, i_month - 1]})
y_pred_curr_month = y_pred_test.iloc[:,i_month - 1]
y_score_curr_month = y_score_test.iloc[:,i_month - 1]
y_true_curr_month = y_true_curr_month.dropna(axis=0)
y_curr_month = label_data(y_true_curr_month)['return_bin']
y_pred_curr_month = y_pred_curr_month[y_curr_month.index]
y_score_curr_month = y_score_curr_month[y_curr_month.index]
print('test t, month %d, accuracy = %.2f'%(i_month, metrics.accuracy_score(y_curr_month, y_pred_curr_month)))
print('test t, month %d, AUC = %.2f'%(i_month, _auc_score(y_curr_month, y_score_curr_month)))
print('模型评价结束')