Leo的技术分享

记录开发的点滴

最大回撤是指投资组合在选定的周期内,任一时间点往后推,可能出现资产净值下降的最大幅度。回撤的意思是指在某一段时期内净值从最高点开始回落到最低点的幅度。最大回撤常用百分率来表示,是一个重要的风险指标。最大回撤的计算公式为

$$
最大回撤 = \left( 波峰值 - 波谷值 \right) / 波峰值
$$

注意这里的$波峰值$与$波谷值$并不一定是最高值与最低值,这里的$波峰值$与$波谷值$要与时间范围内关联起来。

另外,值得指出的是,最大回撤只是描述投资组合资产净值下降的最大幅度,但它并没有描述投资组合需要使用多长时间恢复下降的资产净值。

本文讲述如何使用 Python 科学计算包 numpy 来计算最大回撤。

为方便描述算法,我们简化最大回撤的定义,只考虑净值下降值,不采用百分率来表示下降幅度,即对于序列 $x_1, x_2, \ldots, x_n$,定义最大回撤 $d$ 为

$$
d = \max \limits_{i\leqslant j} \left( x_i - x_j \right)
$$

如果需要改用百分率来表示最大回撤,只需要再除以$x_i$即可。

根据定义,很容易想到最大回撤的算法。遍历序列中所有元素,对于每个元素计算其下降最大值,然后再比较所有元素下降最大值,挑选出最大的元素下降最大值。这个算法的时间复杂度为$O(n^2)$。

那么,是否存在线性时间复杂度求最大回撤的算法呢?答案是肯定的。算法可以直接使用以下式子来表示:

$$
d = \max \limits_{i\leqslant j} \left( x_i - x_j \right) = \max \limits_{j} \left( \max \limits_{i \leqslant j} x_i - x_j \right)
$$

阅读全文 »

RQalpha 是 Ricequant 开源的量化框架,提供数据获取,算法交易,策略回测,实盘模拟,实盘交易,数据分析等功能。RQalpha 的安装过程并不十分友好,本文讲述如何安装 RQalpha。安装环境是 Mac OS 操作系统。

安装步骤

1. 创建虚拟环境

RQalpha 推荐使用虚拟环境来安装,以避免由于各种环境问题导致安装失败。可以使用 conda 来创建虚拟环境,为使用 conda 命令,用户可以先下载安装 anaconda。由于 anaconda 并不是本文的讲述重点,anaconda 的安装可以参考 https://www.anaconda.com/,本文不再赘述。

使用以下命令创建虚拟环境:

1
conda create -n rqalpha python=3.6

这样就基于 Python 3.6 创建了虚拟环境rqalpha。创建虚拟环境后,激活环境。

1
source activate rqalpha

2. 安装 cython

使用命令 conda 来安装 cython。

1
conda install cython

3. 安装 bcolz

bcolz 是 RQalpha 的依赖库,RQalpha 使用 bcolz 来进行数据的存储。使用 conda 来安装 bcolz。

1
conda install bcolz

值得指出的是,安装 cython 和 bcolz 都需要使用 conda 命令来执行,使用 pip 命令来安装会出现安装失败的情况。

阅读全文 »

CAP 理论是分布式系统的一个基础理论,它描述了任何一个分布式系统最多只能满足以下三个特性中的两个:

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分区容忍性(Partition tolerance)

CAP 理论听起来十分抽象,本文尝试以生活中的例子并用通俗易懂的语言来解释 CAP 理论的含义。

第一章:“记忆公司”面世

一天晚上,正准备入睡时,你的妻子对你记住她生日并送她礼物表示感谢。这时,一个商业想法从你的脑海中闪现:人们总是弱于记忆生活中的事情,而我却拥有超群的记忆力,因此,为何不成立一间公司可以充分运用自己的记忆天赋来赚钱。说干就干,接着你在当地一间报社刊登了记忆公司的宣传广告:

记忆公司 —— 你的事情永不会忘记
还在为你老是忘记而苦恼?福音来了,只须一个电话。
当你需要记着某件事情时,请拨打 400 - 888 - 8888,告诉我们你需要记住的事情,下次你需要找回这件事情,请再次拨打电话,我们将会告诉你的所需。
收费: 每次只需要 10 元。

以下是一次你和顾客的电话对话。

  • 顾客:Hey,麻烦帮我记住我邻居的生日。
  • 你:好。你邻居生日是什么时候?
  • 顾客:1月2日。
  • 你:(在一个本子,翻到这位顾客的一页,记录下他邻居的生日。)好的,已记录好。下次你找回邻居的生日,请再次拨打电话。
  • 顾客:谢谢。
  • 你:不客气,本次收费 10 元。

