量化交易全流程(七)

news2024/11/16 17:46:23

本节目录

资金分配

实盘交易

vn.py框架

我将重点介绍资金分配的基础模型和实现。当然,这里介绍的模型是最基础的模型,现实实践中往往并不能直接使用。因为后续我将加入机器学习和深度学习在量化交易领域中的应用。

现代 / 均值——方差资产组合理论

现代资产组合理论(Modern Portfolio Theory,MPT)是金融理论的重要基础。这一理论是由马克威茨(Harry Markowitz)首先提出的,因为这一理论,马克威茨荣获了1990年的诺贝尔经济学奖。
尽管这种方法早在20世纪50年代就已提出,但时至今日仍然是应用广泛。大量的投资组合理论都衍生于这个基本原理。均值﹣方差理论的核心思想是同时考察资产组合的预期收益和风险。研究当我们有一系列可选资产的时候,应如何对其配置资金权重,从而可以得到最好的收益风险比?本节将简单介绍均值﹣方差的基本理论以及Python的具体实现。

 MPT理论简介: 要实现MPT理论,我们需要做如下几个基本假设。
□ 假设资产的收益率符合正态分布。
□假设资产的预期收益率可以用历史收益率进行估计。
□假设资产的风险可以用资产收益率的方差(标准差)进行估计。
假设有n种资产,资产i的资金分配权重为w,所有资金的权重和为1,也就是:\sum_{i}^{n}w_i=1

假设资产i收益率为r_i,那么组合收益率为:

\mu_p=E(\sum_{N}^{}w_ir_i)=\sum_{I}^{}w_i\mu_i=w^T\mu

为了得到组合的预期风险(方差),我们需要先计算协方差矩阵,由各个资产之间协方差组成。

利用投资组合协方差矩阵,我们可以得到投资组合的方差公式:

\delta ^2_p=E(r-\mu)^2=w^T\sum w

为了简单起见,我们假定无风险利率,即r_f=0。现在我们可以得到整个组合的夏普比率:

SR=\frac{(\mu_p-r_f)}{\delta_p}=\frac{(\mu_p)}{\delta_p}

现在我们的目标就是优化权重 w,获得尽可能大的夏普比率,即SR最大。

随机权重的夏普比率

在实际交易中,我们分配资金的对象往往是策略,而不是单纯地持有某种资产。先导入常见的模块,随机选择5只股票的收盘价进行计算得到日收益率,代码如下:

import mysql.connector
import pymysql
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

stock_codes = ['000001','000002','000004','000005','000006']
start_date = '20220904'
end_date = '20230904'
dt=pd.DataFrame()
conn=pymysql.connect(host = '127.0.0.1' # 连接名称,默认127.0.0.1
,user = 'root' # 用户名
,password='152617' # 密码
,port= 3306 # 端口,默认为3306
,db='stock_info' # 数据库名称
,charset='utf8' # 字符编码
)
cur = conn.cursor() # 生成游标对象
for stock_code1 in stock_codes:
        sql= "select * from `stocks` where stock_code = " + stock_code1 + " and date > " + start_date + " and date < " + end_date  # SQL语句
        cur.execute(sql) # 执行SQL语句
        data = cur.fetchall() # 通过fetchall方法获得数据
        df = pd.DataFrame(data)
        dt = pd.concat([dt,df],axis=0)
# print(df.head())
cur.close() # 关闭游标
conn.close() # 关闭连接
dt

对数据处理:

dt.columns= ['date','code','open','high','low', 'close','volumes'] # 修改列名
dt = dt[['date','code','close']]
print(dt)
d=dt
# 分组计算收益率
code_grouped = d.groupby('code')
returns = code_grouped['close'].pct_change()

# 合并到原始数据中
d['returns'] = returns
d = d.dropna()
print(d)
df_new = d.pivot(index='date', columns='code', values='returns')
df_new.columns=['s1','s2','s4','s5','s6']
print(df_new)
df_new = df_new.astype(float)
df_new.plot()
# 计算年化收益率,假设一年252交易日
df_new.mean() * 252

得到的结果如图:

计算协方差矩阵:

df_new.cov() * 252

下面随机生成一组资金权重:

n=len(df_new.columns)
w=np.random.random(n)
w=w/np.sum(w)

基于这组权重,我们可以得到投资组合的收益率和波动率。这里使用了NumPy的dot函数进行矩阵的乘法,代码如下:

