用于回报预测和交易的条件自动编码器

本节主要介绍自编码器在资产定价中的应用。

应用步骤分为:
第一步:创建包含股价和元数据信息的新数据集
第二步:计算预测资产特征
第三步:创建和训练条件式自动编码器架构
第四步:评估结果

part1

数据

from pathlib import Pathimport numpy as np
import pandas as pdfrom statsmodels.regression.rolling import RollingOLS
import statsmodels.api as sm
import matplotlib.pyplot as plt
import seaborn as snsidx = pd.IndexSlice
sns.set_style('whitegrid')results_path = Path('results', 'asset_pricing')
if not results_path.exists():results_path.mkdir(parents=True)

价格数据

prices = pd.read_hdf(results_path / 'data.h5', 'stocks/prices/adjusted')prices.info(show_counts=True)

out:

元数据

metadata = pd.read_hdf(results_path / 'data.h5', 'stocks/info').rename(columns=str.lower)metadata.info()

out:

用元数据选股

sectors = (metadata.sector.value_counts() > 50).indextickers_with_errors = ['FTAI', 'AIRT', 'CYBR', 'KTB']
tickers_with_metadata = metadata[metadata.sector.isin(sectors) & metadata.marketcap.notnull() &metadata.sharesoutstanding.notnull() & (metadata.sharesoutstanding > 0)].index.drop(tickers_with_errors)metadata = metadata.loc[tickers_with_metadata, ['sector', 'sharesoutstanding', 'marketcap']]
metadata.index.name = 'ticker'prices = prices.loc[idx[tickers_with_metadata, :], :]prices.info(null_counts=True)

metadata.info()

close = prices.close.unstack('ticker').sort_index()
close.info()

volume = prices.volume.unstack('ticker').sort_index()
volume.info()


创建周回报

returns = (prices.close.unstack('ticker').resample('W-FRI').last().sort_index().pct_change().iloc[1:])
returns.info()

dates = returns.index
sns.distplot(returns.count(1), kde=False);

with pd.HDFStore(results_path / 'autoencoder.h5') as store:store.put('close', close)store.put('volume', volume)store.put('returns', returns)store.put('metadata', metadata)

因子

MONTH = 21

价格趋势

短期
(一个月累计回报)

dates[:5]

mom1m = close.pct_change(periods=MONTH).resample('W-FRI').last().stack().to_frame('mom1m')
mom1m.info()

mom1m.squeeze().to_hdf(results_path / 'autoencoder.h5', 'factor/mom1m')

股票走势
(截止于月末前一个月的十一个月累积报表)

mom12m = (close.pct_change(periods=11 * MONTH).shift(MONTH).resample('W-FRI').last().stack().to_frame('mom12m'))

走势变化

市场走势

最大回报率

流动性指标和风险度量略。

part2

建模

导入各种包

import warnings
warnings.filterwarnings('ignore')import sys, os
from time import time
from pathlib import Path
from itertools import product
from tqdm import tqdm import numpy as np
import pandas as pdimport matplotlib.pyplot as plt
import seaborn as snsimport tensorflow as tf
from tensorflow.keras.layers import Input, Dense, Dot, Reshape, BatchNormalization
from tensorflow.keras.models import Model
from tensorflow.keras.callbacks import TensorBoardfrom sklearn.preprocessing import quantile_transformfrom scipy.stats import spearmanrsys.path.insert(1, os.path.join(sys.path[0], '..'))
from utils import MultipleTimeSeriesCV, format_timeidx = pd.IndexSlice
sns.set_style('whitegrid')
np.random.seed(42)results_path = Path('results', 'asset_pricing')
if not results_path.exists():results_path.mkdir(parents=True)characteristics = ['beta', 'betasq', 'chmom', 'dolvol', 'idiovol', 'ill', 'indmom','maxret', 'mom12m', 'mom1m', 'mom36m', 'mvel', 'retvol', 'turn', 'turn_std']

数据准备

with pd.HDFStore(results_path / 'autoencoder.h5') as store:print(store.info())


周回报率

data = (pd.read_hdf(results_path / 'autoencoder.h5', 'returns').stack(dropna=False).to_frame('returns').loc[idx['1993':, :], :])

with sns.axes_style("white"):fig, axes = plt.subplots(ncols=2, figsize=(14, 4))sns.distplot(nobs_by_date, kde=False, ax=axes[0])axes[0].set_title('# of Stocks per Week')axes[0].set_xlabel('# of Observations')sns.boxplot(x='Characteristic',y='# Observations',data=nobs_by_characteristic,ax=axes[1],palette='Blues')axes[1].set_xticklabels(axes[1].get_xticklabels(),rotation=25,ha='right')axes[1].set_title('# of Observation per Stock Characteristic')sns.despine()fig.tight_layout()


标准列的特点

