全栈金融工程师算法技术解构

全栈金融工程师算法技术解构_第1张图片

算法技术解构

1、Python基础知识

(1)IPython
IPython的开发者吸收了标准解释器的基本概念,在此基础上进行了大量的改进,创造出一个令人惊奇的工具。在它的主页上是这么说的:“这是一个增强的交互式Python shell。”具有tab补全,对象自省,强大的历史机制,内嵌的源代码编辑,集成Python调试器,%run机制,宏,创建多个环境以及调用系统shell的能力。
IPython与标准Python的最大区别在于,IPython会对命令提示符的每一行进行编号。
IPython是一个综合的交互式编程环境,比原本python命令进入的交互式环境要强大很多。

(2)Notebook
IPython notebook目前已经成为用Python做教学、计算、科研的一个重要工具。

IPython Notebook使用浏览器作为界面,向后台的IPython服务器发送请求,并显示结果。在浏览器的界面中使用单元(Cell)保存各种信息。Cell有多种类型,经常使用的有表示格式化文本的Markdown单元,和表示代码的Code单元。

每个代码单元都有一个输出区域,在Code单元中输入代码,按 Shift-Enter 将运行此代码,代码中最后一个表达式的值将输出区域显示。如果希望屏蔽输出,可以在最后一条语句之后添加一个分号:”;”。此外,代码中还可以使用print语句在输出区域中显示信息。

在Markdown单元中还可以直接使用Html和Javascript。

(3)Numpy
NumPy是Python用于处理大型矩阵的一个速度极快的数学库。它允许你在Python中做向量和矩阵的运算,而且很多底层的函数都是用C写的,你将获得在普通Python中无法达到的运行速度。这是由于矩阵中每个元素的数据类型都是一样的,这也就减少了运算过程中的类型检测。

Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy、Matplotlib一起使用。

(4)Scipy
NumPy是一个定义了数值数组和矩阵类型和它们的基本运算的语言扩展。 SciPy是一种使用NumPy来做高等数学、信号处理、优化、统计和许多其它科学任务的语言扩展。

Scipy方便、易于使用、专为科学和工程设计的Python工具包。它包括统计,优化,整合,线性代数模块,傅里叶变换,信号和图像处理,常微分方程求解器等等。

(5)Pandas
Numpy是以矩阵为基础的数学计算模块,纯数学。
Scipy基于Numpy,科学计算库,有一些高阶抽象和物理模型。比方说做个傅立叶变换,这是纯数学的,用Numpy;做个滤波器,这属于信号处理模型了,在Scipy里找。
Pandas提供了一套名为DataFrame的数据结构,比较契合统计分析中的表结构,并且提供了计算接口,可用Numpy或其它方式进行计算。

Pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。最具有统计意味的工具包,某些方面优于R软件。数据结构有一维的Series,二维的DataFrame(类似于Excel或者SQL中的表)。

(6)Matplotlib
Python中最著名的绘图系统。matplotlib的复杂给其带来了很强的定制性。其具有面向对象的方式及Pyplot的经典高层封装。需要掌握的是:散点图,折线图,条形图,直方图,饼状图,箱形图的绘制。绘图的三大系统:pyplot,pylab(不推荐),面向对象坐标轴的调整,添加文字注释,区域填充,及特殊图形。使用金融的同学注意的是:可以直接调用Yahoo财经数据绘图(真方便。。。)

(7)Scikit-learn

很火的开源机器学习工具。

scikit-learn的基本功能主要被分为六个部分,分类,回归,聚类,数据降维,模型选择,数据预处理,具体可以参考官方网站上的文档。

对于具体的机器学习问题,通常可以分为三个步骤,数据准备与预处理,模型选择与训练,模型验证与参数调优。

scikit-learn支持多种格式的数据,包括经典的iris数据,LibSVM格式数据等等。为了方便起见,推荐使用LibSVM格式的数据,详细见LibSVM的官网。

(8)Statsmodels
Statsmodels是Python的统计建模和计量经济学工具包,包括一些描述统计、统计模型估计和推断。包括线性回归模型、一般线型模型、robust linear models、离散选择模型(logit)、ANOVA、时间序列分析、非参检验、各种统计检验、读取各种格式的数据及输出、绘图、整体检验。

2、利用Python进行数据分析

(1)数据读写
ipython
ipython notebook/jupyter notebook
%pylab(集成matplotlab)

In[556]:2 ** 57
Out[557]:134217728

(2)数组和矢量计算
import numpy as np
ndarray(多维数组对象)
arr = np.array([1,2,3,4,5])
dtype(数据类型):int32 float64
数组与标量运算(广播)
索引和切片 arr[5:8]
数组转置

(3)数学优化
逼近法:回归(np.polyfit np.polyval np.linalg.lstsq import statsmodels.api as sm/sm.OLS)、插值(import scipy.interpolate as spi)
凸优化:指求取最小值的目标函数为凸函数的一类优化问题。如效用函数。import scipy.optimize as spo/ spo.brute全局最小化方法 spo.fmin局部最小化方法 spo.minimize(constraints=cons)带约束条件的优化
积分:import scipy.integrate as sci 数值积分sci.fixed_quad(f,a,b)[0] 蒙特卡洛模拟积分np.random.seed(1000) np.random.random
符号计算:import sympy as sy 解方程sy.solve 积分sy.integral 微分sy.diff(f, x)

(4)统计推断
随机数:rand()
随机过程:几何布朗运动、平方根扩散、随机波动率、跳扩散
方差缩减

Python有一个很好的统计推断包。那就是scipy里面的stats。
from scipy import stats as ss

(5)可视化
Python中有许多可视化模块,最流行的当属matpalotlib库。稍加提及,我们也可选择bokeh和seaborn模块。

import matplotlib.pyplot as plt

(6)时间序列
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.graphics.api import qqplot

