《python金融数据分析》

前言

Python 已广泛应用于银行业、投资管理 保险业、房地产行业等金融领域用于开发金融模型、管理风险和自动完成交易。许多大型金融机构依赖 Python 来搭建职位管理、资产定价、风险管理和交易系统等基础设施。

本书将介绍核心的金融理论,并给出它们的数学概念,以帮助读者更好地理解它们在实际中的应用价值。你将了解如何应用 Python 求解经典的资产定价模型,解决金融中的线性和非线性问题,开发数值程序和利率模型,以及如何根据有限差分法定价来描绘含有期权的隐含波动率曲线等。

随着高级计算技术的出现,我们必须要考虑如何存储和处理大量数据 。而Hadoop 是目前处理大数据的流行工具。因此本书将介绍 Hadoop 的工作原理及其与 python 的集成,以获得金融数据的分析方法;以及如何利用 python 实现 NoSQL 在存储非结构化数据中的应用。

目前许多公司开始向客户提供 API,以使用他们定制的交易软件进行交易。 通过学习本书,你将了解如何连接到代理 API,检索市场数据,生成交易信号并向交易所发送指令,以及平均回报和趋势跟踪等交易策略的实施。另外,本书还将介绍风险管理、头寸跟踪和回溯测试技术, 以帮助你管理交易策略的实施效果。

金融行业中,使用 Microsoft Excel 处理债券交易和后台业务是一种普遍现象。本书将介绍如何在 python 中创建数字定价组件对象模型( COM)服务器,使你的电子表格能够即时计算和更新模型值。

第1章 Python 在金融中的应用

Python 已经在银行业、投资管理和保险业等金融领域取得广泛应用,甚至帮助房地产行业开发金融建模、风险管理和交易的程序。

1.1 Python 适合我吗

大型金融机构也利用 Python 建立基础系统架构。比如美国银行“石英”项目通过 Python 实现头寸位管理、定价和风险管理功能;摩根大通利用 Python兼容性和灵活性,融合 C++ 和 Java,建立跨市场的风险管理和交易系统一一 “雅典娜”。

本书将介绍借助 Python 开发金融应用的基本内容,包括投资组合最优化、数值定价、交互式分析、利用 Hadoop 进行大数据投资决策等。

1.1.3 丰富的标准库

NumPy、SciPy、matplotlib、statsmodels 和 pandas 是定量分析和数据管理经常使用的模块。

其他库可以拓展 Python 的功能,例如,gnuplot 软件包能够将 Python 变为数据可视化工具,以可视化数学函数和数据交互;基于 Tk 的 GUI 工具(如 Tkinter)可将 Python 脚本变为 GUI 程序。

1.2 面向对象编程与函数式编程

1.2.1 面向对象式方法

class Greeting(object):
	def __init__(self, my_greeting):
		self.my_greeting = my_greeting

	def say_hello(self, name):
		print "%s %s" %(self.my_greeting, name)

《python金融数据分析》_第1张图片

1.2.2 函数式方法

《python金融数据分析》_第2张图片

1.2.3 我该使用哪种方法

复杂软件系统将对象作为类,有助于团队成员之间的代码管理,工作范围和系统范围更容易通过面向对象式定义。涉及数学模型时,函数式编程方法更易实现代码中数学概念。

第2章 金融中的线性问题

当今,非线性动力学在世界上有至关重要的作用。然而,线性模型凭借其简洁性和易建模的优势,在金融领域广泛用于证券定价、投资组合最优资产配置等工作,得到全局最优解。

为实现有效预测,回归分析广泛应用于统计领域以估计变量之间的关系。

传统投资组合管理中,资产配置通常遵循线性模型,而每个投资者都有其独特的投资风格。我们可以将投资组合配置问题转换为包含等式和不等式的线性方程组,该线性方程组可用 Ax =B 的矩阵形式表示。其中,A 为已知系数值,B 为观测值,x 为未知向量。通常,x 代表最优资产配比,我们可以利用线性代数中的直接或间接方法快速求解。

