NewQuant的设计(一)——整体的领域设计
NewQuant的设计思路——整体的领域分析
“领域驱动设计(DDD)”是著名软件工程建模专家Eric Evans提出的一个重要概念,是“面向对象分析设计(OOAD)”的深化。当业务逻辑变得复杂,系统变得庞大时,OOAD会使人陷入“只见树木不见树林”的处境,而DDD可以指导设计人员暂时忽略掉琐碎细节,高屋建瓴的观察问题。如果要全面了解DDD,请阅读Eric Evans的著作《领域驱动设计》和《实现领域驱动设计》。
在NewQuant的设计中,DDD的思想给了我很大启发。简单直观地讲,DDD就是仔细的分析业务知识,并把知识对应到相应的软件模块上,把业务中的关键概念对应到软件系统中某些关键的类上。
NewQuant应用DDD的第一步是“确定领域语言”,就是描述NewQuant系统所使用的专业术语。NewQuant的目标是为数据分析和金融工程计算提供高效优雅的解决方案,NewQuant的大部分内容是特定的数值计算方法和数学模型。这样一来,确定领域语言变得简单,可以直接把这些数值计算方法和数学模型作为NewQuant的领域语言。
NewQuant应用DDD的第二步是“领域分析”,具体的领域分析的过程其实是一个“苏格拉底式的追问”,在不断细化不断接近问题实质的追问中明确业务的内容。
先来看“金融工程”模块的分析。金融工程模块是为衍生品等金融产品的定价提供计算服务,金融工程定价的计算存在两大范式,一是模型对应PDE的数值解;二是模型本身的随机模拟(主要是SDE和time series)。PDE的数值解要求对PDE进行离散化得到差分方程,解差分方程的实质是解线性方程组,解线性方程组属于“矩阵计算”范畴,矩阵计算需要设计相应的模块和类来实现。再看随机模拟,无论是SDE和是time series的模拟都是根据模型的结构在递推计算中反复使用特定的随机数,SDE模拟最常用的是正态随机数,time series模拟常用正态和t随机数。由此可以得到两条领域分析的链条:
金融工程——PDE数值解——解方程——矩阵计算
金融工程——随机模拟——SDE&time series——随机数
再来看“数据分析”模块分析。NewQuant中的数据分析方法有两大来源,计量经济和多元统计分析(其实这两个领域的方法有许多相通之处)。计量经济的计算是一个“三部曲”——估计、检验和预测,而计量经济的两大主题是“回归分析”和“时间序列分析”。从计算的角度讲几种常见的回归方法可以认为是“最小二乘(LS)问题”的变种,最小二乘问题则是属于矩阵计算范畴。时间序列模型的估计常用到MLE,MLE属于数值最优化范畴。模型参数的检验实质上是一个特定的“假设检验”问题,需要比较统计量和特定分布分位数的大小。常见的几种统计分布的相关计算实质上是“特殊函数”(Gamma和Beta)计算的变形。模型的预测,尤其是“区间预测”也需要特定分布分位数的计算。和计量经济中的回归模型类似,一些多元统计模型也是玩弄矩阵的把戏,例如主成分分析和因子分析,要对矩阵做分解。另外一些方法则单纯一些,比如K均值聚类和判别分析,只用到距离的计算,不过某些距离计算的方法也要用到矩阵分解计算。由此可以得到若干条领域分析的链条:
数据分析——计量经济——回归——估计——LS问题——矩阵计算
数据分析——计量经济——回归——检验——假设检验——分位数计算——特殊函数
数据分析——计量经济——回归——预测——假设检验——分位数计算——特殊函数
数据分析——计量经济——时间序列——估计——MLE——数值最优化
数据分析——计量经济——时间序列——检验——假设检验——分位数计算——特殊函数
数据分析——计量经济——时间序列——预测——假设检验——分位数计算——特殊函数
数据分析——多元统计——矩阵分解——矩阵计算
通过上述领域分析,可以看出来矩阵计算、统计计算、特殊函数、随机数和数值最优化是NewQuant中最为基础的模块,属于“基础设施层”。其他部分是使用基础模块功能的高级模块,属于“应用层”。这几个基础模块中随机数部分可以直接使用C++标准库中的<random>,只要自己编写一些特殊随机数即可,二其他模块需要自己编写。下面的任务是对每一个具体的模块做分析和设计。
NewQuant的设计(一)——整体的领域设计的更多相关文章
- .net ef core 领域设计代码转换(上篇)
一.前言 .net core 2.0正式版已经发布几个月了,经过研究,决定把项目转移过来,新手的话可以先看一些官方介绍 传送门:https://docs.microsoft.com/zh-cn/dot ...
- julia应用于自动驾驶汽车、机器人、3D 打印、精准医疗、增强现实、基因组学、能源交易、机器学习、金融风控和太空任务设计等多个领域
编程界的新宠 Julia 发布 1.0 正式版本,多种优势集于一身2018-08-14 14:14 公司Julia 的累积下载次数超过 200 万,已被应用于自动驾驶汽车.机器人.3D 打印.精准医疗 ...
- 基于ABP落地领域驱动设计-06.正确区分领域逻辑和应用逻辑
目录 系列文章 领域逻辑和应用逻辑 多应用层 示例:正确区分应用逻辑和领域逻辑 学习帮助 系列文章 基于ABP落地领域驱动设计-00.目录和前言 基于ABP落地领域驱动设计-01.全景图 基于ABP落 ...
- .net架构设计读书笔记--第二章 设计体系结构
第五节 探索领域架构 一.领域驱动设计的价值与意义 最初在java中使用,.net要晚些才引入.领域驱动设计出现之初的争议.一个向导,少走弯路 1. 我们真的需要DDD吗? DDD并不适用于每个软 ...
- SLAM+语音机器人DIY系列:(四)差分底盘设计——1.stm32主控硬件设计
摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...
- SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计
摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...
- 进阶篇:4.1)DFA设计指南:简化产品设计(kiss原则)
本章目的:理解kiss原则,明确如何简化产品的设计. 1.前言:kiss原则,优化产品的第一原则 如果要作者选出一个优化产品的最好方法,那一定是kiss原则莫属.从产品的整体设计到公差的分析,kiss ...
- 进阶篇:4.3)DFA设计指南:防错设计( 防呆设计)
本章目的:每一个装配步骤都有设计防错. 1.前言 关于防错设计,作者有想说的话: 1)防错设计是DFA重要的一条.因为太过重要,作者单独开一分章写! 2)只有理解了设计防错的重要,才会去设计防错特征. ...
- 【转】App架构设计经验谈:接口的设计
App架构设计经验谈:接口的设计 App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉. 安全机制的设计 现在,大部分App的接口都采用REST ...
随机推荐
- CodeBlocks配置文件位置
CodeBlock配置混乱,决定重装时,删除程序后,需将配置文件删除. 配置文件位置:C:\Users\Administrator\AppData\Roaming\CodeBlocks
- app接口测试-bug分类
前段时间在测试一个项目,任务是测试app的API.总结下遇到的问题类型: 1 通过app提交数据,隐形数据有误.(主要通过验证数据库) 比如用户通过app输入工单提交.接口数据中,用户输入的信息都正确 ...
- php反射
反射 //反射查找对象方法所在的文件名.$n_func = new ReflectionMethod($obj,$function);$filepath = $n_func->getFileNa ...
- android 帧动画的实现及图片过多时OOM解决方案(一)
一,animation_list.xml中静态配置帧动画的顺序,如下: <?xml version="1.0" encoding="utf-8"?> ...
- DataTable的子查询--DataTable.Select()
由于需要,在sql查询获得结果集之后,又需要对该结果再进行筛选一次,若重新从sql中查询会浪费资源,因此特地去查阅了一些资料,学会了用DataTable进行子查询. 在.Net Framework 2 ...
- iOS学习之设计模式
iOS开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷 ...
- iOS应用性能调优好文mark
http://www.cocoachina.com/ios/20150408/11501.html
- iOS 截图功能
步骤: 当我们所需截的图的大小超过我们屏幕的大小时,可以用UIScrollView作为底图,这样就可以截图我们所需的大小,即 UIScrollView *scrollView = self.view. ...
- JSP弹出窗口和模式对话框
本文转载于其它blog,在此向本文原创者,致意! JSP 弹出窗口 一.window.open() 基础知识 1.window.open()支持环境: JavaScript1.0+ ...
- Java(三)
任意整数求和: (1) import java.util.Scanner; public class sum { @SuppressWarnings("resource") pub ...