1、简介
? ?背景:针对均值-方差模型的局限性,利用启发式函数链神经网络预测得到的收益率替代历史数据。 ? ?工作原理:构建PSO_FLNN预测模型,PSO算法用来优化FLNN中个体的权重参数,FLNN用来对输入的个体预测其对应的周收益值。
2、具体预测过程
(1)FLNN函数链神经网络 ? ?它是单层神经网络,通过非线性函数(如切比雪夫函数)对特征进行拓展,输入后,经过加权求和,通过relu激活函数得到输出值。结构简单,计算负担小,效果好,比MLP计算复杂度更小。 (2)启发式FLNN股票周收益预测步骤 ? ?预测周收益的步骤:样本特征拓展;训练模型,得到最优粒子;在测试集上进行验证。 ? ?切比雪夫递归拓展特征:特征维度D为拓展为5D维。 ? ?PSO优化FLNN的权重参数:种群中的粒子围绕搜索空间移动以寻找最佳位置。得到各个粒子对应的适应度值,即均方误差值,选择其中均方误差最小的粒子作为最佳粒子,下次迭代前,根据该最佳粒子对种群粒子速度和权重值(即位置)进行更新。经过k次迭代后,比较出得到最佳粒子。(粒子在PSO种群中的位置由5D个随机权重组成,每个随机权重值位于0和1之间) ? ?如何预测:最佳粒子就是该样本对应的权重参数向量。在测试集上进行测试。结果满意的话,便可以利用该模型预测该股票的周收益。预测哪周,则将该周的特征值求出后,与参数加权求和后输入relu函数max(0,wx+b),得到预测值。 (3)如何进行超参数调优 ? ?哪些参数: ? ?惯性因子w(0.4-0.9之间,调整全局和局部搜索,为非负,大的话全局强,小局部强,一般采用动态w比如说线性递减权值,), ? ?学习因子c1,c2(0~4之间,通常为2,代表粒子向自身极值pbest和全局极值gbest推进的加速权值。), ? ?群体规模N(100或,200), ? ?最大迭代次数100-200, ? ?最大速度Vmax。 ? ?调优方法 ? ?交叉验证参数选择:各个参数确定变化的步长,然后使用网格法交叉验证参数选择。最后确定w=0.725,学习因子为2,最大速度Vmax决定粒子每一次的最大移动距离(一般为相应维搜索空间的10%~20%),群体规模为200,迭代次数为200。 ? ?步长如何确定:可以使用最优化理论中的Wolf-Powell搜索、Amijo搜索选取步长。 ? ?过Powell等方法为了找到最优的超参数,这些方法往往要尝试很多组值,每一次尝试都要重新做一次训练,时间成本很高,且并不总是可预测。很多时候我们并不需要挤干hyperparameters中的水分,这时候就随便选几个值,挑个不错的就好啦,当然这不是很严谨。
import pandas as pd
import os
from model import Model
file_dir = r'data\100只股票三维特征数据集合'
def file_name(dir):
for root, dirs, files in os.walk(dir):
file_list_temp = files # 当前路径下所有非目录子文件
return file_list_temp
file_list = file_name(file_dir)
print(file_list)
security_code = []
for i in file_list:
i = i[0:9]
security_code.append(i)#这时140股票的代码集合
print(security_code)
#现仅用600345.SH进行测试,全测试可令stock = security_code
stock = ['600345.SH.csv']
for i in range(len(stock)):
csv_file = r"data\100只股票三维特征数据集合\%s"%(stock[i])
csv_data = pd.read_csv(csv_file)
print(stock[i])
dt = csv_data.drop(['Unnamed: 0','周数'],axis=1)
train_idx = 140
test_idx = 52
model = Model(dt.values, train_idx, test_idx) # .values把dataframe转化为矩阵
pre_value = pd.DataFrame(model.train())
pre_value.to_csv(r'data\100只股票预测收益集合\%s.csv'%(file_list[i][0:9]))
|