dta=pd.Series(dta)
diff1 = dta.diff(1) 一阶差分
diff2 = dta.diff(2) 二阶差分
fig = sm.graphics.tsa.plot_acf(dta,lags=40,ax=ax1) ACF图
fig = sm.graphics.tsa.plot_pacf(dta,lags=40,ax=ax2) PACF图
ARMA:acf确定ma的lag,pacf确定ar的lag
fig = qqplot(resid, line='q', ax=ax, fit=True) QQ图(直观验证一组数据是否来自某个分布,或者验证某两组数据是否来自同一(族)分布。)

(7)衍生品估值
DX衍生品分析库
泛型估值类
class valuation_class.py(object):
欧式行权估值类
class valuation_mcs_european(valuation_class):
美式行权估值类
class valuation_mcs_american(valuation_class):

(8)投资组合估值
衍生品头寸模型类
class derivatives_position(object):
衍生品投资组合类
class derivatives_portfolio(object):

(9)Python投资策略
优矿量化
聚宽网

(10)Quant
Quant 应该学习哪些 Python 知识

3、数据挖掘实战

(1)数据挖掘过程

数据采集→数据探索→数据预处理→挖掘建模→模型评价

(2)数据采集
相关、可靠、有效

(3)数据探索
数据质量分析:缺失值分析、异常值分析、一致性分析
数据特征分析:分布分析:直方图、饼图,对比分析:绝对数比较、相对数比较,统计量分析:集中趋势(均值、中位数、众数)、离中趋势(极差、标准差、变异系数、四分位数间距)
主要探索函数:sum mean var std corr cov skew/kurt describe cumsum cumprod cummax cummin plot pie hist boxplot

(4)数据预处理
数据清洗:缺失值处理(均值插补、插值法),异常值处理(删除、用平均值修正、视为缺失值)
数据集成:将多个数据源合并到一个数据仓库中。实体识别,冗余属性识别
数据变换:简单函数变换,规范化(标准化(x-min)/(max-min)、0-1规范化(x-mean)/std),连续属性离散化(等宽、等频、基于聚类),属性构造,小波变换(提取特征)
数据规约:属性规约(PCA降维、决策树归纳)、数值规约(直方图、聚类、抽样、参数回归)
主要预处理函数:interpolate插值 unique去重 isnull notnull PCA random随机数

(5)挖掘建模

分类与预测:回归分析(线性、非线性、logit、PCA),决策树,人工神经网络(BP神经网络),贝叶斯网络,SVM
Python实现:sklearn.linear_model sklearn.svm sklearn.tree sklearn.ensemble(随机森林) sklearn.naive_bayes Keras(神经网络)

聚类分析:K-Means K-中心点 系统聚类
K-Means典型的非层次聚类算法,在最小化误差函数的基础上将数据划分为预定的类数K,采用距离作为相似性评价的指标,距离越近,相似度越大。
Python实现:sklearn.cluster

关联规则:Apriori算法
Apriori算法也属于无监督学习,它强调的是“从数据X中能够发现什么”。从大规模的数据集中寻找物品之间隐含关系被称为关联分析或者称为关联规则学习。这里的主要问题在于,寻找物品的不同组合是一项十分耗时的任务,所需的计算代价很高,蛮力搜索并不能解决这个问题。因此此处介绍使用Apriorio算法来解决上述问题。

频繁项集:指经常出现在一块的物品的集合。 关联规则暗示两种物品之间存在很强的关系。(这里我们事先定义阀值,超过该阀值,证明两者之间存在很强的关系)。发现频繁项集,然后从频繁项集中发现关联规则。
Python实现:from apriori import *

时间序列:平稳性检验,ARIMA模型
Python实现:plot_acf plot_pacf adfuller diff arima aic/bic/hqic forecast

离群点检测:检测方法:基于统计,基于邻近度,基于密度,基于聚类

4、机器学习基础知识

(1)初步

利用经验(数据)通过计算的手段(算法)来改善系统自身的性能。

从数据中学得模型的过程称为学习(训练)。相应的数据集称为训练数据(训练集)。

学得模型后,使用其进行预测的过程称为测试。相应的数据集称为测试数据(测试集)。

训练数据是否有标记信息,分为监督学习(训练时有特征标签,告诉你对错,如分类和回归),无监督学习(训练时无特征标签,如聚类)。

机器学习vs数据挖掘:数据挖掘可以认为是数据库技术与机器学习的交叉,它利用数据库技术来管理海量的数据,并利用机器学习和统计分析来进行数据分析。其关系如下图:

全栈金融工程师算法技术解构_第2张图片

数据挖掘受到了很多学科领域的影响,其中数据库、机器学习、统计学无疑影响最大。粗糙地说,数据库提供数据管理技术,机器学习和统计学提供数据分析技术。由于统计学界往往醉心于理论的优美而忽视实际的效用,因此,统计学界提供的很多技术通常都要在机器学习界进一步研究,变成有效的机器学习算法之后才能再进入数据挖掘领域。从这个意义上说,统计学主要是通过机器学习来对数据挖掘发挥影响,而机器学习和数据库则是数据挖掘的两大支撑技术。

(2)模型评估与选择

根据已有的训练集,我们已经将该模型训练完毕。但是,当我们需要在新的数据集上进行预测时,发现预测的结果和实际有很大的误差。那么应该做什么?

获取更多数据,减少特征量,变更参数...

似乎有很多种方法来改善学习模型,但是,有些方法可能要花费很多时间(或许还不起作用),有些方法可能是矛盾的。所以,需要一种方式来给我们指明方向:到底应该采用哪种或哪些方式来优化模型。我们将这种方式称为机器学习诊断(Machine Learning Diagnostics)。机器学习诊断是一种测试法,能够深入了解某种算法到底是否有用。这通常也能够告诉我们,要想改进一种算法的效果,什么样的尝试才是有意义的,从而节省时间,减少不必要的尝试。

