# 指数夏普 VS 相关矩阵：多场景数据模型

• 与压力市场相关的相关矩阵
• 与反弹市场相关的相关矩阵
• 与正常市场相关的相关矩阵

CorrGAN：比较基于网络和最小方差的投资组合

import sys
from random import randint
import pandas as pd
import numpy as np
import fastcluster
from scipy.cluster import hierarchy
from scipy.stats import rankdata
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt

df = pd.read_csv('data/SP500_HistoTimeSeries.csv')

df['Date'] = pd.to_datetime(df['Date'], infer_datetime_format=True)

df.index = df['Date']
del df['Date']
df = df.sort_index()

returns = df.pct_change(periods=1)

dim = 100
tri_a, tri_b = np.triu_indices(dim, k=1)



corr_vs_sharpe = []
stressed_mats = []
stressed_count = 0
rally_mats = []
rally_count = 0
normal_mats = []
normal_count = 0
for loop in range(20000):
try:
t_idx = randint(0, len(returns) - 252)

period_returns = returns.iloc[t_idx:(t_idx + 252)]

rmv = 0
for col in period_returns.columns:
if len(period_returns[col].dropna()) < 252:
rmv += 1
del period_returns[col]
rmv, period_returns.shape

idx = list(np.random.choice(len(period_returns.columns), dim,
replace=False))

period_returns[period_returns.columns[idx]].dropna().shape

corr = period_returns[
period_returns.columns[idx]].dropna().corr().values
corr.mean()

mean_return = (period_returns[period_returns.columns[idx]]
.dropna()
.mean(axis=1)
.mean() * 252)
vol = (period_returns[period_returns.columns[idx]]
.dropna()
.mean(axis=1)
.std() * np.sqrt(252))
sharpe = mean_return / vol

dist = 1 - corr
Z = fastcluster.linkage(dist[tri_a, tri_b], method='ward')
permutation = hierarchy.leaves_list(
hierarchy.optimal_leaf_ordering(Z, dist[tri_a, tri_b]))
prows = corr[permutation, :]
ordered_corr = prows[:, permutation]

corr_vs_sharpe.append([corr.mean(), sharpe])

if sharpe < -0.5:
stressed_mats.append(ordered_corr)
np.save('stressed_mats/mat_{}.npy'.format(stressed_count),
ordered_corr)
stressed_count += 1
elif sharpe > 2:
rally_mats.append(ordered_corr)
np.save('rally_mats/mat_{}.npy'.format(rally_count),
ordered_corr)
rally_count += 1
else:
normal_mats.append(ordered_corr)
np.save('normal_mats/mat_{}.npy'.format(normal_count),
ordered_corr)
normal_count += 1

if loop < 10:
plt.figure(figsize=(20, 8))
plt.subplot(1, 2, 1)
plt.plot((1 + period_returns[
period_returns.columns[idx]]
.dropna().mean(axis=1)).cumprod())
plt.title("sharpe: " + str(np.round(sharpe, 2)))

plt.subplot(1, 2, 2)
plt.pcolormesh(ordered_corr)
plt.colorbar()
plt.title("mean corr: " + str(np.round(corr.mean(), 2)))
plt.show()
except:
pass


• 0.25（低）
• 0.34（均值）
• 0.5（高)
corr_vs_sharpe = np.array(corr_vs_sharpe)

plt.figure(figsize=(20, 6))
plt.subplot(1, 2, 1)
plt.hist(corr_vs_sharpe[:, 1], bins=100)
plt.title('Distribution of Sharpe')

plt.subplot(1, 2, 2)
plt.hist(corr_vs_sharpe[:, 0], bins=100)
plt.title('Distribution of Mean Correlation')
plt.show()


plt.figure(figsize=(20, 6))
plt.subplot(1, 2, 1)
plt.scatter(corr_vs_sharpe[:, 0], corr_vs_sharpe[:, 1])
plt.xlabel('mean corr')
plt.ylabel('sharpe')

plt.subplot(1, 2, 2)
plt.scatter(rankdata(corr_vs_sharpe[:, 0]),
rankdata(corr_vs_sharpe[:, 1]))
plt.xlabel('rank mean corr')
plt.ylabel('rank sharpe')
plt.show()


