精华内容
下载资源
问答
  • The volatility index and style rotation Evidence from the Korean stock market and VKOSP
  • Relaxation dynamics of aftershocks after large volatility shocks in the SSEC index,牟国华,周炜星,The relaxation dynamics of aftershocks after large volatility shocks are investigated based on two ...
  • 论文可以通过以下链接http://papers.ssrn.com/abstract=2521545 找到。 程序计算已实现的波动率并应用 HAR 规范来生成提前一天的波动率预测。 特别感谢 Alev Atak 博士、Fulvio Corsi 博士和 Oleg Komarov。
  • [VINDX FRACDIM V_SIGMA COVERSIZE] = varIndx(LOW,HIGH) LOW 是柱中最低价格的列向量(秒、分钟、 等等)。 HIGH 是柱中最高价格的列向量。 VINDX 是数据的变异指数。 FRACDIM 是数据的分形维数。...
  • 内存取证-volatility工具的使用

    千次阅读 多人点赞 2021-05-11 05:01:55
    0x00 volatility介绍 Volatility是一款非常强大的内存取证工具,它是由来自全世界的数百位知名安全专家合作开发的一套工具, 可以用于windows,linux,mac osx,android等系统内存取证。Volatility是一款开源内存取证框架...

    0x00 volatility介绍

    Volatility是一款非常强大的内存取证工具,它是由来自全世界的数百位知名安全专家合作开发的一套工具, 可以用于windows,linux,mac osx,android等系统内存取证。Volatility是一款开源内存取证框架,能够对导出的内存镜像进行分析,通过获取内核数据结构,使用插件获取内存的详细情况以及系统的运行状态。

    在不同系统下都有不同的软件版本,官网地址:https://www.volatilityfoundation.org/26
    在这里插入图片描述
    目前已经有一段时间没有更新了,最新一次更新也是在2016年。
    在这里插入图片描述
    支持的内存格式还是很丰富的。
    在这里插入图片描述
    另外不同的版本下,也存在着一定命令上的差异,使用时需注意。

    生成内存dump文件的方式

    这里只介绍方式,具体的dump抓取操作方式自行研究。

    1.VMware虚拟机软件

    VM暂停虚拟后就可以看到vmem文件,是可以直接被volatility分析的。
    在这里插入图片描述

    2.使用第三方软件

    针对于物理机,可以使用如下工具来抓取内存dump

    KnTTools
    F-Response
    Mandiant Memoryze
    HBGary FastDump
    MoonSols Windows Memory Toolkit
    AccessData FTK Imager
    EnCase/WinEn
    Belkasoft Live RAM Capturer
    ATC-NY Windows Memory Reader
    Winpmem
    Win32dd/Win64dd
    DumpIt
    

    windows下可以使用AccessData FTK Imager来完成。

    3.CuckooSandbox

    Cuckoo沙箱在分析恶意样本后生成dump文件。

    官方地址:https://cuckoo.sh/docs/introduction/index.html


    0x01 volatility工具的基本使用

    命令格式

    volatility -f [image] --profile=[profile] [plugin]
    

    在分析之前,需要先判断当前的镜像信息,分析出是哪个操作系统

    volatility -f xxx.vmem imageinfo
    

    如果操作系统错误,是无法正确读取内存信息的,知道镜像后,就可以在--profile=中带上对应的操作系统

    常用插件

    下列命令以windows内存文件举例

    查看用户名密码信息

    volatility -f 1.vmem --profile=Win7SP1x64 hashdump
    

    查看进程

    volatility -f 1.vmem --profile=Win7SP1x64 pslist
    

    查看服务

    volatility -f 1.vmem --profile=Win7SP1x64 svcscan
    

    查看浏览器历史记录

    volatility -f 1.vmem --profile=Win7SP1x64 iehistory
    

    查看网络连接

    volatility -f 1.vmem --profile=Win7SP1x64 netscan
    

    查看命令行操作

    volatility -f 1.vmem --profile=Win7SP1x64 cmdscan
    

    查看文件

    volatility -f 1.vmem --profile=Win7SP1x64 filescan
    

    查看文件内容

    volatility -f 1.vmem --profile=Win7SP1x64 dumpfiles -Q 0xxxxxxxx -D ./
    

    查看当前展示的notepad内容

    volatility -f 1.vmem --profile=Win7SP1x64 notepad
    

    提取进程

    volatility -f 1.vmem --profile=Win7SP1x64 memdump -p xxx --dump-dir=./
    

    屏幕截图

    volatility -f 1.vmem --profile=Win7SP1x64 screenshot --dump-dir=./
    

    查看注册表配置单元

    volatility -f 1.vmem --profile=Win7SP1x64 hivelist
    

    查看注册表键名

    volatility -f 1.vmem --profile=Win7SP1x64 hivedump -o 0xfffff8a001032410
    

    查看注册表键值

    volatility -f 1.vmem --profile=Win7SP1x64 printkey -K "xxxxxxx"
    

    查看运行程序相关的记录,比如最后一次更新时间,运行过的次数等。

    volatility -f 1.vmem --profile=Win7SP1x64 userassist
    

    最大程序提取信息

    volatility -f 1.vmem --profile=Win7SP1x64 timeliner
    

    0x02 volatility实例

    46届世界技能大赛湖北省选拔赛-数字取证

    • 提供文件如下:worldskills3.vmem,提取码: czjb
    • 任务描述:某日你获取了一个内存文件,请分析文件完成以下任务。

    任务(一) 获取admin用户密码是多少 ?

    先通过imageinfo获取系统信息
    在这里插入图片描述
    使用hashdump获取sam
    在这里插入图片描述
    可以通过john工具来进行爆破,但是好像跑不出来结果。应该是设定了强密码。于是只能使用了lasdump命令来查看
    在这里插入图片描述

    任务(二) 获ip和主机名是什么?

    通过netscan可以查询到地址
    在这里插入图片描述
    主机名需要通过查询注册表,先用hivelist
    在这里插入图片描述
    通过hivedump查询对应键名volatility -f worldskills3.vmem --profile=Win7SP1x64 hivedump -o 0xfffff8a000024010 > system.txt;cat system.txt|grep name,这个速度比较慢。
    在这里插入图片描述
    如果知道键名的话,可以直接查询键值
    在这里插入图片描述

    任务(三) 获取桌面上的 flag.txt中的文件内容是什么

    先用filescan扫描文件
    在这里插入图片描述
    接着使用dumpfiles爆破文件内容
    在这里插入图片描述
    然后文件内容即可看到结果
    在这里插入图片描述

    任务(四) 服务器中存在一个挖矿病毒 矿池地址是?

    查看netscan的内容,惟一一个建立了连接的就是矿池地址
    在这里插入图片描述

    任务(五)恶意代码在系统中注册了服务 服务名是什么?

    上一题中已经知道了进程号为2588
    在这里插入图片描述
    查询进程的父进程为3036,通过svcscan可以查询服务名称,找到对应服务名
    在这里插入图片描述

    任务(六) 获取恶意代码的进程名pid。

    由上两题可知,2588和3036都是恶意进程的ID,即为svcst.exe和load.exe
    在这里插入图片描述

    任务(七) 病毒在自我删除时执行的命令是什么?(病毒进入系统后会删除原始文件,请获取文件删除时执行的命令)

    通过memdump爆出loader.exe的进程对应的内存信息
    在这里插入图片描述
    在内存文件中查寻del关键字
    在这里插入图片描述
    但是感觉差了一点什么,/c前面应该是少了一个cmd.exe,而且del后面应该也少点什么,先这样了,回头有空再弄。

    展开全文
  • 利用python测试volatility策略

    一、Strategy:

    hold S&P 500 ETF when volatility is low, when vol is high be in cash.

    二、知识点

    1.从雅虎获取历史行情,并转化成df。

    2.plot展示(原来的代码没有显示Figure,后来加了plt.show()才显示。

    三、代码:

    import pandas as pd

    import matplotlib.pyplot as plt

    def load_equities_web(symbol, date_from):

    import pandas_datareader.data as web

    raw_data = web.DataReader(symbol, 'yahoo', pd.to_datetime(date_from), pd.datetime.now())

    data = raw_data.stack(dropna=False)['Adj Close'].to_frame().reset_index().rename(columns = {'Symbols':'symbol', 'Date':'date', 'Adj Close':'value'}).sort_values(by = ['symbol', 'date'])

    return pd.pivot_table(data, columns = 'symbol', index = 'date', values ='value')

    prices = load_equities_web(['SPY', '^GSPC', '^VIX'], date_from = '2000-01-01')

    def backtest_strategy(prices, symbol_trade, symbol_volatility, volatility_threshold, capital, symbol_benchmark):

    df_init = (prices[symbol_trade]*0).to_frame().assign(cash = 0)

    df_update = (prices[symbol_trade]*0).to_frame().assign(cash = 0)

    df_end = (prices[symbol_trade]*0).to_frame().assign(cash = 0)

    df_init.iloc[0, df_init.columns.get_loc('cash')] = capital

    df_end.iloc[0, df_end.columns.get_loc('cash')] = capital

    calendar = pd.Series(prices.index).iloc[1:]

    for date in calendar:

    prev_date = df_init.index[df_init.index

    df_init.loc[date, :] = df_end.loc[prev_date, :]

    port_value = df_init.loc[date, symbol_trade] * prices.loc[date, symbol_trade] + df_init.loc[date, 'cash']

    if prices.loc[date, symbol_volatility] > volatility_threshold: # volatility is high -> be fully in cash

    df_end.loc[date, symbol_trade] = 0

    df_end.loc[date, 'cash'] = port_value

    else: # volatility is low -> be in market position

    df_end.loc[date, symbol_trade] = port_value/prices.loc[date, symbol_trade]

    df_end.loc[date, 'cash'] = 0

    df_update.loc[date] = df_end.loc[date] - df_init.loc[date]

    portval = (df_end*prices.assign(cash = 1)[[symbol_trade, 'cash']]).sum(axis = 1).to_frame().rename(columns = {0:'strategy'})

    portval['benchmark'] = prices[symbol_benchmark]

    portval = portval/portval.iloc[0].values

    return portval

    res = backtest_strategy(prices = prices, symbol_trade = 'SPY', symbol_volatility = '^VIX', volatility_threshold = 20, capital = 10000, symbol_benchmark = '^GSPC')

    print(res)

    res.plot()

    plt.show()

    四、成果展示

    展开全文
  • 对数收益率(Log Return) 已实现波动率Realized volatility 竞赛数据Competition data 订单簿数据快照 **交易数据快照** **Realized volatility calculation in python** 让我们绘制该工具在此时间段内的逐笔回报 ...

    Optiver波动率预测

    本篇博客是对Kaggle竞赛Optiver Realized Volatility Prediction中金融概念与数据介绍笔记本的翻译。
    原文请点击这里

    概述

    波动性(Volatility)**是您在任何交易大厅都会听到的最重要的术语之一——这是有充分理由的。 在金融市场中,波动率反映了价格的波动幅度。 高波动性与市场动荡时期和价格大幅波动有关,而低波动性则描述更平静和安静的市场。 对于像 Optiver 这样的交易公司来说,准确预测波动率对于期权交易至关重要,期权的价格与标的产品的波动率直接相关。

    作为全球领先的电子做市商,Optiver 致力于不断改善金融市场,为全球众多交易所的期权、ETF、现金股票、债券和外币创造更好的准入和价格。 Optiver 的团队花费了无数个小时来构建复杂的模型,以预测波动性并不断为最终投资者生成更公平的期权价格。然而,行业领先的定价算法永远不会停止发展,没有比 Kaggle 更好的地方可以帮助 Optiver 将其模型提升到一个新的水平。

    在本次比赛的前三个月,您将构建模型来预测不同行业数百只股票的短期波动。您将拥有触手可及的数亿行高度细化的财务数据,您将利用这些数据设计预测 10 分钟内波动率的模型。您的模型将根据训练后三个月评估期内收集的真实市场数据进行评估。

    通过本次比赛,您将获得对波动性和金融市场结构的宝贵洞察。您还将更好地了解 Optiver 几十年来面临的数据科学问题。我们期待看到 Kaggle 社区将创造性的方法应用于这个复杂但令人兴奋的交易挑战。

    为了让 Kagglers 更好地为这次比赛做好准备,Optiver 的数据科学家创建了一个教程笔记本 汇报本次交易挑战的竞争数据和相关财务概念。 此外,Optiver 的在线课程可以告诉您更多有关金融市场和做市商的信息。

    评估

    提交将使用百分比均方根误差进行评估,定义如下:
    RMSPE = 1 n ∑ i = 1 n ( ( y i − y ^ i ) / y i ) 2 \text{RMSPE} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} ((y_i - \hat{y}_i)/y_i)^2} RMSPE=n1i=1n((yiy^i)/yi)2
    提交文件:对于测试集中的每个 row_id,您必须预测目标变量。 该文件应包含标题并具有以下格式:

    row_id,target
    0-0,0.003
    0-1,0.002
    0-2,0.001
    ...
    

    并且必须通过Notebooks来提交代码,运行时间不能超过九个小时。

    • 禁用互联网访问
    • 允许免费和公开可用的外部数据,包括预先训练的模型
    • 提交文件必须被命名为 submission.csv

    时间线

    这是一个具有活跃训练阶段和模型将针对真实市场数据运行的第二阶段的预测竞赛。

    • 2021年6月28日,开始
    • 2021年9月20日,报名截止,您必须在此日期之前接受比赛规则才能参加比赛。
    • 2021 年 9 月 20 日, 团队合并截止日期。 这是参与者可以加入或合并团队的最后一天。
    • 2021年9月27日,最终提交的截止日期。

    除非另有说明,所有截止日期均为 UTC 相应日期晚上 11:59。 比赛组织者保留在其认为必要时更新比赛时间表的权利。

    预测时间线

    在最终提交截止日期之后,排行榜将定期更新,以反映将针对选定笔记本运行的市场数据更新。

    2022 年 1 月 10 日 - 比赛结束日期

    金融概念与数据介绍

    为了让 Kagglers 更好地为这场比赛做好准备,Optiver 的数据科学家创建了一个教程笔记本,循环介绍了这一特定交易挑战中涵盖的一些金融概念。 此外,数据结构和示例代码提交也将在此笔记本中呈现。

    订单簿(Order Book)

    术语订单簿(Order Book)是指按价格水平组织的特定证券或金融工具的买卖订单电子清单。 订单簿列出了在每个价格点上出价或提供的股票数量

    下面是股票(Stock)(我们称之为股票 A)的订单簿的快照,如您所见,所有预期的买单(buy orders)都在书的左侧显示为“出价(bid)”,而所有预期的卖单都在右侧 书的一面显示为“要约(offer)/要价(ask)

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NCx7eLa2-1628163728279)(https://www.optiver.com/wp-content/uploads/2021/05/OrderBook3.png)]

    交易活跃的金融工具总是有一个密集的订单簿(流动账簿)。 由于订单簿数据是市场需求/供应的连续表示,因此它始终被视为市场研究的第一大数据源。

    交易(Trade)

    订单簿是市场交易意图的表示,但市场需要以相同价格的买方和卖方才能进行交易。 因此,有时当有人想要进行股票交易时,他们会查看订单簿并找到有相反兴趣的人进行交易。

    例如,假设您想购买 20 股 股票A,而您有上一段中的订单簿。 然后,您需要找到一些愿意通过总共卖出 20 股或更多股票来与您进行交易的人。 您从最低价开始检查订单簿的报价方:在 148 的水平上有 221 股的卖出兴趣。您可以以 148 的价格举起 20 股并保证您的执行。 这将是您交易后生成的股票 A 订单簿:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dBqa8M7l-1628163728280)(https://www.optiver.com/wp-content/uploads/2021/05/OrderBook4.png)]

    在这个案例中,出售者卖出了20股股票,买家买入了20股股票,交易所将匹配卖家和买家之间的订单,并向公众广播一条交易消息。

    20股A股以148的价格在市场上交易。
    

    与订单簿数据类似,交易数据对Optiver数据科学家同样至关重要,因为它反映了市场的活跃程度。实际上,金融市场的一些常见技术信号是直接从交易数据中得出的,例如高低总交易量

    做市与市场效率

    想象一下,在另一天,股票 A 的订单簿变得低于模型(shape),而您又想从所有有意卖家那里购买 20 股。 正如你所看到的,这本订单簿没有上一本那么密集,可以说,与上一本相比,这本书流动性较差。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0WB9jxVD-1628163728282)(https://www.optiver.com/wp-content/uploads/2021/05/OrderBook5.png)]

    您可以插入一个在 148 买入的订单。但是,目前没有人愿意在 148 向您卖出,所以您的订单将被放置在账簿中,等待有人与它进行交易。 如果运气不好,价格就会上涨,其他人会以 149 开始出价,而您根本就买不到。 或者,您可以插入一个以 155 买入的订单。交易所会将此订单与未完成的 149 股的卖出订单进行匹配,因此您以 149 买入 1 手。同样,您将以 150 的价格买入 12 股 , 以及 7 股 151。与尝试以 148 买入相比,不存在无法获得所需交易的风险,但最终以更高的价格买入。

    您可以看到在这样一个低效的市场中很难交易,因为交易会更加昂贵,如果您希望订单的质量执行,您需要应对更高的市场风险。 这就是为什么投资者喜欢流动性,而无论市场条件多么极端,像 Optiver 这样的做市商都会提供它。

    做市商是主动对证券的双向市场报价的公司或个人,提供买价和卖价(称为要价)以及每个的市场规模。 由于做市商会同时显示买入和卖出订单,因此有做市商存在的订单簿将更具流动性,因此将为最终投资者提供更有效的市场,可以自由交易而无需担心执行。

    订单簿统计数据

    Optiver 数据科学家可以从原始订单簿数据中得出很多统计数据,以反映市场流动性和股票估值。 这些统计数据被证明是任何市场预测算法的基本输入。 下面我们想列出一些常见的统计数据,以激励 Kagglers 从订单数据中挖掘更有价值的信号。

    买卖差价(Bid/Ask Spread)

    由于不同股票在市场上的交易水平不同,我们采用最佳报价和最佳买入价的比率来计算买卖价差。

    买卖价差的公式可以写成以下形式:
    B i d A s k S p r e a d = B e s t O f f e r / B e s t B i d − 1 BidAskSpread = BestOffer/BestBid -1 BidAskSpread=BestOffer/BestBid1

    加权平均价格(Weighted averaged price)

    订单簿也是股票估值的主要来源之一。 公平的账面估值必须考虑两个因素:订单的水平(level)和规模(size)。 在本次比赛中,我们使用加权平均价格 (WAP) 来计算瞬时股票估值并计算已实现的波动率作为我们的目标。

    WAP的公式可以写成如下,它考虑了顶级价格和数量信息:
    W A P = B i d P r i c e 1 ∗ A s k S i z e 1 + A s k P r i c e 1 ∗ B i d S i z e 1 B i d S i z e 1 + A s k S i z e 1 WAP = \frac{BidPrice_{1}*AskSize_{1} + AskPrice_{1}*BidSize_{1}}{BidSize_{1} + AskSize_{1}} WAP=BidSize1+AskSize1BidPrice1AskSize1+AskPrice1BidSize1
    如您所见,如果两本订单簿的买入价和卖出价分别处于相同的价格水平,则报价越多的书将产生较低的股票估值,因为书中有更多的潜在卖家,而更多的卖家意味着 市场上更多的供应导致股票估值更低。

    请注意,在大多数情况下,在连续交易时间内,订单簿不应出现买单高于要约(offer)或要价(ask)的情况。 换句话说,最有可能的是,买入价(bid)和卖出价(ask)永远不应该交叉。

    在本次比赛中,目标是从 WAP 构建的。 订单簿快照的 WAP 为 147.5317797。

    对数收益率(Log Return)

    我们如何比较昨天和今天的股票价格?

    最简单的方法就是取差额。 这绝对是最直观的方式,但是不同股票的价格差异并不总是具有可比性。 例如,假设我们在股票 A 和股票 B 上都投资了 1000 美元,股票 A 从 100 美元涨到 102 美元,股票 B 从 10 美元涨到 11 美元。我们总共有 10 股 A ( 1000 / 100 = 10 ) ( 1000 / 100=10 ) (1000/100=10) 这导致了 10 ⋅ ( 102 − 100 ) = 20 10⋅(102−100)=20 10(102100)=20 的利润和总共 100 股 B 的股票,产生了 $100。 因此,股票 A 的价格涨幅更大,然而股票 B 的涨幅按比例要大得多。

    我们可以通过将变化量除以股票的起始价格来解决上述问题,有效地计算价格变化的百分比,也称为股票收益(stock return)。 在我们的例子中,股票 A 的回报是 $(102−100)/100=2% $ ,而股票 B 的回报是 ( 11 − 10 ) 10 = 10 (11−10)10=10% (1110)10=10股票回报(Return)与我们投资资本的百分比变化一致。

    收益率在金融中被广泛使用,但是当需要一些数学建模时,对数回报是首选。 将 St 称为股票 S 在时间 t 的价格,我们可以将 t1 和 t2 之间的对数收益定义为:
    r t 1 , t 2 = log ⁡ ( S t 2 S t 1 ) r_{t_1, t_2} = \log \left( \frac{S_{t_2}}{S_{t_1}} \right) rt1,t2=log(St1St2)
    通常来说,我们查看固定时间间隔内的日志回报,因此我们的意思是 10 分钟的对数收益率
    r t = r t − 10 m i n , t r_t=r_{t-10min,t} rt=rt10min,t
    对数收益率有几个优点,例如:

    • 它们随着时间的推移是可加的
      r t 1 , t 2 + r t 2 , t 3 = r t 1 , t 3 r_{t_1, t_2} + r_{t_2, t_3} = r_{t_1, t_3} rt1,t2+rt2,t3=rt1,t3

    • 常规收益率不能低于 -100%,而对数收益率不受限制

    已实现波动率Realized volatility

    当我们交易期权options时,我们模型的一个有价值的输入是股票对数收益率的标准差。 在更长或更短的时间间隔内计算的对数收益率的标准差会有所不同,因此它通常被标准化为 1 年期,年化标准差称为波动率

    在本次比赛中,您将获得 10 分钟的账面数据,我们要求您预测接下来 10 分钟的波动性。 波动率将按如下方式测量:

    我们将计算所有连续账簿更新的对数收益率,并将实现的波动率 σ 定义为对数收益率平方和的平方根
    σ = ∑ t r t − 1 , t 2 \sigma = \sqrt{\sum_{t}r_{t-1, t}^2} σ=trt1,t2
    其中我们使用 WAP 作为股票价格来计算对数收益率。

    我们希望定义尽可能简单明了,这样没有金融知识的 Kagglers 就不会受到惩罚。 所以我们没有对波动率进行年化,我们假设对数回报的平均值为 0。

    竞赛数据Competition data

    在本次比赛中,Kagglers 面临的挑战是从固定 10 分钟窗口的账面和交易数据中生成一系列短期信号,以预测下一个 10 分钟窗口的已实现波动率。 在 train/test.csv 中给出的目标可以通过相同的 time_id 和 stock_id 与原始订单簿/交易数据链接。 特征和目标窗口之间没有重叠。

    请注意,比赛数据将附带分区的账面和交易数据文件。 您可以在此 notebook 中找到有关账面和交易数据文件处理的教程。

    In[1]:

    import pandas as pd
    import numpy as np
    import plotly.express as px
    train = pd.read_csv('../input/optiver-realized-volatility-prediction/train.csv')
    train.head()
    

    Out[1]:

    stock_idtime_idtarget
    0050.004136
    10110.001445
    20160.002168
    30310.002195
    40620.001747

    取第一行数据,表示time_id 5、stock_id 0的目标bucket的实现vol为0.004136。 特征桶中的账簿和交易数据如何构建信号?

    In[2]:

    book_example = pd.read_parquet('../input/optiver-realized-volatility-prediction/book_train.parquet/stock_id=0')
    trade_example =  pd.read_parquet('../input/optiver-realized-volatility-prediction/trade_train.parquet/stock_id=0')
    stock_id = '0'
    book_example = book_example[book_example['time_id']==5]
    book_example.loc[:,'stock_id'] = stock_id
    trade_example = trade_example[trade_example['time_id']==5]
    trade_example.loc[:,'stock_id'] = stock_id
    
    订单簿数据快照

    In[3]:

    book_example.head()
    

    Out[3]:

    time_idseconds_in_bucketbid_price1ask_price1bid_price2ask_price2bid_size1ask_size1bid_size2ask_size2stock_id
    0501.0014221.0023011.001371.002353322621000
    1511.0014221.0023011.001371.002353310021000
    2551.0014221.0023011.001371.002405310021000
    3561.0014221.0023011.001371.002405312621000
    4571.0014221.0023011.001371.002405312621000
    交易数据快照

    In[4]:

    trade_example.head()
    

    Out[4]:

    time_idseconds_in_bucketpricesizeorder_countstock_id
    05211.002301326120
    15461.00277812840
    25501.0028185510
    35571.00315512150
    45681.003646410
    Realized volatility calculation in python

    在这场比赛中,我们的目标是预测短期的已实现波动率。 虽然无法共享目标的订单簿和交易数据,但我们仍然可以使用我们提供的特征数据呈现已实现的波动率计算。

    由于已实现波动率是给定股票价格变化的统计量度,为了计算价格变化,我们首先需要在固定时间间隔(1 秒)进行股票估值。 我们将使用我们提供的订单簿数据的加权平均价格或 WAP。

    book_example['wap'] = (book_example['bid_price1'] * book_example['ask_size1'] +
                                    book_example['ask_price1'] * book_example['bid_size1']) / (
                                           book_example['bid_size1']+ book_example['ask_size1'])
    

    以下绘制股票的WAP

    fig = px.line(book_example, x="seconds_in_bucket", y="wap", title='WAP of stock_id_0, time_id_5')
    fig.show()
    

    在这里插入图片描述

    为了计算对数回报,我们可以简单地取两个连续 WAP 之间的比率的对数。 第一行将有一个空的回报,因为之前的书籍更新是未知的,因此空的回报数据点将被删除。

    def log_return(list_stock_prices):
        return np.log(list_stock_prices).diff() 
    
    book_example.loc[:,'log_return'] = log_return(book_example['wap'])
    book_example = book_example[~book_example['log_return'].isnull()]
    
    让我们绘制该工具在此时间段内的逐笔回报
    fig = px.line(book_example, x="seconds_in_bucket", y="log_return", title='Log return of stock_id_0, time_id_5')
    fig.show()
    

    在这里插入图片描述

    此特征桶中股票 0 的已实现成交量将是:

    In[10]:

    def realized_volatility(series_log_return):
        return np.sqrt(np.sum(series_log_return**2))
    realized_vol = realized_volatility(book_example['log_return'])
    print(f'Realized volatility for stock_id 0 on time_id 5 is {realized_vol}')
    
    Realized volatility for stock_id 0 on time_id 5 is 0.004499364172786558
    

    朴素预测:使用过去的已实现波动率作为目标

    关于波动率的一个众所周知的事实是它往往是自相关的。 我们可以使用此属性来实现一个简单的模型,该模型仅通过使用最初 10 分钟内已实现的波动率来“预测”已实现的波动率。

    让我们计算整个训练集过去实现的波动率,看看单个原始信号的预测能力如何。

    import os
    from sklearn.metrics import r2_score
    import glob
    list_order_book_file_train = glob.glob('/kaggle/input/optiver-realized-volatility-prediction/book_train.parquet/*')
    

    由于本次比赛中数据通过stock_id进行分区,以便Kagglers更好地管理内存,因此我们尝试逐个计算已实现的波动率股票并将它们合并为一个提交文件。 请注意,如果我们加载单个文件,作为分区列的股票 ID 不存在,因此我们将手动修复。 我们将重用上一课中定义的对数返回和已实现的波动率函数。

    def realized_volatility_per_time_id(file_path, prediction_column_name):
        df_book_data = pd.read_parquet(file_path)
        df_book_data['wap'] =(df_book_data['bid_price1'] * df_book_data['ask_size1']+df_book_data['ask_price1'] * df_book_data['bid_size1'])  / (
                                          df_book_data['bid_size1']+ df_book_data[
                                      'ask_size1'])
        df_book_data['log_return'] = df_book_data.groupby(['time_id'])['wap'].apply(log_return)
        df_book_data = df_book_data[~df_book_data['log_return'].isnull()]
        df_realized_vol_per_stock =  pd.DataFrame(df_book_data.groupby(['time_id'])['log_return'].agg(realized_volatility)).reset_index()
        df_realized_vol_per_stock = df_realized_vol_per_stock.rename(columns = {'log_return':prediction_column_name})
        stock_id = file_path.split('=')[1]
        df_realized_vol_per_stock['row_id'] = df_realized_vol_per_stock['time_id'].apply(lambda x:f'{stock_id}-{x}')
        return df_realized_vol_per_stock[['row_id',prediction_column_name]]
    

    遍历每只个股,我们可以得到过去实现的波动率作为对每只个股的预测。

    def past_realized_volatility_per_stock(list_file,prediction_column_name):
        df_past_realized = pd.DataFrame()
        for file in list_file:
            df_past_realized = pd.concat([df_past_realized,
                                         realized_volatility_per_time_id(file,prediction_column_name)])
        return df_past_realized
    df_past_realized_train = past_realized_volatility_per_stock(list_file=list_order_book_file_train,
                                                               prediction_column_name='pred')
    

    让我们将输出数据帧train.csv连接起来,看看在训练集上的朴素预测的性能。

    train['row_id'] = train['stock_id'].astype(str) + '-' + train['time_id'].astype(str)
    train = train[['row_id','target']]
    df_joined = train.merge(df_past_realized_train[['row_id','pred']], on = ['row_id'], how = 'left')
    

    我们将通过两个指标评估朴素预测结果:RMSPE 和 R 平方。

    from sklearn.metrics import r2_score
    def rmspe(y_true, y_pred):
        return  (np.sqrt(np.mean(np.square((y_true - y_pred) / y_true))))
    R2 = round(r2_score(y_true = df_joined['target'], y_pred = df_joined['pred']),3)
    RMSPE = round(rmspe(y_true = df_joined['target'], y_pred = df_joined['pred']),3)
    print(f'Performance of the naive prediction: R2 score: {R2}, RMSPE: {RMSPE}')
    
    Performance of the naive prediction: R2 score: 0.628, RMSPE: 0.341
    

    naive 模型的性能并不惊人,但作为基准,它是一个合理的开始。

    提交submission

    作为最后一步,我们将通过教程笔记本进行提交——通过写入输出文件夹的文件。朴素方法的提交在公共LB上获得了RMSE 0.327,改进空间肯定很大!

    list_order_book_file_test = glob.glob('/kaggle/input/optiver-realized-volatility-prediction/book_test.parquet/*')
    df_naive_pred_test = past_realized_volatility_per_stock(list_file=list_order_book_file_test,
                                                               prediction_column_name='target')
    df_naive_pred_test.to_csv('submission.csv',index = False)
    

    请注意,在本次比赛中,可以下载的测试数据只有几行。 在您提交笔记本并手动提交输出后,实际的评估程序将在后台运行。 请检查代码要求以获取更多解释。

    私人排行榜将根据训练期后收集的真实市场数据构建,因此公共和私人排行榜数据将零重叠。 让您的模型在实时市场上进行测试将是令人兴奋的! 由于本次比赛将提供一个非常丰富的数据集,代表市场微观结构,因此可以提出无限量的信号。 一切都在你身上,祝你好运! 我们 Optiver 非常期待向才华横溢的 Kaggle 社区学习!

    如果您对此笔记本或其背后的财务概念有任何疑问,请随时在评论部分提问,我们将确保您的问题得到解答。

    展开全文
  • 目录Average True Range (ATR)计算操作Bollinger Bands计算操作Bollinger BandWidth%BUlcer Index计算 Average True Range (ATR) 参考:...

    Average True Range (ATR)

    参考:https://www.thebalance.com/how-average-true-range-atr-can-improve-trading-4154923
    https://school.stockcharts.com/doku.php?id=technical_indicators:average_true_range_atr

    衡量波动率的指标。需要注意:ATR 不提供价格方向的指示,仅提供波动性。

    计算

    Current ATR = [(Prior ATR x 13) + Current TR] / 14
    
      - Multiply the previous 14-day ATR by 13.
      - Add the most recent day's TR value.
      - Divide the total by 14
    

    操作

    可以使用 ATR 来进行止损和止盈。

    经验法则是将 ATR 乘以 2 以确定合理的止损点。因此,如果您购买股票,您可能会在低于入场价的 ATR 两倍的水平上设置止损。如果你做空一只股票,你会在比入场价高出两倍 ATR 的水平上设置止损。

    日内交易者可以使用一分钟 ATR 来估计价格在 5 分钟或 10 分钟内可以移动多少。

    Bollinger Bands

    参考:https://www.investopedia.com/trading/using-bollinger-bands-to-gauge-trends/

    布林带属于一种均值回归策略,适合用在区间波动行情上。

    均值回归假设:如果价格显着偏离均值或平均值,则最终会回归均值。

    计算

      * Middle Band = 20-day simple moving average (SMA)
      * Upper Band = 20-day SMA + (20-day standard deviation of price x 2) 
      * Lower Band = 20-day SMA - (20-day standard deviation of price x 2)
    

    操作

    当股票价格持续触及 Bollinger Band 上限时,价格被认为超买;相反,当它们持续触及下限时,价格被认为超卖,触发买入信号。

    也可以设置多个不同阈值的布林带。比如用 +1 SD 和 +2 SD 来定义上升趋势,用 -1 SD 和 -2 SD 来定义下降趋势。

    Bollinger BandWidth

    带宽测量上频带和下频带之间的百分比差异。带宽随着布林带变窄而减小,随着布林带变宽而增加。因为布林带基于标准差,下降的带宽反映了波动性的下降,上升的带宽反映了波动性的增加。

    ( (Upper Band - Lower Band) / Middle Band) * 100
    

    %B

    高于 0.80 的读数表明价格接近上限。低于 0.20 的读数表明价格接近下限。向上波段的飙升显示出力量,但有时可以解释为超买。跌至较低的波段表明疲软,但有时可以解释为超卖。在很大程度上取决于潜在趋势和其他指标。虽然 %B 本身可以有一些价值,但最好与其他指标或价格分析结合使用。

    %B = (Price - Lower Band)/(Upper Band - Lower Band)
    

    Ulcer Index

    只关注下行风险(downside risk)。原因是:该指数是共同基金(mutual funds)所设计,共同基金唯一的风险是唯一的风险是回撤或下跌。

    计算

    Percent-Drawdown = ((Close - 14-period Max Close)/14-period Max Close) x 100
    
    Squared Average = (14-period Sum of Percent-Drawdown Squared)/14 
    
    Ulcer Index = Square Root of Squared Average
    

    操作

    Ulcer Index 衡量价格从早期高点下跌的深度和持续时间。价值下降幅度越大,恢复到早期高点所需的时间越长,用户界面就越高。从技术上讲,它是价值下降的平方百分比平均值的平方根。平方效应对大回撤的惩罚比小回撤的比例要大。

    Donchian Channels

    参考:https://www.investopedia.com/terms/d/donchianchannels.asp

    Donchian Channels 确定当前价格和预定时期内交易范围之间的比较关系。三个值构建了价格随时间变化的视觉图,类似于布林带,指示所选时期的看涨和看跌程度。

    计算

    在这里插入图片描述

    在这里插入图片描述

    操作

    顶线确定了看涨能量的程度,突出了该时期通过牛熊冲突(bull-bear conflict)实现的最高价格。中心线标识了该时期的中值或均值回归价格,突出了该时期通过牛熊冲突实现的中间立场。底线确定了看跌能量的程度,突出了牛熊冲突期间达到的最低价格。

    和布林带相比

    布林带由于采用的是价格的标准差,因此更加平衡,能够减少极大值或极小值的影响。

    Keltner Channels

    Keltner Channels 是基于波动率的包络,设置在指数移动平均线之上和之下。该指标类似于布林带,后者使用标准差来设置带。Keltner Channels 不使用标准偏差,而是使用平均真实范围 (ATR)来设置通道距离

    Keltner Channels 是一种趋势跟踪指标,用于识别通道突破和通道方向的反转。当趋势平坦时,通道还可用于识别超买和超卖水平。

    计算

    Middle Line: 20-day exponential moving average 
    Upper Channel Line: 20-day EMA + (2 x ATR(10))
    Lower Channel Line: 20-day EMA - (2 x ATR(10))
    

    操作

    主要看实际价格走势和区间的关系,注意一些突破性的价格趋势。(在这些突破点可以加上一些相关的features)

    在平稳的区间内,可以用其确定超买、超卖水平。

    与 Bollinger Bands 相比

    布林带使用的是标准差,而Keltner Channels 使用的是 ATR 。ATR 相比于标准差更加稳定。因此 Keltner Channels 有更加恒定的宽度,非常适合趋势跟踪和趋势识别。

    Trend 和 Momentum 的区别

    参考:https://www.investopedia.com/ask/answers/121614/what-are-main-differences-between-momentum-and-trend.asp

    尽管它们最初看起来很相似,但动量和趋势的概念之间存在真正的差异。它们是两种非竞争技术(non-competing techniques),旨在确定在上涨(upswing)时买入并在下跌(downswing)时卖出的机会,从而相互支持或拒绝对方。

    动量如何在技术分析中发挥作用

    动量是领先/向前的(forward-looking)

    动量投资和交易依赖于价格对其供求强度做出反应(至少部分地)的假设(assumption that prices respond (at least in part) to the strength of their supply and demand inputs)

    动量有多种形式。它可以基于上市公司的收益报告、市场买家和卖家之间的关系,甚至是历史价格上涨和下跌的典型速度。从某种意义上说,动量交易可能与技术分析的基本面自相矛盾。

    动量没有内在的量化特性,因此大多数基于动量的交易工具将使用公式为不同程度的动量分配价值。这些振荡器中的许多 将在有界范围内进一步绘制这些值,从而允许过去和当前动量趋势之间的跨期比较。这样,动量成为技术分析中最常见的领先指标(leading indicators)

    趋势如何在技术分析中发挥作用

    趋势是滞后的(backward-looking)

    趋势跟踪指标通常不那么主观和雄心勃勃(less subjective and ambitious than momentum indicators)。如果动量是基本的和偶然的,那么趋势就是大局和巧​​合。趋势不一定被视为因果关系,这可能是两者之间最基本的区别

    最常见的趋势分析形式是移动平均指标。移动平均线只是将各个历史数据混合在一起以寻找有意义的模式的直观表示。这并不是说趋势不能预测——而是它们为其他指标(例如动量振荡器)奠定了基础(That is not to say that trends cannot be predictive – rather that they lay the groundwork for other indicators)。它们是典型的滞后工具(lagging tools)

    展开全文
  • Index [ 'unsigned char' ] 0x2c : TotalNumberOfObjects [ 'unsigned long' ] 存在于该系统中的特定对象类型对象的总数 0x30 : TotalNumberOfHandles [ 'unsigned long' ] 此特定类型对象打开句柄的总数 0x...
  • Black Scholes Model & Implied Volatility

    千次阅读 2019-02-24 21:08:53
    cleaned_data.set_index(['index'], inplace = True) cleaned_data BidVolP = [] BidVolC = [] AskVolP = [] AskVolC = [] for i in range(len(cleaned_data)): if cleaned_data['Type'][i] == 'P': BidVolP....
  • df.date[i]=datetime.strptime(df.date[i],'%d-%b-%y') df = df.set_index('date') df df["daily return"] = df.pct_change() df.head() df.dropna() df = df.resample("M", closed = "right",label="right").std()...
  • Volatility Trading》 by Euan SinclairChapter 3 收益率和波动率的典型事实典型事实列表波动率并非常数收益率分布的特征成交量和波动率波动率分布 Chapter 3 收益率和波动率的典型事实 《波动率交易》一书阅读...
  • Volatility中Windows有关的插件功能说明

    千次阅读 2018-03-02 17:17:27
    iehistory:恢复ie历史记录index.dat缓存的文件。可以找到基本的访问链接(通过FTP和HTTP),重定向链接和已经删除的条目。适用于任何加载和使用wininet.dll库的任何进程,不仅仅限于Internet Explore 核心内存和对象 ...
  • 但是Python是可以用来编写大型的项目的,比如: Volatility:https://code.google.com/p/volatility/ Cuckoo:http://cuckoosandbox.org/index.html 1. ctypes库 http://docs.python.org/2/lib...
  • The role of news sentiment in oil futures returns and volatility forecasting: data-decomposition based deep learning approach 新闻情绪在石油期货收益率和波动率预测中的作用:基于数据分解的深度学习方法 ...
  • 参数说明: pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=(’_x’, ‘_y’), copy=True, indicator=False, validate=...
  • Anderson and Danthine (1983) hypothesize that the key determinant of volatility is the time at which the production uncertainty is resolved.The uncertainty resolution is seasonal, for ins.
  • 1.简介 Java 语言包含两种内在的同步机制:同步块(或...http://www.ibm.com/developerworks/java/library/j-jtp06197/index.html http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html
  • Smales (2017) introduces CBOE Volatility Index (VIX) as a measure of investor fears and in- vestigates the relationship between VIX and stock returns. Kostopoulos et al. (2020) apply Google search ...
  • typora-copy-images-to: Risk Management and Financial ...文章目录typora-copy-images-to: Risk Management and Financial InstitutionRisk management and Financial Institution Chapter 10 —— Volatility...
  • Type | normal Volatility | stable Parallel | safe Owner | postgres Security | invoker Access privileges | Language | internal Source code | text_concat Description | concatenate values 可以看到 ...
  • 参考文章:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile https://www.ibm.com/developerworks/library/j-jtp06197/index.html https://tutorials.jenkov.com/ja...
  • Volatility Trading》 by Euan SinclairChapter 4 预测波动率波动率是否可以被预测?无摩擦交易市场(交易费用为零)信息有效(完美信息流)理性人(对信息的价格影响力的共识)预测波动率EWMA(Exponentially ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,137
精华内容 454
关键字:

indexvolatility