分类错误的样本比例叫错误率。学习器在训练集上的误差称为训练误差,在新样本上的误差称为泛化误差。希望得到泛化误差小的学习器。训练样本学得太好以至于在泛化的时候把训练样本的自身特点带到了新样本中,称为过拟合。训练样本的一般性质尚未学好,称为欠拟合

训练数据划分为(训练集:用来训练模型确定参数,验证集用来进行模型选择和调参);测试数据(测试集:测试已训练好的模型的泛化能力)

查准率 = 识别出的真正的正面观点数 / 所有的识别为正面观点的条数
查全率 = 识别出的真正的正面观点数 / 样本中所有的真正正面观点的条数

查准率=真正例/(真正例+假正例)
查全率=真正例/(真正例+假反例)

实验证明,在查全率和查准率之间存在着相反的相互依赖关系。

全栈金融工程师算法技术解构_第3张图片
全栈金融工程师算法技术解构_第4张图片

(3)线性模型

在现实生活中普遍存在着变量之间的关系,有确定的和非确定的。确定关系指的是变量之间可以使用函数关系式表示,还有一种是属于非确定的(相关),比如人的身高和体重,一样的身高体重是不一样的。

梯度下降算法是一种求局部最优解的方法,对于F(x),在a点的梯度是F(x)增长最快的方向,那么它的相反方向则是该点下降最快的方向。

基本上每个模型都会有一个对应的目标函数,可以通过不同的最优化求解方法(梯度下降,牛顿法等等)对这些对应的目标函数进行求解。线性回归模型,我们知道实际上是通过多个自变量对自变量进行曲线拟合。我们希望找到一条可以较好拟合的曲线,那我们如何判断一条曲线的拟合程度的好坏。上面讲到,我们采用的是最小二乘法(预测值和真实值的误差平方和)。

线性模型参考页面

(4)决策树

决策树参考页面

决策树学习:根据数据的属性采用树状结构建立决策模型。决策树模型常常用来解决分类和回归问题。常见的算法包括 CART (Classification And Regression Tree)、ID3、C4.5、随机森林 (Random Forest) 等。

信息熵:度量样本集合纯度(决策树的分支结点所包含的样本种类类别数量的多少)的一种指标。

信息增益:表示了用属性(特征)A使得数据集D的分类不确定性减少的程度。

信息增益比:对于取值多的属性,尤其一些连续型数值,这个单独的属性就可以划分所有的样本,使得所有分支下的样本集合都是“纯的”(最极端的情况是每个叶子节点只有一个样本)。一个属性的信息增益越大,表明属性对样本的熵减少的能力更强,这个属性使得数据由不确定性变成确定性的能力越强。所以如果是取值更多的属性,更容易使得数据更“纯”(尤其是连续型数值),其信息增益更大,决策树会首先挑选这个属性作为树的顶点。结果训练出来的形状是一棵庞大且深度很浅的树,这样的划分是极为不合理的。C4.5使用了信息增益率,在信息增益的基础上除了一项split information,来惩罚值更多的属性。

基尼系数:从数据集中随机抽取两个样本,其类别标记为不一致的概率。Gini越小,数据集纯度越高。

决策树分别由三个经典算法实现:ID3,C4.5,CART,这三个算法最明显的区别就是对于特征选择的策略不同,不过目的只有一个:使当前数据集的混乱程度降低。具体来说,ID3使用的信息增益,C4.5使用的信息增益比,CART使用的Gini指数。

(5)神经网络
一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型。

BP神经网络是一种按误差逆传播(BP)算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP神经网络的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hide layer)和输出层(output layer)。

(6)SVM
是一种训练机器学习的算法,可以用于解决分类和回归问题,同时还使用了一种称之为kernel trick的技术进行数据的转换,然后再根据这些转换信息,在可能的输出之中找到一个最优的边界。简单来说,就是做一些非常复杂的数据转换工作,然后根据预定义的标签或者输出进而计算出如何分离用户的数据。

什么是机?什么是向量?什么是支持?机就是算法的意思,为什么不叫算法叫机是因为一些历史原因。向量就是向量,做分类的时候每个样本都用一个向量表示。支持有撑起来,决定的意思。做分类的时候一般都是找到一个分类超平面(二纬的话是线),超平面一侧是正类一侧是负类。何为支持向量,就是决定了这个分类超平面的向量。所以可以这样理解支持向量机:它是一个分类算法,这个算法是通过超平面进行分类的,这个超平面是由支持向量决定的。

(7)贝叶斯分类器

贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。

朴素贝叶斯分类器:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。

(8)EM算法
在统计计算中,最大期望(EM)算法是在概率(probabilistic)模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐藏变量(Latent Variable)。最大期望经常用在机器学习和计算机视觉的数据聚类(Data Clustering)领域。

(9)随机森林
随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。

(10) 聚类分析
k-means
k-means是划分方法中较经典的聚类算法之一。由于该算法的效率高,所以在对大规模数据进行聚类时被广泛应用。目前,许多算法均围绕着该算法进行扩展和改进。
k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。k-means算法的处理过程如下:首先,随机地 选择k个对象,每个对象初始地代表了一个簇的平均值或中心;对剩余的每个对象,根据其与各簇中心的距离,将它赋给最近的簇;然后重新计算每个簇的平均值。 这个过程不断重复,直到准则函数收敛。

层次聚类
根据层次分解的顺序是自底向上的还是自上向下的,层次聚类算法分为凝聚的层次聚类算法和分裂的层次聚类算法。
凝聚型层次聚类的策略是先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到所有对象都在一个簇中,或者某个终结条件被满足。绝大多数层次聚类属于凝聚型层次聚类,它们只是在簇间相似度的定义上有所不同。

数据降维 特征选择与稀疏学习 半监督学习 隐马尔科夫模型 规则学习 强化学习

5、机器学习Spark

