Zhuang's Diary

言之有物,持之以恒

生成式AI的创新之处

近期以ChatGPT为代表的“生成式AI”(Generative AI)技术得到了广泛关注。**和传统的对话机器人(Chatbot)不同,OpenAI的ChatGPT确实有独特的技术创新,在人工智能的发展史上会是一个里程碑,甚至有可能和2016年谷歌的AIphaGo相提并论。目前的趋势显示,ChatGPT的应用前景比AlphaGo更广泛,更有潜力在推动这股AI技术潮流的发展方面发挥重要作用。

首先来学习对话机器人的工作机理

首先用户需要通过文字或语音向对话机器人输入一段信息,紧接着机器人会识别并理解这段信息,判断由该信息开启的对话任务,并给出相应的回复内容。最早期的对话机器人更像一个基于数据库或者知识库的查询系统,根据用户输入的信息查询到对应的答复。可以说这些答案基于不同的索引(index),已经事先存入对话机器人的数据库或者知识库,就跟搜索引擎使用的算法很类似。当对话机器人收到用户输入的信息以后,主要工作是处理信息中的关键词来生成最匹配的索引,再基于一定规则找到最匹配的答复。后来发展的对话机器人也可以利用训练数据,通过机器学习来产生答复,比如2014年的深度学习模型Seq2Seq被成功地用到了对话机器人上面。这些机器学习模型最喜欢的训练数据就是事先采集和标注好的在相同场景下(比如智能客服)的对话记录。

1.早期最有影响力的生成式AI技术是2014年发明的生成式对抗网络(Generative Adversarial Networks)

**其本质是一种深度学习模型,原理上有两个神经网络相互对立,一个生成器和一个判别器。**生成器或生成网络负责生成类似于源数据的新数据或内容,判别器或判别网络负责评价源数据和生成数据之间的区别并向生成器提供反馈。生成式对抗网络被成功用于计算机视觉技术,比如图像的生成和合成,但是在对话机器人技术上的成功应用并不多。

2.ChatGPT的核心是2017年出现的新生成式AI技术Transformer和随后产生的基于Transformer的大规模预训练技术,并引入了一些新的强化学习算法

**其中的核心技术Transformer是2017年谷歌发明的,它来源于2017年谷歌的一篇科研论文《Attention Is All Your Need》。**原本这篇论文聚焦的是自然语言处理领域,但由于其出色的解释性和计算性能,Transformer开始被广泛使用在AI各个领域和不同数据类型,成为最近几年最流行的AI算法模型。

3.Transformer的另一个巨大贡献是产生了预训练语言模型,比如GPT、BERT和ERNIE等

这些预训练语言模型用到的对语言的编码器和解码器,都是由一个个的Transformer组件拼接在一起形成的。比如,预训练语言模型BERT 所做的就是从大规模上亿的无标注文本语料中,随机抠掉一部分单词,形成类似完形填空的题型,不断学习空格处到底该填写什么。BERT的训练是从大量无标注数据中学习复杂的上下文联系。BERT和GPT(Generative Pre-Training)最主要的区别在于,BERT仅仅使用编码器部分进行模型训练,GPT仅仅使用解码器部分,所以GPT更适用于生成文本。

总的来说,预训练的第一步是在大规模无标注数据(如网上文本)上进行模型预训练,学习通用的语言模式;第二步在给定自然语言处理任务的小规模有标注数据上进行模型微调,快速提升模型完成这些任务的能力,最终形成可部署应用的模型**。**预训练模型已经在大规模语料上训练好了参数,用户在用的时候只需要在这个基础上训练更新参数。用户可以在神经网络加的最后的一层上进行分类或者更多的语言推理任务(比如对话等)。预训练技术成功激活了深度神经网络对大规模无标注数据的自监督学习能力,而Transformer和基于它的GPT、BERT、ERNIE等模型奠定了自然语言处理领域大模型的基础,证明了通过大规模语料的预训练技术,能够大幅度提升各类文本阅读理解的效果,开启了自然语言处理的新时代。

