Skip to content

Commit 1712835

Browse files
shinny-mayanqiongshinny-chengzhi
authored andcommitted
ta/tafunc: 优化文档
1 parent a368aa9 commit 1712835

File tree

2 files changed

+99
-60
lines changed

2 files changed

+99
-60
lines changed

tqsdk/ta.py

Lines changed: 63 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2488,26 +2488,32 @@ def TRMA(df, n):
24882488
return new_df
24892489

24902490

2491-
def BS_VALUE(df, quote=None, r=0.025, v=None):
2491+
def BS_VALUE(df, quote, r=0.025, v=None):
24922492
"""
24932493
期权 BS 模型理论价格
24942494
24952495
Args:
24962496
df (pandas.DataFrame): 需要计算理论价的期权对应标的合约的 K 线序列,Dataframe 格式
24972497
2498-
quote (tqsdk.objs.Quote): 需要计算理论价的期权对象,如果不是期权类型的对象或者该期权对应的标的合约 df 序列中合约,则返回序列值全为 nan
2498+
quote (tqsdk.objs.Quote): 需要计算理论价的期权对象,其标的合约应该是 df 序列对应的合约,否则返回序列值全为 nan
24992499
2500-
r (float): 无风险利率
2500+
r (float): [可选]无风险利率
25012501
2502-
v (float | pandas.Series): 波动率,默认使用 df 中的 close 序列计算波动率
2502+
v (None | float | pandas.Series): [可选]波动率
2503+
2504+
* None [默认]: 使用 df 中的 close 序列计算的波动率来计算期权理论价格
2505+
2506+
* float: 对于 df 中每一行都使用相同的 v 计算期权理论价格
2507+
2508+
* pandas.Series: 其行数应该和 df 行数相同,对于 df 中每一行都使用 v 中对应行的值计算期权理论价格
25032509
25042510
Returns:
25052511
pandas.DataFrame: 返回的 DataFrame 包含 1 列, 是 "bs_price", 代表计算出来的期权理论价格, 与参数 df 行数相同
25062512
25072513
Example1::
25082514
25092515
from tqsdk import TqApi
2510-
from tqsdk.ta import OPTION_BS_PRICE
2516+
from tqsdk.ta import BS_VALUE
25112517
25122518
api = TqApi()
25132519
quote = api.get_quote("SHFE.cu2006C43000")
@@ -2523,7 +2529,7 @@ def BS_VALUE(df, quote=None, r=0.025, v=None):
25232529
Example2::
25242530
25252531
from tqsdk import TqApi
2526-
from tqsdk.ta import OPTION_BS_PRICE
2532+
from tqsdk.ta import BS_VALUE
25272533
from tqsdk.tafunc import get_his_volatility
25282534
25292535
api = TqApi()
@@ -2539,30 +2545,42 @@ def BS_VALUE(df, quote=None, r=0.025, v=None):
25392545
# 预计的输出是这样的:
25402546
[..., 3036.698780158862, 2393.333388624822, 2872.607833620801]
25412547
"""
2542-
if not (quote and quote.ins_class.endswith("OPTION") and quote.underlying_symbol == df["symbol"][0]):
2548+
if not (quote.ins_class.endswith("OPTION") and quote.underlying_symbol == df["symbol"][0]):
25432549
return pd.DataFrame(np.full_like(df["close"], float('nan')), columns=["bs_price"])
25442550
if v is None:
25452551
v = tqsdk.tafunc._get_volatility(df["close"], df["duration"], quote.trading_time)
25462552
if math.isnan(v):
25472553
return pd.DataFrame(np.full_like(df["close"], float('nan')), columns=["bs_price"])
2548-
o = 1 if quote.option_class == "CALL" else -1
25492554
t = tqsdk.tafunc._get_t_series(df["datetime"], df["duration"], quote)
2550-
return pd.DataFrame(data=list(tqsdk.tafunc.get_bs_price(df["close"], quote.strike_price, r, v, t, o)),
2555+
return pd.DataFrame(data=list(tqsdk.tafunc.get_bs_price(df["close"], quote.strike_price, r, v, t, quote.option_class)),
25512556
columns=["bs_price"])
25522557

25532558

2554-
def OPTION_GREEKS(df, quote=None, r=0.025, v=None):
2559+
def OPTION_GREEKS(df, quote, r=0.025, v=None):
25552560
"""
25562561
期权希腊指标
25572562
25582563
Args:
2559-
df (pandas.DataFrame): 期权合约及对应标的合约组成的 K 线序列, Dataframe 格式
2564+
df (pandas.DataFrame): 期权合约及对应标的合约组成的多 K 线序列, Dataframe 格式
2565+
2566+
对于参数 df,需要用 api.get_kline_serial() 获取多 K 线序列,第一个参数为 list 类型,顺序为期权合约在前,对应标的合约在后,否则返回序列值全为 nan。
2567+
2568+
例如:api.get_kline_serial(["SHFE.cu2006C44000", "SHFE.cu2006"], 60, 100)
2569+
25602570
2561-
quote (tqsdk.objs.Quote): 期权对象,如果不是期权类型的对象或者与 df 中期权合约不同,则返回序列值全为 nan
2571+
quote (tqsdk.objs.Quote): 期权对象,应该是 df 中多 K 线序列中的期权合约对象,否则返回序列值全为 nan
25622572
2563-
r (float): 无风险利率
2573+
例如:api.get_quote("SHFE.cu2006C44000")
25642574
2565-
v (float | pandas.Series): 波动率, 默认使用隐含波动率
2575+
r (float): [可选]无风险利率
2576+
2577+
v (None | float | pandas.Series): [可选]波动率
2578+
2579+
* None [默认]: 使用 df 序列计算出的隐含波动率计算希腊指标值
2580+
2581+
* float: 对于 df 中每一行都使用相同的 v 计算希腊指标值
2582+
2583+
* pandas.Series: 其行数应该和 df 行数相同,对于 df 中每一行都使用 v 中对应行的值计算希腊指标值
25662584
25672585
Returns:
25682586
pandas.DataFrame: 返回的 DataFrame 包含 5 列, 分别是 "delta", "theta", "gamma", "vega", "rho", 与参数 df 行数相同
@@ -2581,38 +2599,45 @@ def OPTION_GREEKS(df, quote=None, r=0.025, v=None):
25812599
print(list(greeks["gamma"]))
25822600
print(list(greeks["vega"]))
25832601
print(list(greeks["rho"]))
2602+
api.close()
25842603
25852604
"""
25862605
new_df = pd.DataFrame()
2587-
if not (quote and quote.ins_class.endswith("OPTION") and quote.instrument_id == df["symbol"][0]
2606+
if not (quote.ins_class.endswith("OPTION") and quote.instrument_id == df["symbol"][0]
25882607
and quote.underlying_symbol == df["symbol1"][0]):
25892608
new_df["delta"] = pd.Series(np.full_like(df["close1"], float('nan')))
25902609
new_df["theta"] = pd.Series(np.full_like(df["close1"], float('nan')))
25912610
new_df["gamma"] = pd.Series(np.full_like(df["close1"], float('nan')))
25922611
new_df["vega"] = pd.Series(np.full_like(df["close1"], float('nan')))
25932612
new_df["rho"] = pd.Series(np.full_like(df["close1"], float('nan')))
25942613
else:
2595-
o = 1 if quote.option_class == "CALL" else -1
25962614
t = tqsdk.tafunc._get_t_series(df["datetime"], df["duration"], quote) # 到期时间
25972615
if v is None:
2598-
v = tqsdk.tafunc.get_impv(df["close1"], df["close"], quote.strike_price, r, 0.3, t, o)
2616+
v = tqsdk.tafunc.get_impv(df["close1"], df["close"], quote.strike_price, r, 0.3, t, quote.option_class)
25992617
d1 = tqsdk.tafunc._get_d1(df["close1"], quote.strike_price, r, v, t)
2600-
new_df["delta"] = tqsdk.tafunc.get_delta(df["close1"], quote.strike_price, r, v, t, o, d1)
2601-
new_df["theta"] = tqsdk.tafunc.get_theta(df["close1"], quote.strike_price, r, v, t, o, d1)
2618+
new_df["delta"] = tqsdk.tafunc.get_delta(df["close1"], quote.strike_price, r, v, t, quote.option_class, d1)
2619+
new_df["theta"] = tqsdk.tafunc.get_theta(df["close1"], quote.strike_price, r, v, t, quote.option_class, d1)
26022620
new_df["gamma"] = tqsdk.tafunc.get_gamma(df["close1"], quote.strike_price, r, v, t, d1)
26032621
new_df["vega"] = tqsdk.tafunc.get_vega(df["close1"], quote.strike_price, r, v, t, d1)
2604-
new_df["rho"] = tqsdk.tafunc.get_rho(df["close1"], quote.strike_price, r, v, t, o, d1)
2622+
new_df["rho"] = tqsdk.tafunc.get_rho(df["close1"], quote.strike_price, r, v, t, quote.option_class, d1)
26052623
return new_df
26062624

26072625

2608-
def OPTION_VALUE(df, quote=None):
2626+
def OPTION_VALUE(df, quote):
26092627
"""
26102628
期权内在价值,时间价值
26112629
26122630
Args:
2613-
df (pandas.DataFrame): 期权合约及对应标的合约组成的 K 线序列, Dataframe 格式
2631+
df (pandas.DataFrame): 期权合约及对应标的合约组成的多 K 线序列, Dataframe 格式
2632+
2633+
对于参数 df,需要用 api.get_kline_serial() 获取多 K 线序列,第一个参数为 list 类型,顺序为期权合约在前,对应标的合约在后,否则返回序列值全为 nan。
2634+
2635+
例如:api.get_kline_serial(["SHFE.cu2006C44000", "SHFE.cu2006"], 60, 100)
2636+
2637+
2638+
quote (tqsdk.objs.Quote): 期权对象,应该是 df 中多 K 线序列中的期权合约对象,否则返回序列值全为 nan。
26142639
2615-
quote (tqsdk.objs.Quote): 期权对象,如果不是期权类型的对象或者与 df 中期权合约不同,则返回序列值全为 nan
2640+
例如:api.get_quote("SHFE.cu2006C44000")
26162641
26172642
Returns:
26182643
pandas.DataFrame: 返回的 DataFrame 包含 2 列, 是 "intrins" 和 "time", 代表内在价值和时间价值, 与参数 df 行数相同
@@ -2631,7 +2656,7 @@ def OPTION_VALUE(df, quote=None):
26312656
api.close()
26322657
"""
26332658
new_df = pd.DataFrame()
2634-
if not (quote and quote.ins_class.endswith("OPTION") and quote.instrument_id == df["symbol"][0]
2659+
if not (quote.ins_class.endswith("OPTION") and quote.instrument_id == df["symbol"][0]
26352660
and quote.underlying_symbol == df["symbol1"][0]):
26362661
new_df["intrins"] = pd.Series(np.full_like(df["close1"], float('nan')))
26372662
new_df["time"] = pd.Series(np.full_like(df["close1"], float('nan')))
@@ -2643,16 +2668,23 @@ def OPTION_VALUE(df, quote=None):
26432668
return new_df
26442669

26452670

2646-
def OPTION_IMPV(df, quote=None, r=0.025):
2671+
def OPTION_IMPV(df, quote, r=0.025):
26472672
"""
26482673
计算期权隐含波动率
26492674
26502675
Args:
2651-
df (pandas.DataFrame): 期权合约及对应标的合约组成的 K 线序列, Dataframe 格式
2676+
df (pandas.DataFrame): 期权合约及对应标的合约组成的多 K 线序列, Dataframe 格式
26522677
2653-
quote (tqsdk.objs.Quote): 期权对象,如果不是期权类型的对象或者与 df 中期权合约不同,则返回序列值全为 nan
2678+
对于参数 df,需要用 api.get_kline_serial() 获取多 K 线序列,第一个参数为 list 类型,顺序为期权合约在前,对应标的合约在后,否则返回序列值全为 nan
26542679
2655-
r (float): 无风险利率
2680+
例如:api.get_kline_serial(["SHFE.cu2006C44000", "SHFE.cu2006"], 60, 100)
2681+
2682+
2683+
quote (tqsdk.objs.Quote): 期权对象,应该是 df 中多 K 线序列中的期权合约对象,否则返回序列值全为 nan。
2684+
2685+
例如:api.get_quote("SHFE.cu2006C44000")
2686+
2687+
r (float): [可选]无风险利率
26562688
26572689
Returns:
26582690
pandas.DataFrame: 返回的 DataFrame 包含 1 列, 是 "impv", 与参数 df 行数相同
@@ -2667,14 +2699,14 @@ def OPTION_IMPV(df, quote=None, r=0.025):
26672699
klines = api.get_kline_serial(["SHFE.cu2006C50000", "SHFE.cu2006"], 24 * 60 * 60, 20)
26682700
impv = OPTION_IMPV(klines, quote, 0.025)
26692701
print(list(impv["impv"] * 100))
2702+
api.close()
26702703
"""
2671-
if not (quote and quote.ins_class.endswith("OPTION") and quote.instrument_id == df["symbol"][0]
2704+
if not (quote.ins_class.endswith("OPTION") and quote.instrument_id == df["symbol"][0]
26722705
and quote.underlying_symbol == df["symbol1"][0]):
26732706
return pd.DataFrame(np.full_like(df["close1"], float('nan')), columns=["impv"])
26742707
his_v = tqsdk.tafunc._get_volatility(df["close1"], df["duration"], quote.trading_time)
26752708
his_v = 0.3 if math.isnan(his_v) else his_v
2676-
o = 1 if quote.option_class == "CALL" else -1
26772709
t = tqsdk.tafunc._get_t_series(df["datetime"], df["duration"], quote) # 到期时间
26782710
return pd.DataFrame(
2679-
data=list(tqsdk.tafunc.get_impv(df["close1"], df["close"], quote.strike_price, r, his_v, t, o)),
2711+
data=list(tqsdk.tafunc.get_impv(df["close1"], df["close"], quote.strike_price, r, his_v, t, quote.option_class)),
26802712
columns=["impv"])

0 commit comments

Comments
 (0)