RDD弹性分布式数据集,记录被分配到一个集群的多个节点上。
推荐引擎:推荐引擎,是主动发现用户当前或潜在需求,并主动推送信息给用户的信息网络。挖掘用户的喜好和需求,主动向用户推荐其感兴趣或者需要的对象。
分类模型:线性,朴素贝叶斯(概率模型,通过计算给定数据点在某个类别的概率来进行预测),决策树
回归模型:线性回归,决策树回归
聚类模型:K-Means聚类,层次聚类
数据降维:PCA,SVD(奇异值分解法)
文本处理:
Spark Streaming实时机器学习:在线学习(模型随着接收到新的消息不断更新自己,而不是像离线训练那样一次次重新训练),Spark Streaming处理实时数据流。

6、R基础知识

数据读写: <- data.frame <- read.table() patientdata$gender
可视化:plot(标题 坐标轴 标签 颜色 线条 符号 文本标注)
统计分析:summary描述性统计 describe描述性统计 aggregate by分组描述性统计 cor相关性分析 t.testT检验 wilcox.test两组数据非参数检验
回归:lm 线性回归/多项式回归/多元线性回归/含交互项的多元线性回归
ANOVA:ANOVA单因素方差分析 ANCOVA单因素协方差分析
主成分分析:principal

7、自然语言处理NLTK

(1)基础

import nltk
from nltk.book import *
词语索引concordance 相似上下文similar common_contexts
词汇分布图dispersion_plot
词汇计数sorted(set(text)) len(set(text)) 词密度 len(text)/len(set(text))
索引 切片 连接' '.join()
词频分布fdist=FreqDist(); 单词降序排列fdist.keys()
列表推导式sorted([w for w in set(text) if len(w)>7 and fdist[w]>7])
词汇比较运算符 w.startswith(t) endswith islower isupper isalpha isalnum isdigit istitle

(2)获取文本语料

import nltk
nltk.corpus.gutenberg.fileids()
from nltk.corpus import webtext
webtext.fileids() 得到语料库中所有文件的ID集合
webtext.raw(fileid) 给定文件的所有字符集合
webtext.words(fileid) 给定文件的所有单词集合
webtext.sents(fileid) 给定文件的所有句子集合
from nltk.corpus import reuters
from nltk.corpus import inaugural 就职演说
条件频率分布
cfd = nltk.ConditionalFreqDist(
(target, fileid[:4])
for fileid in inaugural.fileids()
for w in inaugural.words(fileid)
for target in ['america', 'citizen']
if w.lower().startswith(target))
WordNet面向语义的英语词典,层次结构(同义词集synset,上位词hypernyms,下位词hyponyms)
from nltk.corpus import wordnet as wn

(3)处理原始文本

从网络访问
from urllib import urlopen
url='绝对地址'
raw=urlopen(url).read()
tokens=nltk.word_tokenize(raw) 分词
text=nltk.Text(tokens)
处理HTML
处理搜索引擎
处理RSS订阅

读取本地文件
f=open('document.txt')
raw=f.read()

捕获用户输入
s=raw_input("please input:")

NLP流程:打开一个URL读取里面的HTML格式的内容,去除标记,并选择字符切片,然后分词,再转换为nltk.Text对象

高级分词技巧:使用正则表达式为文本分词。

(4)分类和标注词汇

分类:使用词性标注器nltk.pos_tag(text)
CC并列连词,RB副词,IN介词,NN名词,JJ形容词

标注:使用已标注的语料库(标记集公约ADJ ADV CNJ N NUM P V )

使用Python字典映射词及其属性

自动标注(默认标注器 nltk.DefaultTagger('NN') 正则表达式标注器)

N-Gram标注:它的上下文是和它前面N-1个标识符的词性标记相关的最大可能词性。
N-Gram是大词汇连续语音识别中常用的一种语言模型,对中文而言,我们称之为汉语语言模型(CLM, Chinese Language Model)。该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句的概率就是各个词出现概率的乘积。这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。

(5)监督式分类文本

建立在训练语料(包含了每个输入的正确标签)基础上的分类,叫做监督式分类。

语料数据组织:开发集(训练集+开发测试集)、测试集

应用:文档分类、词性标注、探索上下文语境、序列分类

应用举例:句子分割、识别对话行为类型、识别文字蕴涵

评估:测试集、准确度、精确度(发现的项目中有多少是相关的)和召回率(相关的项目中发现了多少)、交叉验证(在不同的测试集上执行多重评估,然后组合这些评估的得分)

决策树:熵、信息增益。自动构建树结构的流程图,用于基于输入值的特征添加标签。不适合特征值之间有关联。

朴素贝叶斯分类器:每个特征值独立决定应该使用哪个标签,允许特征值之间有关联。

最大熵分类器:跟朴素贝叶斯类似。不过使用迭代优化算法寻找使训练集概率最大化的特征权值集合。

(6)从文本提取信息

信息提取步骤:将原始文本分割成句(句子分割器)→将句子分割成词(分词器)→词性标注→实体识别→关系识别

(7)分析句子结构

句子的内部组织结构用树来表示。组成结构的显著特点是:递归、中心词、补语和修饰语。

文法是可能句子的集合的紧凑型特性;可以说,一棵树是符合语法规则的,或者说文法可以授权为一棵树。

文法是一种用于描述给定短语是否可以被分配特定成分或依存结构的形式化模型。当句子有一个以上的文法分析时,就会产生句法歧义。

解析器是寻找一个或多个与符合语法规则句子相对应树的程序。

下降递归解析器是一个自上而下解析器,利用文法产生式,递归可扩展开始符号,并尝试匹配输入的句子。

移位-规约解析器是一个自下而上解析器,它把输入移到堆栈中,并尝试匹配堆栈顶部的项目和文法产生式右边的部分。

(8)基于特征的文法

语法分析固然重要,但要想覆盖语言的全部,需要进一步扩展到文法分析,文法分析可以基于规则,但是工作量难以想象,基于特征的文法分析不但可穷举,而且可以方便用计算机存储和计算,