本章讨论以下主题:

  • 资本资产定价模型、有效边界和资本市场线
  • 利用回归方程求解证券市场线
  • 套利定价模型与多元线性回归
  • 投资组合分配中的线性优化
  • 利用 PuLP 进行线性优化
  • 线性规划的结果
  • 整数规划
  • 二元条件下的线性整数规划
  • 利用矩阵求解线性方程组
  • 利用 LU 分解、Cholesky 分解和 QR 分解直接求解线性方程组
  • 利用 Jacobi 迭代和 Gauss-Seidel 迭代间接求解线性方程组

2.1 资本资产定价模型与证券市场线

《python金融数据分析》_第3张图片
资本资产定价模型可以衡量投资组合中每只股票收益与风险的关系。将这些关系加总,我们就可以得到具有最低投资风险的证券投资组合权重。期望得到特定收益率的投资者,可以通过资本资产定价模型得到风险最低的最优化投资组合。最优投资组合的集合称为有效边界(efficient frontier)。

有效边界上存在一个切点,该点表示可获得最高回报率或最低风险的最优投资组合,称为市场投资组合(market portfolio )。市场投资组合与无风险利率点的连线称为资本市场线(capital mai-ket line, CML)。换言之,资本市场线可认为是所有最优投资组合的夏普比率最高的那个。夏普比率(Sharpe ratio)是风险调整后的收益率,通过投资组合的超额收益除以其标准差计算。通常投资者都乐意持有位于资本市场线上的资产组合,让我们看下图:
《python金融数据分析》_第4张图片

《python金融数据分析》_第5张图片
《python金融数据分析》_第6张图片

""" Linear regression with SciPy """ 
from scipy import stats

stock_returns = [0.065, 0.0265, -0.0593, -0.001, 0.0346]
mkt_returns = [0.055, -0.09, -0.041, 0.045, 0.022]

beta, alpha, r_value, p_value, std_err = \
    stats.linregress(stock_returns, mkt_returns)
print(beta, alpha, r_value, p_value, std_err)
0.5077431878770808 -0.008481900352462384 0.38455905003823676 0.5227155239089462 0.7036705543221569

《python金融数据分析》_第7张图片
当该证券同期实际回报率高于期望回报率,投资者在风险不变情况下获得更高的收益,即此证券价值被低估。
相反,当该证券同期实际回报率低于由证券市场线得出的期望回报率,即投资者在风险不变情况下获得更少的收益, 即此证券价值被高估。

2.2 套利定价模型

资本资产定价模型有许多局限性,如均值—方差理论框架的应用以及回报率仅受市场风险一项风险因素的影响。一个多元化投资组合,基本可以消除股票的非系统性风险。
套利定价理论(Arbitrage Pricing Theory, APT)模型的提出弥补了上述不足,并提供一种不同于均值—方差理论的资产定价方法。

该模型假定证券报酬率是基于包括多个系统性风险因素的线性组合模型得到的,这些因素可能是通货膨胀率、GDP 增长率、实际利率或股息。
套利定价模型的资产定价方程如下所示:
《python金融数据分析》_第8张图片

2.3 因子模型的多元线性回归

""" 统计模型的最小二乘回归 """

import numpy as np
import statsmodels.api as sm

# 生成一些示例数据
num_periods = 9
all_values = np.array([np.random.random(8) for i in range(num_periods)])

# 过滤数据
y_values = all_values[:, 0]
x_values = all_values[:, 1:]

x_values = sm.add_constant(x_values)	# 包含截距。
model = sm.OLS(y_values, x_values)
results = model.fit() 

print(results.summary())

《python金融数据分析》_第9张图片

我们可以使用 params 函数计算所求系数:

print(results.params)
[ 1.20540136 -0.18613356 -0.7448403   0.42204504 -0.24264953  1.22527411
 -0.93990767 -0.6429364 ]

2.4 线性最优化

2.4.2 一个简单的线性优化问题

《python金融数据分析》_第10张图片
《python金融数据分析》_第11张图片

""" 一个简单的两变量线性规划问题 """
import pulp

x = pulp.LpVariable("x", lowBound=0)
y = pulp.LpVariable("y", lowBound=0)

problem = pulp.LpProblem("一个简单的最大化目标", pulp.LpMaximize)
problem += 3*x + 2*y, "目标函数"
problem += 2*x + y <= 100, "约束1"
problem += x + y <= 80, "约束2"
problem += x <= 40, "约束3"

problem.solve()

你可能感兴趣的:(计算经济学,python,金融,数据分析)