从Transformer提出到“大规模预训练模型”GPT和BERT的诞生,再到GPT-2的迭代,以及到GPT-3和ChatGPT的出现,标志着OpenAI成为营利性公司。**ChatGPT可以说是OpenAI公司利用最新生成式AI技术(Transformer)和最新大规模预训练模型(GPT-3.5)在对话机器人上的成功应用。**GPT-3的模型所采用的数据量多达上万亿,主要使用的是公共爬虫数据集和有着超过万亿单词的人类语言数据集,对应的模型参数量也达到1,750亿。另外,ChatGPT还采用了新的强化学习算法RLHF(Reinforcement Learning from Human Feedback,从人类反馈中强化学习)来对模型进行训练,具体是让一些外包人员不断从模型的输出结果中筛选,判断哪些句子是好的,哪些是低质量的,这样就可以训练得到一个强化学习中的奖励(reward)模型。

**ChatGPT属于现象级应用,大家都可以有直观感受,未来这类应用的体验提升和更新速度只会更快,理解其背后的技术有助于我们把握这个趋势。**从大量用户在网上分享的反馈来看,与同类对话机器人相比,ChatGPT具有几个明显的优点:

  • **更有“对话”的感觉:**ChatGPT在语言组织的逻辑性和系统性方面有了显著提高,感觉像是一个助理,甚至是老师在回答问题。

  • **回答理性又全面:**不像网上搜索问题那样,很可能碰到一些固执的回答者,只站在一个角度回答问题,ChatGPT能做到多角度全方位回答。

  • **可以理解上下文:**例如,在提出一个问题之后,可以用“就刚才的回答中,你指的xx到底是什么意思?”等形式,进行追问。

  • **会根据用户的反馈,持续优化模型:**ChatGPT答案的质量、完整性每天都有一定提高。这是新的强化学习算法和几十名外包人员每天筛选答案的贡献。

  • **可以协助创作内容,甚至对计算机代码进行指导:**注意,ChatGPT并不是简单地从某个模版中选择内容,而是根据实时计算的结果提供答案。你给的信息越精准,回复就越有针对性。

ChatGPT还不能做什么

**ChatGPT提供的答案只能被认为是不保证100%可靠的建议。**因为ChatGPT是基于大规模预训练这样的无监督学习,我们无法分辨预训练信息的来源和真实性。ChatGPT给出答案的精确度取决于预训练样本规模(目前预训练样本只限2021年之前的数据)和样本本身的准确度。所以很明显,ChatGPT并没有连接一个稳妥可靠的知识库,这也说明目前这个版本无法完全替代搜索引擎,而更适用于一些务虚的任务,比如写小说、写诗歌、搞辩论。我们认为给ChatGPT连接一个高质量的知识库会极大提高ChatGPT的准确性。一个可以考虑的方向是,让ChatGPT能够持续更新知识、查询知识,从而带领搜索引擎和互联网的发展。目前看来,至少ChatGPT可以做到将搜索引擎上的信息润色、组织成最适合人阅读的形式,直接反馈给用户。

预见未来

直接应用生成式AI(Generative AI )的场景是人机互动的文本、图像、语音、视频,也可以生成软件代码、音乐、虚拟世界的三维模型等,在消费领域可以用来做艺术创作、游戏开发、人员陪护等,它为商业领域里也带来很多数字化创新的机会。

企业级解决方案的创新是用户界面的变化,采用自然语言进行交互。无论是交易型应用还是分析型应用,基于AI采用自然语言进行互动的方式早有所探索,例如企业级商业智能可以采用持续的自然语言问答进行数据查询,并自动生成自然语言回答或者直观的图表;利用生成式AI可以进一步提升用户界面生成效率和质量。

聊天机器人在很多业务场景下并不能完全替代人工,这种方式不仅存在AI准确性的问题,而且在用户体验上缺乏沟通的温度,然而,AI具有超越人脑的信息处理能力,可以提供辅助人员互动的智慧,支持人与人之间有温度的沟通。不仅具有前文所述的行动计划推荐能力,而且能够实时分析销售人员的行为和话术,提出有针对性的辅导、改进建议,提升销售成功率,生成式AI进一步提升了此类智能化辅助程度。