文法是一个潜在的无限的句子集合的一个紧凑的特性,它是通过一组形式化模型来表示的,文法可以覆盖所有结构的句子,对一个句子做文法分析,就是把句子往文法模型上靠,如果同时符合多种文法,那就是有歧义的句子
最重要的结论:文法结构范围相当广泛,无法用规则类的方法来处理,只有利用基于特征的方法才能处理

(9)文法特征结构

文法特征举例:单词最后一个字母、词性标签、文法类别、正字拼写、指示物、关系、施事角色、受事角色
因为文法特征是一种kv,所以特征结构的存储形式是字典
不是什么样的句子都能提取出每一个文法特征的,需要满足一定的条件,这需要通过一系列的检查手段来达到,包括:句法协议(比如this dog就是对的,而these dog就是错的)、属性和约束、术语

基于特征的文法参考页面

(10)语义理解

自然语言、语义、逻辑。基于文法规范,很容易将英语翻译成SQL。

8、爬虫项目

Python网络数据采集:beautifulsoup
from urllib.request import urlopen
from bs4 import BeautifulSoup

基于R语言的自动数据收集:

网络爬虫技术简介

9、大数据项目

Hadoop生态系统
HDFS:Hadoop分布式文件系统
MapReduce:分布式计算框架
Hive:基于Hadoop的数据仓库
HBase:分布式列存数据库
Sqoop:数据同步工具

Hadoop生态系统介绍

10、数据科学项目

(1)数据准备和处理
数据源:开源数据、文本文件、Excel文件、SQL数据库、NoSQL数据库、多媒体、网页
数据清洗:统计方法、文本解析(import re正则表达式)
数据转化:ETL(抽取、转化和加载)
数据格式:CSV、JSON、XML、YAML
OpenRefine:免费开源数据清洗工具是一个帮助用户转换数据集的工具,优化数据的质量以便于在真实场景中使用,你的数据是杂乱无章的。

(2)可视化
D3网页可视化框架(Data-Driven Documents, 数据导向文件)
D3.js是一个JavaScript库,它可以通过数据来操作文档。D3可以通过使用HTML、SVG和CSS把数据鲜活形象地展现出来。D3严格遵循Web标准,因而可以让你的程序轻松兼容现代主流浏览器并避免对特定框架的依赖。同时,它提供了强大的可视化组件,可以让使用者以数据驱动的方式去操作DOM。
D3技术框架:HTML、DOM文档对象模型、CSS、JavaScript、SVG可伸缩矢量图形

(3) 文本分类
学习和分类:二元分类/多类别分类
分类案例:垃圾邮件分类、演讲识别、搜索引擎、计算机视觉、语音识别
分类算法:SVM、神经网络、决策树、朴素贝叶斯、隐马尔科夫模型

(4) 图像相似性检索
基于内容的图像检索:小波对比、傅里叶分析、基于神经网络的模式识别
基于描述的图像检索:采用与元数据相关联的图像
动态时间规整DTW:由于语音信号是一种具有相当大随机性的信号,即使相同说话者对相同的词,每一次发音的结果都是不同的,也不可能具有完全相同的时间长度。因此在与已存储模型相匹配时,未知单词的时间轴要不均匀地扭曲或弯折,以使其特征与模板特征对正。用时间规整手段对正是一种非常有力的措施,对提高系统的识别精度非常有效。动态时间规整DTW是一个典型的优化问题,它用满足一定条件的的时间规整函数W(n)描述输入模板和参考模板的时间对应关系,求解两模板匹配时累计距离最小所对应的规整函数。

(5) 蒙特卡洛模拟
依靠随机数生成器的概率分布来模拟不同行为。

(6) 时间序列预测
平滑时间序列,非线性回归(核岭回归)

**(7)SVM **
分类三部曲:特征选择、特征抽取、降维
SVM:结合核几何结构所形成的一种有监督的分类方法,通过寻找最优决策边界来将不同的点划入其所属的类别中。

(8)D3.js社会化图谱
图谱就是一组节点(顶点)和连接(边)的集合。
通过Netvizz来捕获Facebook社会化图谱,下载GDF(Graph Modeling Language)文件,使用Gephi进行图谱再现。

(9)社交网络数据情感分析
通过OAuth访问Twitter API,使用Twython3进行查询和导出。
Tweet情感分析(训练数据→提取特征→单词包→训练分类器→(积极,消极))
(Tweet查询→提取特征→训练分类器→(积极,消极))
NLTK朴素贝叶斯分类

(10)MongoDB数据管理
MongoDB是一个面向文件的NoSQL数据库。
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

(11)MapReduce编程模型
MapReduce将作业的整个运行过程分为两个阶段:Map阶段和Reduce阶段
Map阶段由一定数量的Map Task组成
输入数据格式解析:InputFormat
输入数据处理:Mapper
数据分组:Partitioner
Reduce阶段由一定数量的Reduce Task组成
数据远程拷贝
数据按照key排序
数据处理:Reducer
数据输出格式:OutputFormat

11、量化投资

(1)量化选股
多因子选股(打分法、回归法)
候选因子的选取(基本面指标 PB/PE/EPS等、技术面指标 动量/换手率/波动率等、 其他指标 分析师预测/宏观经济)→选股因子有效性的检验(排序,划分组合)→有效但冗余因子的剔除(相关性矩阵)→综合评分模型的建立和选股→模型检验

风格轮动
风格鉴别(规模指标:基金内股票市值中值 大中小盘,估值指标:基金内股票 PB加权平均+PE加权平均 价值型 混合型 成长型)
轮动解释:经济周期、反应过度/不足、价值回归
风格预测:相对价值法(均值回归理论)、场景预测法(因子敏感性)
风格策略:风格动量、风格反转

行业轮动
周期性行业(能源、材料、工业、金融)
非周期性行业(消费、TMT、医药、电信、公用事业)

