使用autoencoder技术提取特征并降维
考虑到在针对股票市场的预测模型中的变量过多/维数过高问题,我们需要降维。这里我们使用autoencoder技术(AE)
首先本文使用调用tushare库提取股票历史数据。
pip install tushare
#获取使用接口
def get_token():
ts.set_token("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
pro=ts.pro_api()
return pro
##获取数据列表
def get_data_list(cursor,sql,conn):
cursor.execute(sql)
res=cursor.fetchall()
conn.commit()
ts_codes_list=list(res)
ts_codes_list=[",".join(list(x)) for x in ts_codes_list]
return ts_codes_list
##获取数据
def get_data(ts_codes_list,pro):
daily=pd.DataFrame(columns=["ts_code","trade_date","open","close","high","low","volume"]) ##获取相应的列信息
for i in range(0,len(ts_codes_list),100):
j=i+100
if(j>=len(ts_codes_list)):
j=len(ts_codes_list)
name=",".join(ts_codes_list[i:j])
part= pro.daily(ts_code=name, trade_date=get_date())[["ts_code","trade_date","open","close","high","low","volume"]]
daily=pd.concat([daily,part],ignore_index=True)
daily["trade_date"]=daily["trade_date"].apply(get_date_format)
return daily
使用stockstats库进行对OHCLV的转换。
```python
from stockstats import StockDataFrame as Sdf
df = data.copy()
df = df.sort_values(by=['tic','date'])
stock = Sdf.retype(df.copy())
unique_ticker = stock.tic.unique()
for indicator in self.tech_indicator_list:
indicator_df = pd.DataFrame()
for i in range(len(unique_ticker)):
try:
temp_indicator = stock[stock.tic == unique_ticker[i]][indicator]
temp_indicator = pd.DataFrame(temp_indicator)
temp_indicator['tic'] = unique_ticker[i]
temp_indicator['date'] = df[df.tic == unique_ticker[i]]['date'].to_list()
indicator_df = indicator_df.append(
temp_indicator, ignore_index=True
)
except Exception as e:
print(e)
df =df.merge(indicator_df[['tic','date',indicator]],on=['tic','date'],how='left')
df = df.sort_values(by=['date','tic'])
接下来是把OHCLV data与金融技术指标进行归一化并转化为tensor的格式
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
dd1 = sc.fit_transform(data[list])
dd1= torch.from_numpy(dd1)
这里我们使用sequitur库进行特征提取
import torch
from sequitur.models import LINEAR_AE
from sequitur.models import LSTM_AE
from sequitur import quick_train
##########进行训练
encoder, decoder, _, losses = quick_train(LINEAR_AE, dd1, encoding_dim=2, lr=1e-3, epochs=100,denoise=True)
encoding_dim表示降维后的特征数,denoise代表是否加噪音,从而提升提取特征的鲁棒性。
test = encoder(dd1)
此时encoder就是用来输出提取的特征。
这便是全部过程。