第二章:业务扩大了

随着时间的推移,记忆公司的业务发展得越来越好,越来越多的顾客打电话进来需要服务。虽然赚到的钱越来越多,但也产生了一个新的问题。
顾客打电话进来时,需要等待的时间越来越多,另外,当你生病时,所有顾客都不能获得服务,这令人很是烦恼。
于是,你想出了一个新的计划:

阅读全文 »

AOP,Aspect Oriented Programming,面向切面编程,是指在运行时,动态地将代码切入到类的指定方法、指定位置上的一种编程技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容。利用 AOP 可以对业务逻辑与横切关注点(cross-cutting concerns,例如日志记录,事务处理)进行隔离,从而使得业务逻辑与横切关注点的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP 目的是为了解耦,它可以使一组类共享相同的行为。面向对象编程(OOP)目的也是为了提高代码的可重用性,那么 AOP 和 OOP 有什么不同之处呢?对于 OOP 来说,只能通过继承类和实现接口这种方式来实现,但这会使代码的耦合程度增强,不利于代码的维护。AOP 正是为了弥补了 OOP 的不足而出现。

Spring 框架提供了 AOP 的丰富支持,允许开发人员通过分离应用程序的业务逻辑与横切关注点从而进行内聚性的开发。举例来说,日志记录,性能统计,安全控制,事务处理,异常处理,这些称之为横切关注点的功能,对于应用程序来说是必须的。AOP 允许将这些横切关注点从业务逻辑代码中划分出来,从而改变这些横切关注点的代码不影响业务逻辑的代码。

AOP 的核心概念

我们先来看一下 AOP 涉及的几个核心概念。

1. Aspect

Aspect 是一个类,这个类实现上述横切关注点的功能,例如日志记录,事务处理,等。

2. Join Point

Join point 是程序中某个执行点,例如方法执行,属性访问等。对于 Spring AOP 来说,join point 通常是指方法执行。

3. Advice

Advice 是指在某个特定 join point 执行的动作,当某个 join point 匹配 pointcut 时,advice 指定的方法会被执行。

4. Pointcut

Pointcut 是一个表达式,当 join point 匹配 pointcut 的表达式时,advice 指定的方法就会被执行。

阅读全文 »

概览

对于 Spring 框架来说,控制反转(Inversion of Control, IoC)和依赖注入(Dependency Injection, DI)是个等同的概念,控制反转是通过依赖注入实现的。在这篇文章中,我们会详细介绍 IoC 和 DI 的概念,然后我们会讨论 Spring 框架中是如何实现 IoC 和 DI 的。

什么是控制反转

IoC 是软件工程的一个设计原则,是指对象的依赖由框架来控制,而不是由对象的提供者来控制。
IoC 可以通过多种机制来实现,例如,策略设计模式,依赖注入(DI)等。本文我们主要介绍如何通过 DI 来实现控制反转。

什么是依赖注入

一般来说,每个 Java 应用程序都有几个对象,这些对象一起工作以提供系统的功能。当实现复杂的 Java 应用程序时,Java 对象之间应尽可能独立以增加这些对象的可复用性。依赖注入有助于把这些对象粘合在一起,同时保持它们的独立。
依赖注入是 IoC 的一种实现方式,为理解依赖注入概念,我们先来看一下传统的对象依赖是如何实现的。
假设我们有一个包含文本编辑器的应用程序,文本编辑器提供拼写检查功能,传统的代码看起来是这样的:

1
2
3
4
5
6
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor() {
spellChecker = new SpellChecker();
}
}

在这里,我们创建了TextEditorSpellChecker的依赖关系。如果使用了 IoC,代码可以写成这样子:

1
2
3
4
5
6
public class TextEditor {
private SpellChecker spellChecker;
public TextEditor(SpellChecker spellChecker) {
this.spellChecker = spellChecker;
}
}

TextEditor实例化时,通过在构造函数对实例变量spellChecker赋值,我们创建了TextEditorSpellChecker的依赖关系,这个依赖关系的建立是通过构造函数注入到TextEditor中的。

1
2
SpellChecker sc = new SpellChecker; // dependency
TextEditor textEditor = new TextEditor(sc);

上面我们采用类的使用者来实现依赖注入,对于 Spring 框架来说,依赖注入是由 Spring IoC 容器来实现的。

阅读全文 »