M2轮动策略:货币政策扩张时等权配置周期性行业,紧缩时等权配置非周期性行业。
市场情绪轮动策略:基于趋势型技术指标。选择绝对强势行业再相对趋势or选择业绩基准强势时段再相对趋势

资金流
MF:资金流。价格上升时的成交额,资金流入;价格下降时的成交额,资金流出。
策略:待选股票池→基于MF指标打分&排序&求和,构建股票组合→调整→统计检验。

动量反转
行为金融:羊群效应(跟风),小公司效应(小盘股收益高,庄股,炒作),反应过度/不足(选择性偏差/保守性偏差),动量/反转效应。
动量/反转策略:股票池→形成期(从大到小排序验证动量,从小到大排序验证反转)→持有期(计算持有期收益率)

一致预期
在众多分析师一致预期的情况下,投资者会产生羊群效应,大量买入/卖出,造成股价持续上涨/下跌。

一致预期模型指标:EG一致预期EPS增长速度、RC卖方分析对预期EPS的调整情况、RA分析师一致预期EPS的平均水平、AN关注个股的分析师数量、ANV关注个股分析师数量的变动率、EY预期EPS的回报率

一致预期模型:采用六大指标构建股票池,进行分组,形成期持有期,看看top组合和bottom组合相对于业绩基准的表现(上证指数、HS300)

趋势跟踪
向上突破压力位,向下突破阻力位,意味着趋势来临。

策略模型:均线简化、记录极点、过滤微小波动(设置阈值)、高低点比较策略(判断主趋势)、突破高低点策略、大波段保护机制、长均线保护机制

筹码选股
根据某只股票的筹码分布情况来判断涨跌。主力收集筹码,股价上升概率大;主力发散(派发)筹码,股价下跌概率大。

筹码集中度与股票收益率。

业绩评价
收益率指标:总收益率、年化复合收益率、相对收益率(收益率-benchmark)、alpha收益率(利用股指期货对冲系统性风险后的超额收益)

风险度指标:beta系数、基于CAPM的估计、基于单因子模型、夏普比率(rp-rf)/sigmap单位总风险获得的风险溢价比如某私募小基金、特雷诺指数T=(rp-rf/)betap每单位系统风险获得的风险溢价比如大型养老基金已经分散了非系统风险、最大回撤(历史最大回撤Max-Recall=(pi-p1)/p1中的最小值)、信息比率(IR=组合跟踪偏离度的样本均值TD/组合跟踪偏离误差TE)

(2)量化择时
趋势追踪
传统趋势指标:简单移动平均SMA、指数平滑异同移动平均MACD、平均线差DMA、三重指数平滑移动平均TRIX

单指标择时策略、多指标择时策略

自适应均线:在行情反复震荡的时候慢一点,在行情快速变化的时候快一点。

市场情绪
基本概念:直接调查(投资者信心指数)、折溢价率指标(市场情绪高则折溢价率高)、新股指标(市场情绪高,IPO溢价高)、市场指标(资金流量、涨停家数)、投资者行为(新增开户数、基金仓位、卖空比例、保证金交易、资金出入)

情绪指数:PCA方法:封闭式基金溢价率、转股溢价率、IPO首日涨跌幅、IPO发行PE、上涨家数百分比、混合型基金平均仓位、股票型基金平均仓位

时变夏普率Tsharp:同夏普(单位风险的超额收益,但反经济周期,即经济运行至高位时夏普比率较小)

牛熊线:布朗运动(股票市场是随机波动的),马尔科夫过程(股价遵循高斯布朗运动)。择时策略,股价在牛线之上,强势;股价在熊线之下,弱势;股价在牛熊之间,盘整。

Hurst指数:分形市场理论(股价变化并非随机游走,而是具有趋势性和序列相关性)、Hurst指数(描述市场长期记忆性的指标,=0.5时为随机游走,>0.5为趋势,<0.5为反转)

SVM:支持向量机(SVM)是目前很流行的一个数学方法,主要用于分类与预测。择时本质上是一个预测过程,即利用过去的数据预测未来一段时间大盘是上涨还是下跌。但是市场是非线性的,使得传统的线性预测方法效果不佳。由于SVM独特的机制和效果,对非线性预测有非常好的效果,因此利用SVM技术来建立择时模型,可以有效地避免传统回归模型的精度和扩展性问题。

SWARCH模型:为了研究宏观经济与证券市场趋势之间稳定的关联度,海通证券改变了以往构建单一模型,研究两者长期均衡关系的做法,转而从周期属性和宏观背景角度出发,引入隐性变量对宏观经济周期和市场趋势进行了合理的刻画,并以此为重要前提,构建了度量宏观经济周期与证券市场趋势及其相互影响关系的SWARCH 模型。该模型的基本思路:某些宏观经济指标对市场的运行轨迹起着明显的制约作用,但这种制约关系并不表现为每一期数据之间的一一对应关系,因此我们着重研究的是宏观经济周期与市场趋势之间的转移概率分布。我们利用该模型对诸多宏观经济变量进行了测试,结果发现,以m2 环比增速为基础指标构建的货币供应周期与证券市场之间的关联度最强也最稳定,并且货币供应周期具有领先市场趋势的特征,最佳领先期为一期,即一个月。

异常指标:市场噪声(噪声交易者(交易者在缺乏正确信息的情况下密集的买卖行为)、噪声交易指数)、行业集中度(行业相关性集中度)、兴登堡凶兆(预测走势转弱或暴跌,剧烈下跌引发的恐慌性抛售)

(3)股指期货套利
利用股指期货市场存在的不合理价格,同时参与股指期货交易与股票现货市场交易,或者同时进行不同期限不同但相近类别股指期货交易,以赚取买卖价差。分为期现套利、跨期套利、跨市套利、跨品种套利。