# 投资组合收益率
p_ret= np.sum(df_new.mean()*w)*252
# 投资组合波动率
p_vol=np.sqrt(np.dot(w.T,np.dot(df_new.cov()*252,w)))

以上是针对一组资金权重w得到的收益率和波动率。

现在我们要找出一组权重,这组权重对应着最佳的收益风险比。首先,我们需要随机生成大量的权重,计算对应的投资组合收益率和波动率,进行初步观察,代码如下:

n=len(df_new.columns)
# 保存一系列权重对应的投资组合收益率
p_rets=[]
# 保存一系列权重对应的投资组合波动率
p_vols=[]
# 随机生成10000组权重
for i in range(10000):
    w=np.random.random(n)
    w/=np.sum(w)
    # 投资组合收益率
    p_ret= np.sum(df_new.mean()*w)*252
    # 投资组合波动率(需要注意的是,使用 np 生成的一维数据,实际上是N*1 矩阵,而不是1*N矩阵)
    p_vol=np. sqrt (np.dot (w.T,np.dot (df_new.cov() *252, w)))
    p_rets.append (p_ret)
    p_vols.append (p_vol)
p_rets=np.array (p_rets)
p_vols=np.array (p_vols)

在以上的代码中,我们得到了10000 个随机权重对应的收益率和波动率,现在将其绘制成图,代码如下:

plt.figure(figsize=(10,6))
plt.scatter(p_vols, p_rets, c=p_rets/p_vols,marker='o')
plt.grid(True)
plt.xlabel ('volatility')
plt.ylabel('return')
plt.colorbar (label='Sharpe ratio')

不同权重对应的收益率和波动率(夏普比率)如图所示:

在上图中,x轴对应着波动率,y轴对应着收益率。我们可以观察到,并不是所有的权重都能有良好的表现。对于固定的风险水平(比如0.25),不同的组合有着不同的收益,同时存在着一个权重,可以有最好的收益(大概是0.23)。作为投资者,最关心的是固定风险水平下收益率的最大化,或者是固定收益率下风险的最小化,也就是所谓的有效边界

最大化夏普比率

现在我们要找出使投资组合拥有最大夏普比率的资金权重。这是一个包含约束的最优化问题,首先需要建立一个函数,计算组合的夏普比率:

def portfolio_stat(weights):
    '''
    获取投资组合的各种统计值参数:
    weights:分配的资金权重
    返回值:
    P_ret:投资组合的收益率
    P_vol:投资组合的波动率
    P_sr:投资组合的夏普比率
    注意:rets是全局变量,在函数外部定义
    '''
    w = np.array (weights)
    p_ret = np.sum(rets.mean() * w)*252
    P_vol = np.sqrt (np.dot (w.T, np.dot(rets.cov()*252, w)))
    p_sr = p_ret/p_vol
    return np.array([p_ret, p_vol, p_sr])

这里定义了一个函数,输入是权重,输出是收益率、波动率和夏普比率。需要注意的是,函数内部使用的收益率数据rets是全局变量,由外部定义。
下面就来定义优化的目标函数,代码如下:

def min_func_sharpe(weights):
    # 优化的目标函数,最小化夏普比率的负值,即最大化夏普比率
    return -portfolio_stat(weights)[2]

该函数返回了夏普比率的负值,换句话说,我们需要对该函数进行最小化操作。之所以使用这种形式,是因为scipy.optimization 只有 minimize 函数(机器学习中优化目标通常是最小化损失函数),所以这里使用了这种看起来有点奇怪的形式。
为了进行优化,我们需要使用scipy.optimize模块,代码如下:

import scipy.optimize as sco
# 有n个变量
rets = df_new
n = len(rets.columns)
# 优化的约束条件:资金的权重和为1
cons=({'type':'eq','fun':lambda x:np.sum(x)-1})
bnds=tuple((0,1) for x in range(n))
# 生成初始权重
w_initial = n*[1./n,]
opts_sharpe = sco.minimize(min_func_sharpe, w_initial, method='SLSQP',bounds=bnds,constraints=cons)
opts_sharpe

最后的 opts_sharpe 就是我们优化的结果。


查看message 我们知道已成功优化。fun对应着优化后的函数值,也就是说,夏普比率为-3.1(有点惊人),对应的权重就是x的值。示例代码如下:

opts_sharpe['x'].round(2)

输出结果如下:

可以看到,除了s4权重为1,其他的都是0。这很明显,因为有三个策略的预期收益率是负值,权重置为0当然是最好的选择,s4和s6相比当然是把所有权重都给s4。

Black-Litterman 资金分配模型

MPT的优化矩阵算法

前面讲述了最大化夏普比率的具体操作流程,但仍有几个问题尚待解决。
为什么最大化夏普比率所带来的投资组合就是最优资金分配,最优的含义是什么?
即使最大化夏普比率所得到的组合的确是最优的,那么在生成的有效边界(efficient frontier)上是否还存在其他的投资组合收益,使得其风险收益比优于最大化夏普比率所带来的投资组合?
另外,投资者的效用函数是异质性的,那么最大化夏普比率对投资者的效用函数是否具有异质性表现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1074166.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高级工技能等级认定理论部分 看了就过关

4 理论一_职业道德 4.1职业道德基本知识 4.1.1练习 4.2职业守则 4.2.1练习1 4.2.1练习2 5 理论二 _基础知识 5.1 法律责任 5.1.1 练习1 5.1.2 练习2 5.1.3 练习3 5.2 基础知识 5.2.1 练习1 5.2.2 练习2 5.2.3 练习3 5.2.4 练习4 6 理论三_网络与信息安全防护 6.1 网络相…

部署企业级ChatGPT,将AI整合进工作

引言 3月份AI应用大爆发催生了国内大量需求。 然而&#xff0c;所有的需求都不可避免得遇到很多非技术性的问题&#xff1a; 部署开源模型的成本巨大&#xff0c;且效果成谜&#xff0c;65B的模型推理应用最少需要130G显存&#xff0c;而微调训练则需要额外添加8倍的资源。 …

基于YOLO的BIM对象检测

我在此过程中使用的 BIM 数据集取自澳大利亚卫生设施指南。 该数据集包含一组房间数据表和房间布局表&#xff0c;旨在提供典型房间类型的合规示例&#xff0c;并减少规划和设计这些房间时“重新发明轮子”的需要。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、合…

23.5 Bootstrap 框架6

1. 表单布局 部分表单类名介绍: * 1. form-label: 表单标签样式类, 用于定义表单的标签样式. * 2. form-control: 表单控件样式类, 用于定义输入框, 文本域等表单元素的样式.表单元素<input>, <textarea>, <select>在使用.form-control类的情况下, 宽度都是…

取消激光雷达/不升级Orin,小鹏P5改款背后的行业「痛点」

9月25日&#xff0c;小鹏汽车正式发布了旗下改款车型—2024款小鹏P5&#xff08;15.69-17.49万元&#xff09;。车型精简、降本增效&#xff08;减配&#xff09;成为新亮点。 在配置变化方面&#xff0c;智驾成为牺牲品。其中&#xff0c;高配Pro车型继续保留英伟达Xavier&…

Cpolar内网穿透工具在windows和Linux上具体使用

Cpolar内网穿透工具在windows和Linux上具体使用 一、Linux上部署的项目通过内网穿透实现外网访问项目二、Windows上部署的项目通过内网穿透实现外网访问项目 一、Linux上部署的项目通过内网穿透实现外网访问项目 一个免费的内网穿透方式&#xff0c;简单方便。 网址&#xff1a…

MyBatisPlus(十六)逻辑删除

说明 实际生产中的数据&#xff0c;一般不采用物理删除&#xff0c;而采用逻辑删除&#xff0c;也就是将一条记录的状态改为已删除。 逻辑删除&#xff0c;本质上是更新操作。 MyBatis Plus 框架&#xff0c;提供了逻辑删除功能。在配置了逻辑删除后&#xff0c;增删改查和统…

设计模式 - 状态模式

目录 一. 前言 二. 实现 一. 前言 状态模式&#xff08;State Pattern&#xff09;&#xff1a;它主要用来解决对象在多种状态转换时&#xff0c;需要对外输出不同的行为的问题。状态和行为是一一对应的&#xff0c;状态之间可以相互转换。当一个对象的内在状态改变时&#x…

超越React,JS代码体积减少90%!它为何是2023年最好的Web框架?

说到Web框架&#xff0c;大家最先想到的可能是 Vue、React&#xff0c;或者是Next.js。但不得不提&#xff0c;有个后起之秀“来势汹汹”&#xff0c;1.0版本发布至今仅一年&#xff0c;就出尽风头。它就是Astro。 Astro 是什么&#xff1f;一个现代化的静态站点生成器和前端框…