可以预见,企业数字化应用可能会有以下变化:

  1. **实现业务流程的全自动导航,**例如,根据用户反馈,通过生成式AI自动改进产品设计,这将改变传统的产品开发相关企业软件(例如PLM、CAD)的应用流程。
  2. **2B软件架构简化,强调前端开发,进一步实现“数字技术民主化”,降低工作中对数据、信息和知识的访问门槛,用户能够更好地使用数字化技术和AI。**传统企业软件架构是应用软件访问集中的数据库,需要用代码来连接用户请求和数据,而未来数据和算法都是服务,利用生成式AI产生代码的过程将极为简化,企业软件将完全聚焦于业务运营和用户体验的持续创新。
  3. 下一步,如果AI还具备了,推理,推演,演绎的能力,例如回答:明天我要去见哪个客户会更有助于达成我这个月的销售指标?用什么手段能降低5%的费用而不影响员工满意度?那么AI将会觉有更加深远的影响。

生成式AI还将改变企业软件行业的商业生态——AI算法和工程等技术平台的开源社区蓬勃发展,利用开源技术开发基础模型越来越普遍。然而,体现企业差异化能力的是喂给AI的原料,所以数据资源的价值将更为凸显,具有独特know-how和来源的数据将成为AI背后的能力。

Veramo 中的功能是通过插件系统添加到代理中的。

Plugins Architecture

DID Methods

Core Supported DID Methods

Veramo 核心插件支持以下 did 方法。

did:ethr

did:ethr:0xc530503a148babcaca68565cfa576d6f43427a2d

Ethr-DID 为以太坊地址提供了一种可扩展的身份识别方法,使任何以太坊地址都能够收集链上和链下数据。因为 Ethr-DID 允许任何以太坊密钥对成为身份,所以它比基于智能合约的身份方法更具可扩展性和隐私保护性。

这种特殊的 DID 方法依赖于 ethr-did-registry。 ethr-did-registry 是一个智能合约,可以促进链下(和链上)身份验证的公钥解析。 它还有助于密钥轮换、委托分配和撤销以允许第 3 方签名者,以及设置和撤销链下属性数据。 这些交互和事件被聚合使用以使用 ethr-did-resolver 构建 DID 文档。

did:web

did:web:veramo-agent.herokuapp.com

Web-DID 利用域名系统,允许 Web 来源的所有者将其转换为 DID。创建 Web-DID 就像创建 DID 文档并将其托管在众所周知的 URL 下一样简单。 每次解析 DID 时,DID 文档都必须通过 HTTPS GET 可用。 这意味着创建一个 DID,不需要区块链,但它有一定的权衡。 Web-DID 的安全性通过实施 TLS 植根于现有的互联网 PKI。 Web-DID 可以直接托管在网络域的众所周知的 URL 下,例如 www.example.com/.well-known/did.json,也可以托管在特定的子路径下。使用子路径允许在一个网络域下托管多个 DID。此方法还可用于允许 Web 应用程序为其用户创建 Web-DID,例如 www.example.com/users/username/.well-known/did.json。

虽然 Web-DID 是一种非常有用的技术,可以将 Web2 连接到 Web3,并且特别允许公司非常轻松地创建他们的 DID,但它在安全和隐私方面存在一些缺点(例如,跟踪)。

did:key

did: key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH

Key-DID 代表了一种非常轻量级的自我证明 DID 方法,它不需要任何外部实用程序,例如区块链。Key-DID 是通过生成加密密钥对(例如,Curve25519)创建的。使用 Curve25519 将自动向 DID 文档添加两个条目,可用于 EdDSA(即 Ed25519)和 ECDH/加密(即,使用 X25519)。Key-DID 始终解析为相同的 DID 文档,并且由于它是不可变的,所以添加服务端点和其他密钥是不可能的。

Message Handlers

创建代理实例时,您指定要使用的消息处理程序以及调用它们的顺序。例如,如果您的应用程序从 QR 码捕获可验证凭证,其中数据被编码为 JWT,您将在代理设置中按顺序指定 urldid-commdid-jwtcredential-w3c 处理程序。

url