期现套利是指某种期货合约,当期货市场与现货市场在价格上出现差距,从而利用两个市场的价格差距,低买高卖而获利。买入股指期货合约的同时卖出相同价值的现货组合,无风险套利。理论上,期货价格是商品未来的价格,现货价格是商品目前的价格,按照经济学上的同一价格理论,两者间的差距,即“基差”(基差=现货价格-期货价格)应该等于该商品的持有成本。一旦基差与持有成本偏离较大,就出现了期现套利的机会。其中,期货价格要高出现货价格,并且超过用于交割的各项成本,如运输成本、质检成本、仓储成本、开具发票所增加的成本等等。 期现套利主要包括正向买进期现套利和反向买进期现套利两种。

跨期套利就是在同一期货品种的不同月份合约上建立数量相等、方向相反的交易头寸,最后以对冲或交割方式结束交易、获得收益的方式。最简单的跨期套利就是买入近期的期货品种,卖出远期的期货品种。

(4)商品期货套利
期现套利:同一种商品在期货市场和现货市场之间的不合理价差进行的套利行为。
跨期套利:在同一商品期货品种的不同合约月份建立数量相等方向相反的头寸,最后以对冲或交割方式结束交易、获得收益的方式。
跨市场套利:同一商品期货品种在不同市场之间的套利。
跨品种套利:利用两种不同的但相互关联的商品之间的合约价格差异进行的套利。

(5)统计套利
统计套利是将套利建立对历史数据进行统计分析的基础之上,估计相关变量的概率分布,并结合基本面数据进行分析以用以指导套利交易。相比于无风险套利,统计套利少量增加了一些风险,但是由此可获得的套利机会将数倍于无风险套利。期现套利是无风险套利(期现价格必收敛一致),跨期套利是一种风险套利(统计套利),因为价格在近月期不一定收敛。

经典的统计套利——配对交易。配对交易(Pairs Trading)是经典统计套利策略之一。它的基本思想是:在同一行业中寻找两只股价具备均衡关系的股票,当它们的价格走势偏离正常值时,做多近期相对弱势股,做空近期相对强势股,并期待它们的股价会在将来某个时点趋于一致。
做空,需要配合融资融券交易。同行业主营业务相近的两只股票,由于受到的行业基本面影响相似,在个股无重大促发因素前提下,两者股价走势不会出现太大偏离。

(6)期权套利
垂直套利:交易方式表现为按照不同的执行价格同时买进和卖出同一合约月份的看涨期权或看跌期权。主要包括四种形式:牛市看涨期权(买低C卖高C)、牛市看跌期权(买低P卖高P)、熊市看涨期权(卖低C买高C)、熊市看跌期权(卖低P买高P)。

水平套利:远期期权与近期期权有不同的时间衰退速度,在正常情况下近期期权比远期期权的衰减更快,因此,水平套利的做法是买远期期权,卖近期期权。

跨式套利:以相同的执行价格同时买进或卖出不同种类的期权,分为买入跨式套利、卖出跨式套利。1) 买入跨式套利:以相同的执行价格同时买入同期看涨期权和看跌期权,希望波动性增大。2) 卖出跨式套利:以相同的执行价格同时卖出同期看涨期权和看跌期权,希望波动性变小。

宽跨式套利:投资者同时买进或卖出相同标的物,相同到期日,但不同执行价格的看涨期权和看跌期权,分为买入宽跨式套利、卖出宽跨式套利。1) 买入宽跨式套利(买低P买高C):以较低的执行价格买入看跌期权,并以较高的执行价格买入看涨期权。2) 卖出宽跨式套利(卖低P卖高C):以较高的执行价格卖出看涨期权,并以较低的执行价格卖出看跌期权。

常用期权套利策略参考页面

(7)算法交易
算法交易又被称为自动交易、黑盒交易或者机器交易,它指的是通过使用计算机程序来发出交易指令的方法。在交易中,程序可以决定的范围包括交易时间的选择、交易的价格、甚至可以包括最后需要成交的证券数量。

算法交易最初诞生是为了将大单拆分成大量较小的交易减少对市场的冲击、降低机会成本和风险。随着相关技术的发展完善,算法交易因其优势开始被应用在更多方面的用途上。如对冲投资组合使用它来在电子新闻信息到达时实现迅速交易,而其他交易员甚至还不知道到信息的存在。

算法交易分类:根据各个算法交易中算法的主动程度不同,可以把不同算法交易分为被动型算法交易(TWAP/VWAP)、主动型算法交易、综合型算法交易三大类。

TWAP,时间加权平均价格算法,是一种最简单的传统算法交易策略,主要适用于流动性较好的市场和订单规模较小的交易。该模型将交易时间进行均匀分割,并在每个分割节点上等量拆分订单进行提交。例如,可以将某个交易日的交易时间平均分为N段,TWAP策略会将该交易日需要执行的订单均匀分配在这N个时间段上去执行,从而使得交易均价跟踪TWAP。

VWAP,成交量加权平均价格算法,是目前市场上最为流行的算法交易策略之一,也是很多其他算法交易模型的原型。该模型是将一段时间内证券价格按成交量加权得出的平均值,即VWAP是对一段时间市场上所有交易活动平均价格的衡量。

改进型的VWAP策略的基本原理是:在市场价格高于市场均价的时候,根据市场价格的走势不同程度的减少提交量,在保证高价位的低提交量的同时,能够防止出现价格的持续上涨而提交量过度的向后聚集;在市场价格低于市场均价的时候,根据市场价格走势不同策划那个度的增加提交量,在保证低价位的高提交量的同时,能够防止价格的持续走低而提交量过度的提前完成。

算法交易策略参考页面

(8)另类套利
封闭式基金套利:根据折价率,买入高折价基金,卖出低折价基金,实现稳健的alpha收益
ETF套利:利用ETF在一级市场和二级市场的价格差来进行套利
高频交易:流动性回扣交易(交易所向创造流动性的券商提供交易费用回扣)、猎物算法交易(制造人为的价格来诱使机构投资者提高买入价格或降低卖出价格)、自动做市商策略(通过发出超级快速订单来发现其他投资者投资意向)、程序化交易。