Rserve 是一个基于 TCP/IP 的服务器程序,它允许其他语言调用 R 语言。由于 Rserve 采用 C/S (客户端/服务器)的调用方式,因此客户端并不需要链接 R 语言库,客户端程序与 R 程序可以实现低耦合的目的。
为调用 R 语言,需要实现一个与 Rserve 通信的客户端程序,幸运的是目前常用的语言包括 C/C++,PHP,Java 等都实现提供与 Rserve 通信的客户端程序。
本文讲述 Java 语言如何利用 Rserve 实现与 R 语言的通信。

安装 Rserve

假设 R 的运行环境是 CentOS(CentOS 使用yum install R来安装 R),在 CentOS 我们已经安装好 R。
在 Linux 命令行中输入

1
R

进入 R 的交互环境,然后输入

1
> install.packages("Rserve")

接下来就可以安装 Rserve。

启动 Rserve

启动 Rserve 有两种方式,一种是在 R 程序中启动,另一种是在命令行中启动。

1. R 程序启动 Rserve

打开 R 的交互环境,输入以下命令:

1
2
library(Rserve)
Rserve()

执行后,Rserve 便启动起来。

2. 命令行启动 Rserve

也可以直接在命令行中输入:

1
R CMD Rserve

启动 Rserve。

为让 Rserve 支持远程连接,可以加入--RS-enable-remote参数:

1
R CMD Rserve --RS-enable-remote
阅读全文 »

Spring Web MVC 是一个建立在 Servlet API 的 Web 框架,它属于 Spring Framework 的产品。Spring Web MVC 名称来源于模块 spring-webmvc ,但它更常用的叫法是 Spring MVC。
本文讲述如何使用 IntelliJ IDEA 来编写一个 Spring MVC Demo。

使用 IntelliJ IDEA 创建一个 Maven 项目,选择 webapp 类型。

阅读全文 »

Hibernate 是一种 Java 语言下的对象关系映射的解决方案,它为面向对象的领域模型到传统的关系型数据库的映射提供了一个使用方便的框架。
本文讲述如何使用 Hibernate 来实现数据库中基本的增删查改操作。

创建数据库表

为实现我们的例子,我们先创建一个表EMPLOYEES并插入一些数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE EMPLOYEES (
EMP_ID BIGINT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(252),
DEPARTMENT VARCHAR(128),
SALARY BIGINT,
JOINED_ON TIMESTAMP,
PRIMARY KEY (EMP_ID)
);

INSERT INTO EMPLOYEES (EMP_ID, NAME, DEPARTMENT, SALARY, JOINED_ON) VALUES (1, 'Nataraja G', 'Documentation', 10000, CURRENT_TIMESTAMP);
INSERT INTO EMPLOYEES (EMP_ID, NAME, DEPARTMENT, SALARY, JOINED_ON) VALUES (2, 'Amar M', 'Entertainment', 12000, CURRENT_TIMESTAMP);
INSERT INTO EMPLOYEES (EMP_ID, NAME, DEPARTMENT, SALARY, JOINED_ON) VALUES (3, 'Nagesh Y', 'Admin', 25000, CURRENT_TIMESTAMP);
INSERT INTO EMPLOYEES (EMP_ID, NAME, DEPARTMENT, SALARY, JOINED_ON) VALUES (4, 'Vasu V', 'Security', 2500, CURRENT_TIMESTAMP);

创建 Maven 项目

使用 IntelliJ IDEA 创建一个 Maven 项目,选择 quickstart 类型。

阅读全文 »

IntelliJ IDEA 不愧为一款强大的 Java IDE,其提供的访问 MySQL 数据库的图形界面也异常的强大。
本文讲述如何配置 IntelliJ IDEA 来添加访问 MySQL 的图形界面。

打开 Database 选项窗口,View - Tool windows - Database。点击 + 号,新建一个 MySQL 数据库来源。

在 Data Sources and Drivers 窗口,配置 MySQL 的主机地址,用户名和密码。配置完毕后,可以点击 Test Connection 进行连接的测试,正常情况下,会提示连接成功。

阅读全文 »

JDBC(Java Database Connectivity,Java数据库连接)是 Java 语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。
本文讲述如何使用 JDBC 来连接和访问数据库。

为方便引入 JDBC 依赖包,我们创建 Maven 项目来实现我们的示例程序。
打开 IntelliJ IDEA 客户端,File - New - Project ,选择创建 Maven 项目,如下图所示:

填完必要的信息后,进入项目的编辑界面。

阅读全文 »
0%