@@ -2488,26 +2488,32 @@ def TRMA(df, n):
2488
2488
return new_df
2489
2489
2490
2490
2491
- def BS_VALUE (df , quote = None , r = 0.025 , v = None ):
2491
+ def BS_VALUE (df , quote , r = 0.025 , v = None ):
2492
2492
"""
2493
2493
期权 BS 模型理论价格
2494
2494
2495
2495
Args:
2496
2496
df (pandas.DataFrame): 需要计算理论价的期权对应标的合约的 K 线序列,Dataframe 格式
2497
2497
2498
- quote (tqsdk.objs.Quote): 需要计算理论价的期权对象,如果不是期权类型的对象或者该期权对应的标的合约 df 序列中合约,则返回序列值全为 nan
2498
+ quote (tqsdk.objs.Quote): 需要计算理论价的期权对象,其标的合约应该是 df 序列对应的合约,否则返回序列值全为 nan
2499
2499
2500
- r (float): 无风险利率
2500
+ r (float): [可选] 无风险利率
2501
2501
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 中对应行的值计算期权理论价格
2503
2509
2504
2510
Returns:
2505
2511
pandas.DataFrame: 返回的 DataFrame 包含 1 列, 是 "bs_price", 代表计算出来的期权理论价格, 与参数 df 行数相同
2506
2512
2507
2513
Example1::
2508
2514
2509
2515
from tqsdk import TqApi
2510
- from tqsdk.ta import OPTION_BS_PRICE
2516
+ from tqsdk.ta import BS_VALUE
2511
2517
2512
2518
api = TqApi()
2513
2519
quote = api.get_quote("SHFE.cu2006C43000")
@@ -2523,7 +2529,7 @@ def BS_VALUE(df, quote=None, r=0.025, v=None):
2523
2529
Example2::
2524
2530
2525
2531
from tqsdk import TqApi
2526
- from tqsdk.ta import OPTION_BS_PRICE
2532
+ from tqsdk.ta import BS_VALUE
2527
2533
from tqsdk.tafunc import get_his_volatility
2528
2534
2529
2535
api = TqApi()
@@ -2539,30 +2545,42 @@ def BS_VALUE(df, quote=None, r=0.025, v=None):
2539
2545
# 预计的输出是这样的:
2540
2546
[..., 3036.698780158862, 2393.333388624822, 2872.607833620801]
2541
2547
"""
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 ]):
2543
2549
return pd .DataFrame (np .full_like (df ["close" ], float ('nan' )), columns = ["bs_price" ])
2544
2550
if v is None :
2545
2551
v = tqsdk .tafunc ._get_volatility (df ["close" ], df ["duration" ], quote .trading_time )
2546
2552
if math .isnan (v ):
2547
2553
return pd .DataFrame (np .full_like (df ["close" ], float ('nan' )), columns = ["bs_price" ])
2548
- o = 1 if quote .option_class == "CALL" else - 1
2549
2554
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 )),
2551
2556
columns = ["bs_price" ])
2552
2557
2553
2558
2554
- def OPTION_GREEKS (df , quote = None , r = 0.025 , v = None ):
2559
+ def OPTION_GREEKS (df , quote , r = 0.025 , v = None ):
2555
2560
"""
2556
2561
期权希腊指标
2557
2562
2558
2563
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
+
2560
2570
2561
- quote (tqsdk.objs.Quote): 期权对象,如果不是期权类型的对象或者与 df 中期权合约不同,则返回序列值全为 nan
2571
+ quote (tqsdk.objs.Quote): 期权对象,应该是 df 中多 K 线序列中的期权合约对象,否则返回序列值全为 nan。
2562
2572
2563
- r (float): 无风险利率
2573
+ 例如:api.get_quote("SHFE.cu2006C44000")
2564
2574
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 中对应行的值计算希腊指标值
2566
2584
2567
2585
Returns:
2568
2586
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):
2581
2599
print(list(greeks["gamma"]))
2582
2600
print(list(greeks["vega"]))
2583
2601
print(list(greeks["rho"]))
2602
+ api.close()
2584
2603
2585
2604
"""
2586
2605
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 ]
2588
2607
and quote .underlying_symbol == df ["symbol1" ][0 ]):
2589
2608
new_df ["delta" ] = pd .Series (np .full_like (df ["close1" ], float ('nan' )))
2590
2609
new_df ["theta" ] = pd .Series (np .full_like (df ["close1" ], float ('nan' )))
2591
2610
new_df ["gamma" ] = pd .Series (np .full_like (df ["close1" ], float ('nan' )))
2592
2611
new_df ["vega" ] = pd .Series (np .full_like (df ["close1" ], float ('nan' )))
2593
2612
new_df ["rho" ] = pd .Series (np .full_like (df ["close1" ], float ('nan' )))
2594
2613
else :
2595
- o = 1 if quote .option_class == "CALL" else - 1
2596
2614
t = tqsdk .tafunc ._get_t_series (df ["datetime" ], df ["duration" ], quote ) # 到期时间
2597
2615
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 )
2599
2617
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 )
2602
2620
new_df ["gamma" ] = tqsdk .tafunc .get_gamma (df ["close1" ], quote .strike_price , r , v , t , d1 )
2603
2621
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 )
2605
2623
return new_df
2606
2624
2607
2625
2608
- def OPTION_VALUE (df , quote = None ):
2626
+ def OPTION_VALUE (df , quote ):
2609
2627
"""
2610
2628
期权内在价值,时间价值
2611
2629
2612
2630
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。
2614
2639
2615
- quote (tqsdk.objs.Quote): 期权对象,如果不是期权类型的对象或者与 df 中期权合约不同,则返回序列值全为 nan
2640
+ 例如:api.get_quote("SHFE.cu2006C44000")
2616
2641
2617
2642
Returns:
2618
2643
pandas.DataFrame: 返回的 DataFrame 包含 2 列, 是 "intrins" 和 "time", 代表内在价值和时间价值, 与参数 df 行数相同
@@ -2631,7 +2656,7 @@ def OPTION_VALUE(df, quote=None):
2631
2656
api.close()
2632
2657
"""
2633
2658
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 ]
2635
2660
and quote .underlying_symbol == df ["symbol1" ][0 ]):
2636
2661
new_df ["intrins" ] = pd .Series (np .full_like (df ["close1" ], float ('nan' )))
2637
2662
new_df ["time" ] = pd .Series (np .full_like (df ["close1" ], float ('nan' )))
@@ -2643,16 +2668,23 @@ def OPTION_VALUE(df, quote=None):
2643
2668
return new_df
2644
2669
2645
2670
2646
- def OPTION_IMPV (df , quote = None , r = 0.025 ):
2671
+ def OPTION_IMPV (df , quote , r = 0.025 ):
2647
2672
"""
2648
2673
计算期权隐含波动率
2649
2674
2650
2675
Args:
2651
- df (pandas.DataFrame): 期权合约及对应标的合约组成的 K 线序列, Dataframe 格式
2676
+ df (pandas.DataFrame): 期权合约及对应标的合约组成的多 K 线序列, Dataframe 格式
2652
2677
2653
- quote (tqsdk.objs.Quote): 期权对象,如果不是期权类型的对象或者与 df 中期权合约不同,则返回序列值全为 nan
2678
+ 对于参数 df,需要用 api.get_kline_serial() 获取多 K 线序列,第一个参数为 list 类型,顺序为期权合约在前,对应标的合约在后,否则返回序列值全为 nan。
2654
2679
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): [可选]无风险利率
2656
2688
2657
2689
Returns:
2658
2690
pandas.DataFrame: 返回的 DataFrame 包含 1 列, 是 "impv", 与参数 df 行数相同
@@ -2667,14 +2699,14 @@ def OPTION_IMPV(df, quote=None, r=0.025):
2667
2699
klines = api.get_kline_serial(["SHFE.cu2006C50000", "SHFE.cu2006"], 24 * 60 * 60, 20)
2668
2700
impv = OPTION_IMPV(klines, quote, 0.025)
2669
2701
print(list(impv["impv"] * 100))
2702
+ api.close()
2670
2703
"""
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 ]
2672
2705
and quote .underlying_symbol == df ["symbol1" ][0 ]):
2673
2706
return pd .DataFrame (np .full_like (df ["close1" ], float ('nan' )), columns = ["impv" ])
2674
2707
his_v = tqsdk .tafunc ._get_volatility (df ["close1" ], df ["duration" ], quote .trading_time )
2675
2708
his_v = 0.3 if math .isnan (his_v ) else his_v
2676
- o = 1 if quote .option_class == "CALL" else - 1
2677
2709
t = tqsdk .tafunc ._get_t_series (df ["datetime" ], df ["duration" ], quote ) # 到期时间
2678
2710
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 )),
2680
2712
columns = ["impv" ])
0 commit comments