UrlMessageHandler 解析来自 URL 的消息,通常来自查询字符串。进一步的解析可能在 JWT 和/或 DIDComm 处理程序中执行。该处理程序支持获取缩短的 URL 重定向。

did-comm

DIDCommMessageHandler 使用收件人的私钥解密传入的消息。 解密的消息将传递给后续的消息处理程序。

did-jwt

JWT MessageHandler 解码 JWT 并创建消息对象。

credential-w3c

W3CMessageHandler 检查可验证凭证和可验证演示的消息有效负载,并相应地格式化消息对象。

Verifiable Credential

可验证数据只是使用加密算法进行数字签名的数据。Verifiable Credential 可验证凭证,可以代表物理凭证所代表的所有相同信息。

它具有发行者主题证明可验证数据等属性。

目前W3C的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1"
],
"id": "http://example.edu/credentials/1872",
"type": ["VerifiableCredential", "AlumniCredential"],
"issuer": "https://example.edu/issuers/565049",
"issuanceDate": "2010-01-01T19:23:24Z",
"credentialSubject": {
"id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
"alumniOf": {
"id": "did:example:c276e12ec21ebfeb1f712ebc6f1",
"name": [{
"value": "Example University",
"lang": "en"
}, {
"value": "Exemple d'Université",
"lang": "fr"
}]
}
},

"proof": {
"type": "RsaSignature2018",
"created": "2017-06-18T21:19:10Z",
"proofPurpose": "assertionMethod",
"verificationMethod": "https://example.edu/issuers/565049#key-1",
"jws": "eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5X
sITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUc
X16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtj
PAYuNzVBAh4vGHSrQyHUdBBPM"
}
}

Decentralized Identifier

DID 的风格或更准确地说是 DID 方法定义了如何执行该 DID 方法的 DID 的 CRUD 操作。 每个 DID 方法在特定用例中都有不同的权衡。 例如,可以在没有区块链的情况下创建 Web DID,但存在依赖于区块链的 DID 方法。 它们都是有效的 DID,但有不同的保证。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// https://veramo.dev/.well-known/did.json
{
"@context": "https://w3id.org/did/v1",
"id": "did:web:veramo.dev",
"publicKey": [
{
"id": "did:web:veramo.dev#0405aa19bb98a5fd29c15a730cb5064ca128dea19247b896b1a7bdad0b4bccccda9b47366cd1359e740d938e5a47d7bed0501150e8a1623805ac47c489421b1506",
"type": "Secp256k1VerificationKey2018",
"controller": "did:web:veramo.dev",
"publicKeyHex": "0405aa19bb98a5fd29c15a730cb5064ca128dea19247b896b1a7bdad0b4bccccda9b47366cd1359e740d938e5a47d7bed0501150e8a1623805ac47c489421b1506"
}
],
"authentication": [
{
"type": "Secp256k1SignatureAuthentication2018",
"publicKey": "did:web:veramo.dev#0405aa19bb98a5fd29c15a730cb5064ca128dea19247b896b1a7bdad0b4bccccda9b47366cd1359e740d938e5a47d7bed0501150e8a1623805ac47c489421b1506"
}
],
"service": [
{
"id": "did:web:veramo.dev#msg",
"type": "Messaging",
"serviceEndpoint": "https://veramo.dev/messaging",
"description": "Handles incoming POST messages"
}
]
}

按照风险的驱动因素,金融风险可以分为市场风险market risk,信用风险credit risk,操作风险operational risk,流动性风险liquidity risk。

最常见的市场风险包括利率风险,汇率风险,通货膨胀风险,证券价格风险,波动率风险等。

市场风险分析方法:

  1. 缺口分析法 gap analysis,即资产负债缺口分析法。当利率发生变化时,资产和负债之间产生“缺口”,通过比较缺口的大小,可以得到利率变化时市场价值变动的程度,亦即产生的利率风险的大小。GAP(缺口)= RSA(利率敏感性资产)- RSL(利率敏感性负债)

  2. 久期分析法 duration analysis,即持续期分析法或者期限弹性分析法。其通过对各时间段段缺口赋予相应权重,得到加权缺口,然后对这些加权缺口求和,以此估算利率变动对市场价值的影响。