data.loc[:, characteristics] = (data.loc[:, characteristics].groupby(level='date').apply(lambda x: pd.DataFrame(quantile_transform(x, copy=True, n_quantiles=x.shape[0]),columns=characteristics,index=x.index.get_level_values('ticker'))).mul(2).sub(1))

模型总结

def make_model(hidden_units=8, n_factors=3):input_beta = Input((n_tickers, n_characteristics), name='input_beta')input_factor = Input((n_tickers,), name='input_factor')hidden_layer = Dense(units=hidden_units, activation='relu', name='hidden_layer')(input_beta)batch_norm = BatchNormalization(name='batch_norm')(hidden_layer)output_beta = Dense(units=n_factors, name='output_beta')(batch_norm)output_factor = Dense(units=n_factors, name='output_factor')(input_factor)output = Dot(axes=(2,1), name='output_layer')([output_beta, output_factor])model = Model(inputs=[input_beta, input_factor], outputs=output)model.compile(loss='mse', optimizer='adam')return modelmodel.summary()

训练模型

关键代码展示(out太长了就不放了)

start = time()
for units, n_factors in param_grid:scores = []model = make_model(hidden_units=units, n_factors=n_factors)for fold, (train_idx, val_idx) in enumerate(cv.split(data)):X1_train, X2_train, y_train, X1_val, X2_val, y_val = get_train_valid_data(data,train_idx,val_idx)for epoch in range(250):model.fit([X1_train, X2_train], y_train,batch_size=batch_size,validation_data=([X1_val, X2_val], y_val),epochs=epoch + 1,initial_epoch=epoch,verbose=0, shuffle=True)result = (pd.DataFrame({'y_pred': model.predict([X1_val,X2_val]).reshape(-1),'y_true': y_val.stack().values},index=y_val.stack().index).replace(-2, np.nan).dropna())r0 = spearmanr(result.y_true, result.y_pred)[0]r1 = result.groupby(level='date').apply(lambda x: spearmanr(x.y_pred,x.y_true)[0])scores.append([units, n_factors, fold, epoch, r0,r1.mean(), r1.std(), r1.median()])if epoch % 50 == 0:print(f'{format_time(time()-start)} | {n_factors} | {units:02} | {fold:02}-{epoch:03} | {r0:6.2%} | 'f'{r1.mean():6.2%} | {r1.median():6.2%}')            scores = pd.DataFrame(scores, columns=cols)scores.to_hdf(results_path / 'scores.h5', f'{units}/{n_factors}')

评估

scores = []
with pd.HDFStore(results_path / 'scores.h5') as store:for key in store.keys():scores.append(store[key])
scores = pd.concat(scores)
scores.info()
avg = (scores.groupby(['n_factors', 'units', 'epoch'])['ic_mean', 'ic_daily_mean', 'ic_daily_median'].mean().reset_index())
avg.nlargest(n=20, columns=['ic_daily_median'])

fig, axes = plt.subplots(ncols=5, nrows=2, figsize=(20, 8), sharey='row', sharex=True)for n in range(2, 7):df = avg[avg.n_factors==n].pivot(index='epoch', columns='units', values='ic_mean')df.rolling(10).mean().loc[:200].plot(ax=axes[0][n-2], lw=1, title=f'{n} Factors')axes[0][n-2].axhline(0, ls='--', c='k', lw=1)axes[0][n-2].get_legend().remove()axes[0][n-2].set_ylabel('IC (10-epoch rolling mean)')df = avg[avg.n_factors==n].pivot(index='epoch', columns='units', values='ic_daily_median')df.rolling(10).mean().loc[:200].plot(ax=axes[1][n-2], lw=1)axes[1][n-2].axhline(0, ls='--', c='k', lw=1)axes[1][n-2].get_legend().remove()axes[1][n-2].set_ylabel('IC, Daily Median (10-epoch rolling mean)')handles, labels = axes[0][0].get_legend_handles_labels()
fig.legend(handles, labels, loc='center right', title='# Units')
fig.suptitle('Cross-Validation Performance (2015-2019)', fontsize=16)
fig.tight_layout()
fig.subplots_adjust(top=.9)
fig.savefig(results_path / 'cv_performance', dpi=300);

part3

生成预测

对一系列似乎能提供良好预测的epochs进行平均。

n_factors = 4
units = 32
batch_size = 32
first_epoch = 50
last_epoch = 80predictions = []
for epoch in tqdm(list(range(first_epoch, last_epoch))):epoch_preds = []for fold, (train_idx, val_idx) in enumerate(cv.split(data)):X1_train, X2_train, y_train, X1_val, X2_val, y_val = get_train_valid_data(data,train_idx,val_idx)model = make_model(n_factors=n_factors, hidden_units=units)model.fit([X1_train, X2_train], y_train,batch_size=batch_size,epochs=epoch,verbose=0,shuffle=True)epoch_preds.append(pd.Series(model.predict([X1_val, X2_val]).reshape(-1),index=y_val.stack().index).to_frame(epoch))predictions.append(pd.concat(epoch_preds))predictions_combined = pd.concat(predictions, axis=1).sort_index()predictions_combined.info()predictions_combined.to_hdf(results_path / 'predictions.h5', 'predictions')