len(stressed_mats), len(rally_mats), len(normal_mats)

(1004, 3091, 15897)


for i, mat in enumerate(stressed_mats):
plt.pcolormesh(mat)
plt.colorbar()
plt.title(round(mat.mean(), 2))
plt.show()

if i > 5:
break


for i, mat in enumerate(rally_mats):
plt.pcolormesh(mat)
plt.colorbar()
plt.title(round(mat.mean(), 2))
plt.show()

if i > 5:
break


stressed_corr_coeffs = []
for mat in stressed_mats:
stressed_corr_coeffs.extend(list(mat[tri_a, tri_b]))

rally_corr_coeffs = []
for mat in rally_mats:
rally_corr_coeffs.extend(list(mat[tri_a, tri_b]))

normal_corr_coeffs = []
for mat in normal_mats:
normal_corr_coeffs.extend(list(mat[tri_a, tri_b]))

nbins = 500
plt.figure(figsize=(15, 6))
plt.hist(normal_corr_coeffs, bins=nbins, alpha=1,
label='normal: $-0.5 \leq$ sharpe $\leq 2$',
density=True, log=False)
plt.axvline(x=np.mean(normal_corr_coeffs), color='b',
linestyle='dashed', linewidth=2)
plt.hist(stressed_corr_coeffs, bins=nbins, alpha=0.8,
label='stressed: sharpe < -0.5',
density=True, log=False)
plt.axvline(x=np.mean(stressed_corr_coeffs), color='r',
linestyle='dashed', linewidth=2)
plt.hist(rally_corr_coeffs, bins=nbins, alpha=0.6,
label='rally: 2 < sharpe',
density=True, log=False)
plt.axvline(x=np.mean(rally_corr_coeffs), color='g',
linestyle='dashed', linewidth=2)
plt.legend()
plt.show()


0 条评论

• ### 寻找最优持仓期的开盘缺口盈利交易策略基于Matlab

翻译整理 Watermelon 前言 很多投资者经常讨论股价的预测，基本面的消息等等。当我们在说这些的时候，其实，这些（我把它们归结为算法）算法的核心就是触发识...

• ### 使用CorrGAN：比较基于网络和最小方差的投资组合（附代码）

许多经济物理学家已经注意到，利用股票（或其他资产）收益估计的经验相关矩阵构建的网络leaves的投资组合，与对同一股票估计的经验协方差进行最小方差优化所得到的投...

• ### 超火动态价格面积图：手把手教你！

近日，公众号推出了一篇名为《超火动态排序图：代码不到40行，手把手教你！》的文章，反向十分强烈。各大公众号进行的了转载，知乎也是有400+的点赞。

• ### 币聪早报：比特币哈希率在单日内突破1000万TH/s，比特大陆S11开启测试？

尽管最近比特币价格走势疲软，但比特币挖掘的网络哈希率在过去两天突然大幅上涨。这种增加使其达到令人难以置信的每秒6200万terahashes。仅仅两天前，该网络...

• ### Mysql查询一段时间记录

\$sql="SELECT video_id,count(id)as n FROM rec_down WHERE UNIX_TIMESTAMP(NOW())-UN...

• ### matplotlib 入门（一）

matplotlib中的pyplot子模块，包含了一系列命令风格的函数，能使matplotlib像MATLAB的绘图命令那样的方式工作。

• ### Python数据处理从零开始----第四章（可视化）（3）目录正文

plt.scatter相对于plt.plot的主要优势在于，前者在创建散点图时具有更高的灵活性，可以单独控制每个散点与数据匹配，也可以让每个散点具有不同的属性（...

• ### 15 种最常用的 matplotlib 可视化图表（附 Python 源码）

开始练习之前，首先你需要安装 matplotlib。实验楼为大家提供了已经安装好了各个模块的实验环境，推荐直接来实验楼练习。

• ### 【数据分析与可视化】matplotlib简单绘图之subplot

[<matplotlib.lines.Line2D at 0x116769150>]

• ### 我的机器学习matplotlib篇导入画出第一个图形颜色，标记，线型刻度、标题、标签和图例!创建子图

前言： matplotlib是python最常用的绘图库，能帮你画出美丽的各种图 导入 包含了中文显示，屏外显示 import matplotlib.p...