(9)小波变换
金融时间序列具有非平稳、非线性和信噪比高的特点,小波变化根据时频局部化,具有自适应和显微镜性质,将时间序列进行分解(Mallat算法),然后平滑,再进行重构,从而转变为平稳去噪的时间序列,再去进行分析和预测。

(10)SVM
主要用于对非线性金融时间序列进行预测,先由训练样本对模型进行训练和完备,然后进行预测并输出结果。

(11)分形理论
描述复杂系统的局部特征,金融中用于描述价格波动特征。分形市场理论(股价变化并非随机游走,而是具有趋势性和序列相关性)、Hurst指数(描述市场长期记忆性的指标,=0.5时为随机游走,>0.5为趋势,<0.5为反转)

(12)随机过程
一连串随机事件动态关系的定量描述。独立增量过程,泊松过程,维纳过程,正态过程,马尔科夫过程。

马尔科夫过程:用来对股市大盘进行预测,预测的对象是一个随机变化的动态系统,根据状态之间的转移概率来推测系统未来的发展,转移概率反映了各种随机因素的影响程度。

(13)量化对冲系统
系统架构:数据源(历史交易数据、历史分析数据、实时行情数据、实时分析数据)→数据分析引擎→策略分析/机会监控→程序化交易

核心算法:选股策略、择时策略、策略整合(分层整合、交集整合)

12、数据库基础(SQL)

(1)基本术语:实体、列、行、表、结果集(SQL查询结果,未持久化的表)、主键(唯一标识表中的一个或多个列)、外键(用于识别其他表中的某列)

(2)SQL:结构化查询语言
create table
insert data
select name from table where id=007
update table
delete data

MySQL:MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL数据类型:字符型(char),文本型(text),数值型(int,float,double),时间型(date,year,time)

创建表(设计、精化、构建SQL方案语句)
操作与修改表(插入数据insert、更新数据update、删除数据delete)
导致错误的语句(主键不唯一、不存在的外键、列值不合法、无效的日期转换)

(3)查询:select列名 from表名 (inner join on表连接)where条件 (group by having,过滤掉不需要的分组) order by排序(默认升序,降序加desc)

(4)过滤:where 条件1 and/or (not) 条件2;条件类型(=,<>,between a and b,通配符,正则表达式)

(5)连接: select 列 from 表 inner join 表 on 条件

(6)集合: union并集 intersect交集 except差集

(7)数据处理:字符型(生成set 操作length locate strcmp replace) 数值型(算术函数mod pow 控制精度ceil上进 floor下进 round四舍五入 sign取符号 abs绝对值) 时间型(date datetime time) 转换函数cast(select cast('999ABC111' as unsigned integer))

(8)分组与聚集: group by having, max min avg sum count

(9)子查询: select嵌套 select 列 from 表 where 条件(select from where)

13、深度学习工具

(1)Caffe: 基于C++/CUDA/Python实现的卷积神经网络(CNN)框架。
在python中 import caffe

Caffe's Abstract Framework:
要读懂Caffe,首先要熟悉Blob,Layer,Net,Solver这几个大类。这四个大类自下而上,环环相扣,贯穿了整个Caffe的结构,下面先分别简单地介绍一下这四个类的主要作用。
Blob:作为数据传输的媒介,无论是网络权重参数,还是输入数据,都是转化为Blob数据结构来存储
Layer:作为网络的基础单元,神经网络中层与层间的数据节点、前后传递都在该数据结构中被实现,层类种类丰富,比如常用的卷积层、全连接层、pooling层等等,大大地增加了网络的多样性
Net:作为网络的整体骨架,决定了网络中的层次数目以及各个层的类别等信息
Solver:作为网络的求解策略,涉及到求解优化问题的策略选择以及参数确定方面,修改这个模块的话一般都会是研究DL的优化求解的方向。

(2)Torch: Torch7 是一个科学计算框架,支持机器学习算法。易用而且提供高效的算法实现,得益于 LuaJIT(采用C语言写的轻量脚本语言Lua代码的解释器)和一个底层的 C 实现。

(3)MxNet: 是一款设计为效率和灵活性的深度学习框架。它允许你混合符号编程和命令式编程,从而最大限度提高效率和生产力。在其核心是一个动态的依赖调度,它能够自动并行符号和命令的操作。支持Python,Julia和R。

(4)TensorFlow: Google开源。异构分布式系统上的大规模机器学习框架。TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。

(5)Theano: 基于Python的深度学习框架。Theano是一个Python库,专门用于定义、优化、求值数学表达式,效率高,适用于多维数组。

(6)Keras:Keras是基于Theano的一个深度学习框架,它的设计参考了Torch,用Python语言编写,是一个高度模块化的神经网络库,支持GPU和CPU。作为基于python的最流行的深度学习框架,Keras以其快速上手,支持Theano/Tensorflow无缝切换,文档丰富等若干优点广受好评……额好吧总体来说它还是比较小众就是了。虽然也有很多缺点,但做快速原型真是不错。

(7)CNTK:微软推出的深度学习开源框架。俞栋:就我个人所知,许多新的语音识别模型都是基于CNTK开发的。我们一开始开发CNTK主要就是为语音识别的研究服务的。即使今天CNTK能方便地支持图像、视频、文本、以及其他信息的处理,它对于语音识别模型的支持仍然比较好。CNTK非常灵活,它支持各种主流模型,比如 DNN、CNN、LSTM,同时可以自定义各种新模型,比如PIT模型和PAC模型就都是完全由CNTK构建的。另外,因为CNTK也是我们产品线上的主要工具,所以我们开发了许多高效率高性能的并行算法。这些算法极大地提升了像语音识别这样需要大量训练数据的任务的训练速度。另外,我们在已经发布的1.5和1.6版本中已经有对Python的支持。

你可能感兴趣的:(全栈金融工程师算法技术解构)