相对于缺口分析只是考虑净收入的变化,久期分析则考察资产或者负债的价值,是一种更为准确的利率风险计量方法。

  1. 场景分析法 scenario analysis,又称假设分析法 what-if analysis。通过设定不同的情景,分析在每一种情景下的收益或者亏损,从而对整个投资组合的未来风险情况进行评估,做出最佳决策。
  2. 投资组合理论 portfolio theory,是一种衡量市场风险的方法。
  3. 希腊字母估计市场风险。
希腊字母 符号 风险评估
Delta Δ 标的资产价格变化引起金融衍生品价格变化
Gamma Γ 标的资产价格变化引起Delta变化
Theta Θ 时间引起衍生品价格变化
Vega Λ 市场波动率变化引起金融衍生品价格变化
Rho ρ 利率变化引起金融衍生品价格变化
  1. 风险价值 Value at Risk - VaR,也叫在险价值。作为经典的市场风险度量,可以用来评估资产的风险,帮助金融机构合理分散或者规避风险。摩根大通J.P.Morgan Chase开源了RiskMetrics系统,很快被金融机构采用,广泛地用来计算包括市场风险、信用风险以及操作风险等在内的金融风险

    6.1 参数法计算风险价值 parametric approach,一般假设未来收益满足正态分布,这是因为如股票收益率等风险因子一般都可以用正态分布近似,而资产组合通常也可以用风险因子等线性组合来表示,并且正态分布的任意线性组合仍然为正态分布,因此资产祝贺的预期收益分布仍然为正态分布。

    在市场上,价格低标准差通常变化较大,价格本身对于标准差来说,变化并不大。所以,参数法的关键是要计算出分布的标准差σ,正因为如此,参数法又时也被称为方差协方差方法。该原理容易理解,计算量也较小。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import pandas_datareader
import scipy.stats as stats
from mpl_toolkits import mplot3d
from matplotlib import cm

# 假设投资组合包含以下公司
tickers = ['GOOGL','FB','AAPL','NFLX','AMZN']
ticker_num = len(tickers)
price_data = []
for ticker in range(ticker_num):
# 获取股票的历史数据
prices = pandas_datareader.DataReader(tickers[ticker], start='2015-11-30', end = '2020-11-30', data_source='yahoo')
price_data.append(prices[['Adj Close']])
df_stocks = pd.concat(price_data, axis=1)

# stock log returns计算“日对数回报率”
logreturns = np.log(df_stocks/df_stocks.shift(1))[1:]
logreturns.columns = tickers
logreturns.head()

# 假设它们的对数回报率满足正态分布,下面代码计算并展示股票的回报率分布
# plot log return distribution for GOOGL
plt.style.use('ggplot')
mu, std = stats.norm.fit(logreturns['GOOGL'])
x = np.linspace(mu-5*std, mu+5*std, 500)
logreturns['GOOGL'].hist(bins=60, density=True, histtype="stepfilled", alpha=0.5)
x = np.linspace(mu - 3*std, mu+3*std, 500)
plt.plot(x, stats.norm.pdf(x, mu, std))
plt.title("Log return distribution for GOOGL")
plt.xlabel("Return")
plt.ylabel("Density")

# plot log return distribution
rows = 2
cols = 2
fig, axs = plt.subplots(rows, cols, figsize=(12,6))
ticker_n = 1
for i in range(rows):
for j in range(cols):
mu, std = stats.norm.fit(logreturns[tickers[ticker_n]])
x = np.linspace(mu-5*std, mu+5*std, 500)
axs[i,j].hist(logreturns[tickers[ticker_n]], bins=60, density=True, histtype="stepfilled", alpha=0.5)
axs[i,j].plot(x, stats.norm.pdf(x, mu, std))
axs[i,j].set_title("Log return distribution for "+tickers[ticker_n])
axs[i,j].set_xlabel("Return")
axs[i,j].set_ylabel("Density")
ticker_n = ticker_n + 1
plt.tight_layout()

​ 6.2 历史法计算风险价值 historical approach,这是一种全值估计方法 full revaluation,具体是指利用风险因子的历史数据,计算过去某段时期收益的频度分布,并以此来模拟风险因子的未来收益分布,然后根据置信水平,确定相应的最大可能损失。

