我正在使用 TD Ameritrade 的期权链输出,并希望访问各种值,例如出价、要价等,以及来自标头的代码和价格。
我的问题似乎是日期和行使价是关键,而不是固定的。
JSON格式如下:
(我无法发布我的问题,json 文本看起来像代码......不知道如何发布)
我想要的输出应该是这样的:
symbol underlyingprice putCall expdate strike bid ask
-------------------------------------------------------------------------
AMZN 90.965 PUT 2023-03-17:6 90.0 1.83 1.88
AMZN 90.965 PUT 2023-03-17:6 91.0 2.27 2.36
.
为简洁起见,以下代码中的 JSON 是先前 Stack Overflow 问题中出现的 JSON 的简化示例,解析股票市场数据的嵌套 JSON 数据,它似乎也使用了从 Ameritrade 返回的数据获取开放链方法:
declare @json nvarchar(max) = N'{
"symbol": "AAPL",
"underlyingPrice": 132.325,
"putExpDateMap": {
"2021-01-08:8": {
"132.0": [
{
"putCall": "PUT",
"bid": 2.4,
"ask": 2.43,
"strikePrice": 132.0
}
],
"133.0": [
{
"putCall": "PUT",
"bid": 2.93,
"ask": 2.95,
"strikePrice": 133.0
}
]
}
}
}';
with putExpDateMapKeys (putExpDate, jsonPath) as (
select
[key],
N'$.putExpDateMap.' + quotename([key], N'"') -- e.g.: '$.putExpDateMap."2021-01-08:8"'
from openjson(@json, N'$.putExpDateMap')
), strikePriceKeys (putExpDate, jsonPath) as (
select
putExpDate,
N'$.' + quotename(putExpDate, N'"') + N'.' + quotename([key], N'"') -- e.g.: '$."2021-01-08:8"."132.0"'
from putExpDateMapKeys
cross apply openjson(@json, jsonPath)
)
select J.symbol, J.underlyingPrice, S.putCall, putExpDate as expdate, S.strikePrice, S.bid, S.ask
from openjson(@json) with (
symbol nvarchar(4),
underlyingPrice float,
putExpDateMap nvarchar(max) as JSON
) J
cross apply strikePriceKeys SPK
outer apply openjson(putExpDateMap, SPK.jsonPath) with (
putCall nvarchar(4),
strikePrice float,
bid float,
ask float
) S;
产生输出:
符号 | 底层价格 | putCall | 展开 | 罢工价格 | 出价 | 问 |
---|---|---|---|---|---|---|
苹果 | 132.325 | 放 | 2021-01-08:8 | 132 | 2.4 | 2.43 |
苹果 | 132.325 | 放 | 2021-01-08:8 | 133 | 2.93 | 2.95 |
那么这个查询是如何工作的呢?
putExpDateMap
中的属性键是动态的,因此我们不能使用硬编码的 JSON 路径来访问它们的内容。我使用两个 CTE 表达式来枚举键:
putExpDateMapKeys
枚举日期键,例如:"2021-01-08:8"
strikePriceKeys
枚举行使价键,例如:"132.0"
和 "133.0"
每个 CTE 表达式还返回一个 JSON 路径,然后允许最终调用
openjson()
以访问 putCall
、bid
、ask
和 strikePrice
值。