MLAT-Autoencoders---下篇-关键代码及结果展示(3)(终)相关推荐

  1. MLAT-Autoencoders---下篇-关键代码及结果展示(1)

    自编码器的实现(python) 本节主要展示了应用深度前馈.稀疏约束神经网络构建自编码器.另外卷积自编码器对图像进行去噪这一应用也非常实用,将在单独放在下篇展示. 1.导入各类包 from pathl ...

  2. MLAT-Autoencoders---下篇-关键代码及结果展示(2)

    卷积和降噪自编码器 1.导入各种包 from pathlib import Path import pandas as pd import numpy as np from numpy.random ...

  3. 数独项目--关键代码展示:

    关键代码展示: //判断该数字在当前数独是否符合要求 int judge(int num, int ple){ int x = ple / 9; //x表示数字的纵坐标 int y = ple % 9 ...

  4. [2021-CVPR] Jigsaw Clustering for Unsupervised Visual Representation Learning 论文简析及关键代码简析

    [2021-CVPR] Jigsaw Clustering for Unsupervised Visual Representation Learning 论文简析及关键代码简析 论文:https:/ ...

  5. 编写程序描述影视歌三栖艺人 需求说明:请使用面向对象的思想,设计自定义类,描述影视歌三梄艺人。 实现思路及关键代码 1)分析影视歌三栖艺人的特性 a)可以演电影 b)可以演电视剧 c)可以唱歌

    编写程序描述影视歌三栖艺人 需求说明:请使用面向对象的思想,设计自定义类,描述影视歌三梄艺人. 实现思路及关键代码 1)分析影视歌三栖艺人的特性 a)可以演电影 b)可以演电视剧 c)可以唱歌 2)定 ...

  6. JAVA 网络聊天程序设计与实现(附关键代码) 可群聊私聊发送图片

    1 需求分析 经分析,本程序是一个C/S结构,使用TCP协议实现聊天功能,需要实现的功能有如下几点. 本程序需要有客户端以及服务器端. 客户端应有良好的交互界面,服务器端应有转发客户端发来的消息和临时 ...

  7. 原生安卓开发app的框架frida常用关键代码定位

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 多情却似总无情,唯觉樽前笑不成. ...

  8. ztree 树怎么写 简单树 关键代码

    只上关键代码,花了我一天半的时间研究,不容易啊!!!!!!!!!!!!!!!!!!!!!!! //******************************************树树树ztree* ...

  9. Ext结合DWR的关键代码(运行成功的DWRProxy)

    关键代码如下: Store为: var ds = new Ext.data.Store({ proxy: new Ext.data.DWRProxy({ callback: Folder.getMes ...

最新文章

  1. 【Linux网络编程】TCP 和 UDP 数据报格式详解
  2. ubuntu18.10无法ping百度
  3. Kubernetes中分布式存储Rook-Ceph的使用:一个ASP.NET Core MVC的案例
  4. python中imread导入失败_ImportError:无法导入加载图像文件所需的Python Imaging Library(PIL)...
  5. java 生成一个空文件系统_如何使用java创建一个空白的PPT文档?
  6. win8安装wampserver报403错误解决方法
  7. 运算符重载为类的成员函数
  8. 目标检测——感受野的学习笔记
  9. python工资这么高为什么不学-小白入行年薪21万,为什么Python岗位薪资越来越高?...
  10. 提高C++运行效率的方法
  11. 央视影音 for Mac 1.2.1 中文版 – CCTV和地方卫视直播软件
  12. 了解Go编译处理(一)—— go tool
  13. 固高运动卡的使用 5 插补运动模式之-直线插补运动
  14. 利用网校源码进行网校系统开发可以解决哪些问题
  15. android+屏幕色彩度,对比度/色阶/色彩 屏幕显示对比_索尼 Xperia Z2_手机Android频道-中关村在线...
  16. Asp.net C#制作PDF文件全攻略
  17. CodeForces 1216CodeForces 1221 A~D
  18. 聊聊从脑神经到神经网络
  19. 碳足迹-ISO14064认证
  20. 基于jsp的电影订票网站的设计与开发

热门文章

  1. 2021-04-10 仿牛客网第六章
  2. Spring : JdbcTemplate操作数据库(详细)
  3. Ambassador系列-09-AuthService认证服务
  4. 方程求解的实验 matlab,matlab 实验四 求微分方程的解
  5. CMake的安装及其简单使用
  6. 6大多人协作工具推荐
  7. 阿龙的下拉菜单demo
  8. 如何让店铺快速靠前排名
  9. w10投影全屏设置_win10投影怎么全屏显示,投影和电脑同时显示
  10. 美国新奥尔良 zip_在新奥尔良启动公开和交互式预算数据