​ 6.3 蒙特卡洛法计算风险价值 Monte Carlo simulation,这也是风险价值计算中最常应用的模型之一。首先通过分析历史数据建立风险因子的随机过程模型,然后反复模拟风险因子变量的随机过程,每一次模拟都可以得到风险因子的一个未来变化的情景,以及投资组合在持有期期末的一个可能价值。通过大量的模拟,投资组合价值的模拟分布将最终收敛于该组合的真实分布,根据该分布,可以计算风险价值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import pandas_datareader
import seaborn as sns

# 假设投资组合包含以下公司
tickers = ['GOOGL','FB','AAPL','NFLX','AMZN']
ticker_num = len(tickers)
price_data = []
for ticker in range(ticker_num):
prices = pandas_datareader.DataReader(tickers[ticker], start='2015-11-30', end = '2020-11-30', data_source='yahoo')
price_data.append(prices[['Adj Close']])
df_stocks = pd.concat(price_data, axis=1)
df_stocks.columns = tickers

# 然后计算股票的累积回报率
# cumulative returns
stock_return = []
for i in range(ticker_num):
return_tmp = np.log(df_stocks[[tickers[i]]]/df_stocks[[tickers[i]]].shift(1))[1:]
return_tmp = (return_tmp+1).cumprod()
stock_return.append(return_tmp[[tickers[i]]])
return_all = pd.concat(stock_return,axis=1)
return_all.head()

# 利用曲线更直观地展示所有股票的回报率
# plot cumulative returns of all stocks
plt.style.use('ggplot')
for i, col in enumerate(return_all.columns):
return_all[col].plot()
plt.title('Cumulative returns')
plt.xlabel('Date')
plt.ylabel('Return')
plt.xticks(rotation=30)
plt.legend(return_all.columns)

# 设定投资组合中各个股票的比重,并且在持有期内保持不变。进而计算得到整个投资组合的预期回报和股价
# lastest return and price values
latest_return = return_all.iloc[-1,:]
latest_price = df_stocks.iloc[-1,:]
sigma = latest_return.std()
# weights for stocks in the portfolio
stock_weight = [0.2, 0.3, 0.1, 0.15, 0.25]
# calculate expected return
expected_return = latest_return.dot(stock_weight)
print('The weighted expected portfolio return: %.2f' % expected_return)
# calculate weighted price
price = latest_price.dot(stock_weight)
print('The weighted price of the portfolio: %.0f' % price)

#假设该投资组合的回报率符合正态分布,以一天中的每一分钟作为步长,即分为1440个节点,利用蒙特卡洛模拟随机产生500个回报率数值。
# monte carlo simulation
MC_num = 500
confidence_level = 0.95
time_step = 1440
for i in range(MC_num):
daily_returns = np.random.normal(expected_return/time_step, sigma/np.sqrt(time_step), time_step)
plt.plot(daily_returns)
plt.axhline(np.percentile(daily_returns,(1.0-confidence_level)*100), color='r', linestyle='dashed')
plt.axhline(np.percentile(daily_returns,confidence_level*100), color='g', linestyle='dashed')
plt.axhline(np.mean(daily_returns), color='b', linestyle='solid')
plt.xlabel('Time')
plt.ylabel('Return')
# 可视化,红线处为风险价值
# plot return distribution
sns.distplot(daily_returns, kde=True, color='lightblue')
plt.axvline(np.percentile(daily_returns,(1.0-confidence_level)*100), color='red', linestyle='dashed', linewidth=2)
plt.title("Return distribution")
plt.xlabel('Return')
plt.ylabel('Frequency')
plt.show()

# 假设初始投资金额为100万美元,得到VaR值为 33185
initial_investment = 1000000
VaR = initial_investment*np.percentile(daily_returns,(1.0-confidence_level)*100)
print('The value at risk is %.0f' % VaR)

若为了获得更多的场景,更多的模拟,这里的计算量会迅速上升,从而导致整体的运算速度较慢。

关联阅读 - FMR-波动率