nginx反向代理实例

一、代理模式 如果域名没有备案&#xff0c;访问国内的云主机时&#xff0c;会被防火墙拦截&#xff0c;但是如果先解析到香港主机&#xff0c;然后反向代理到国内的云主机&#xff0c;就可以绕过备案访问了。 香港服务器可以在亿速云购买&#xff0c;域名可以在阿里云购买&a…

3.3.OpenCV技能树--二值图像处理--图像形态学操作

文章目录 1.图像形态学运算简介2.图像开运算处理2.1.图像开运算处理简介2.2.图像开运算处理代码2.3.图像开运算处理效果 3.图像闭运算处理3.1.图像闭运算处理简介3.2.图像闭运算处理代码3.3.图像闭运算处理效果 4.图像形态学梯度处理4.1.图像形态学梯度处理简介4.2.图像形态学梯…

网康 NS-ASG安全网关存在远程命令执行漏洞 复现

文章目录 网康 NS-ASG安全网关存在远程命令执行漏洞 复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 网康 NS-ASG安全网关存在远程命令执行漏洞 复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技…

基于SpringBooy的安康旅游网站的设计与实现

目录 前言 一、技术栈 二、系统功能介绍 登录模块的实现 景点信息管理界面 酒店信息管理界面 特产管理界面 游客管理界面 景点购票订单管理界面 系统主界面 游客注册界面 景点信息详情界面 酒店详情界面 特产详情界面 三、核心代码 1、登录模块 2、文件上传模块…

Nginx + PHP 异常排查,open_basedir 异常处理

新上一个网站&#xff0c;通过域名访问失败&#xff0c;排查方法如下&#xff1a; 开启异常日志 开启域名下&#xff0c;nginx的异常日志&#xff0c;并查看日志 tail -f /var/log/nginx/nginx.localhost.error.log开启php的异常日志&#xff0c;该配置位于php.ini文件下 …

Java 21:虚拟线程介绍

Java 21 版本更新中最重要的功能之一就是虚拟线程 (JEP 444)。这些轻量级线程减少了编写、维护和观察高吞吐量并发应用程序所需的工作量。 正如我的许多其他文章一样&#xff0c;在推出新功能之前&#xff0c;让我们先看看 Java 21 版本更新前的现状&#xff0c;以便更好地了解…

Denoising Score Matching (DSM) 去噪得分匹配模型变分推理(VAE)退火郎之万动力学

Denoising Score Matching——DSM 有没有谁通俗的讲一下Denoising score matching? Denoising Score Matching (DSM) 论文 << A Connection Between Score Matching and Denoising Autoencoders>> 作者是将denoising autoencoder和score mathching 联系在了一起…

图像处理与计算机视觉--第七章-神经网络-单层感知器

文章目录 1.单层感知器原理介绍2.单层感知器算法流程3.单层感知器算法实现4.单层感知器效果展示5.参考文章与致谢 1.单层感知器原理介绍 1.单层感知器是感知器中最简单的一种&#xff0c;有单个神经元组成的单层感知器只能用于解决线性可分的二分性问题2.在空间中如果输入的数据…

《spring security in action》读书笔记

1. why spring security 是强大的高度可定制的 身份验证 和 访问控制 应用级框架。 常见的漏洞包含&#xff1a; 身份验证失效&#xff0c;会话固定&#xff0c;跨站脚本xss请求伪造&#xff0c;CSRF注入敏感数据泄漏缺乏方法访问控制。 身份验证失效&#xff1a; 不能仅仅验…

基于正点原子alpha开发板的第三篇系统移植

系统移植的三大步骤如下&#xff1a; 系统uboot移植系统linux移植系统rootfs制作 一言难尽&#xff0c;踩了不少坑&#xff0c;当时只是想学习驱动开发&#xff0c;发现必须要将第三篇系统移植弄好才可以学习后面驱动&#xff0c;现将移植好的文件分享出来&#xff1a; 仓库&…

一篇讲清楚Java for循环详解

for 语句是应用最广泛、功能最强的一种循环语句。大部分情况下&#xff0c;for 循环可以代替 while 循环、do while 循环。 for 语句是一种在程序执行前就要先判断条件表达式是否为真的循环语句。假如条件表达式的结果为假&#xff0c;那么它的循环语句根本不会执行。for 语句通…