@@ -826,8 +826,8 @@ def barlast(cond):
826
826
return pd .Series (r )
827
827
828
828
829
- def _get_t_series (series : pd .Series , dur : int , quote ):
830
- t = pd .Series (pd .to_timedelta (quote . expire_datetime - (series / 1e9 + dur ), unit = 's' ))
829
+ def _get_t_series (series : pd .Series , dur : int , expire_datetime : int ):
830
+ t = pd .Series (pd .to_timedelta (expire_datetime - (series / 1e9 + dur ), unit = 's' ))
831
831
return (t .dt .days * 86400 + t .dt .seconds ) / (360 * 86400 )
832
832
833
833
@@ -846,6 +846,32 @@ def _get_pdf(series: pd.Series):
846
846
return series .loc [series .isna ()].append (pd .Series (stats .norm .pdf (s ), index = s .index ), verify_integrity = True )
847
847
848
848
849
+ def get_t (df , expire_datetime ):
850
+ """
851
+ 计算 K 线序列对应的年化到期时间,主要用于计算期权相关希腊指标时,需要得到计算出序列对应的年化到期时间
852
+
853
+ Args:
854
+ df (pandas.DataFrame): Dataframe 格式的 K 线序列
855
+
856
+ expire_datetime (int): 到期日, 秒级时间戳
857
+
858
+ Returns:
859
+ pandas.Series : 返回的 df 对应的年化时间序列
860
+
861
+ Example::
862
+
863
+ from tqsdk import TqApi, tafunc
864
+
865
+ api = TqApi()
866
+ quote = api.get_quote('SHFE.cu2006C45000')
867
+ klines = api.get_kline_serial(['SHFE.cu2006C45000', 'SHFE.cu2006'], 24 * 60 * 60, 50)
868
+ t = tafunc.get_t(klines, quote.expire_datetime)
869
+ print(t)
870
+ api.close()
871
+ """
872
+ return pd .Series (_get_t_series (df ["datetime" ], df ["duration" ], expire_datetime ))
873
+
874
+
849
875
def get_his_volatility (df , quote ):
850
876
"""
851
877
计算某个合约的历史波动率
@@ -929,7 +955,7 @@ def get_bs_price(series, k, r, v, t, option_class):
929
955
930
956
option = api.get_quote("SHFE.cu2006C45000")
931
957
klines = api.get_kline_serial(["SHFE.cu2006C45000", "SHFE.cu2006"], 24 * 60 * 60, 10)
932
- t = pd.Series(pd.to_timedelta(option.expire_datetime - ( klines["datetime"] + klines["duration"]) / 1e9, unit='s')).dt.days / 360
958
+ t = tafunc.get_t( klines, option.expire_datetime)
933
959
bs_price = tafunc.get_bs_price(klines["close1"], 45000, 0.025, v, t, option.option_class) # 理论价
934
960
print(list(bs_price.round(2)))
935
961
api.close()
@@ -986,7 +1012,7 @@ def get_delta(series, k, r, v, t, option_class, d1=None):
986
1012
987
1013
option = api.get_quote("SHFE.cu2006C45000")
988
1014
klines = api.get_kline_serial(["SHFE.cu2006C45000", "SHFE.cu2006"], 24 * 60 * 60, 10)
989
- t = pd.Series(pd.to_timedelta(option.expire_datetime - ( klines["datetime"] + klines["duration"]) / 1e9, unit='s')).dt.days / 360
1015
+ t = tafunc.get_t( klines, option.expire_datetime)
990
1016
impv = tafunc.get_impv(klines["close1"], klines["close"], 45000, 0.025, v, t, "CALL")
991
1017
delta = tafunc.get_delta(klines["close1"], 45000, 0.025, v, t, "CALL")
992
1018
print("delta", list(delta))
@@ -1042,7 +1068,7 @@ def get_gamma(series, k, r, v, t, d1=None):
1042
1068
1043
1069
option = api.get_quote("SHFE.cu2006C45000")
1044
1070
klines = api.get_kline_serial(["SHFE.cu2006C45000", "SHFE.cu2006"], 24 * 60 * 60, 10)
1045
- t = pd.Series(pd.to_timedelta(option.expire_datetime - ( klines["datetime"] + klines["duration"]) / 1e9, unit='s')).dt.days / 360
1071
+ t = tafunc.get_t( klines, option.expire_datetime)
1046
1072
impv = tafunc.get_impv(klines["close1"], klines["close"], 45000, 0.025, v, t, "CALL")
1047
1073
gamma = tafunc.get_gamma(klines["close1"], 45000, 0.025, v, t)
1048
1074
print("gamma", list(gamma))
@@ -1097,7 +1123,7 @@ def get_theta(series, k, r, v, t, option_class, d1=None):
1097
1123
1098
1124
option = api.get_quote("SHFE.cu2006C45000")
1099
1125
klines = api.get_kline_serial(["SHFE.cu2006C45000", "SHFE.cu2006"], 24 * 60 * 60, 10)
1100
- t = pd.Series(pd.to_timedelta(option.expire_datetime - ( klines["datetime"] + klines["duration"]) / 1e9, unit='s')).dt.days / 360
1126
+ t = tafunc.get_t( klines, option.expire_datetime)
1101
1127
impv = tafunc.get_impv(klines["close1"], klines["close"], 45000, 0.025, v, t, "CALL")
1102
1128
theta = tafunc.get_theta(klines["close1"], 45000, 0.025, v, t, "CALL")
1103
1129
print("theta", list(theta))
@@ -1155,7 +1181,7 @@ def get_vega(series, k, r, v, t, d1=None):
1155
1181
1156
1182
option = api.get_quote("SHFE.cu2006C45000")
1157
1183
klines = api.get_kline_serial(["SHFE.cu2006C45000", "SHFE.cu2006"], 24 * 60 * 60, 10)
1158
- t = pd.Series(pd.to_timedelta(option.expire_datetime - ( klines["datetime"] + klines["duration"]) / 1e9, unit='s')).dt.days / 360
1184
+ t = tafunc.get_t( klines, option.expire_datetime)
1159
1185
impv = tafunc.get_impv(klines["close1"], klines["close"], 45000, 0.025, v, t, "CALL")
1160
1186
vega = tafunc.get_vega(klines["close1"], 45000, 0.025, v, t)
1161
1187
print("vega", list(vega))
@@ -1210,7 +1236,7 @@ def get_rho(series, k, r, v, t, option_class, d1=None):
1210
1236
1211
1237
option = api.get_quote("SHFE.cu2006C45000")
1212
1238
klines = api.get_kline_serial(["SHFE.cu2006C45000", "SHFE.cu2006"], 24 * 60 * 60, 10)
1213
- t = pd.Series(pd.to_timedelta(option.expire_datetime - ( klines["datetime"] + klines["duration"]) / 1e9, unit='s')).dt.days / 360
1239
+ t = tafunc.get_t( klines, option.expire_datetime)
1214
1240
impv = tafunc.get_impv(klines["close1"], klines["close"], 45000, 0.025, v, t, "CALL")
1215
1241
rho = tafunc.get_rho(klines["close1"], 45000, 0.025, v, t, "CALL")
1216
1242
print("rho", list(rho))
@@ -1269,7 +1295,7 @@ def get_impv(series, series_option, k, r, init_v, t, option_class):
1269
1295
1270
1296
option = api.get_quote("SHFE.cu2006C45000")
1271
1297
klines = api.get_kline_serial(["SHFE.cu2006C45000", "SHFE.cu2006"], 24 * 60 * 60, 10)
1272
- t = pd.Series(pd.to_timedelta(option.expire_datetime - ( klines["datetime"] + klines["duration"]) / 1e9, unit='s')).dt.days / 360
1298
+ t = tafunc.get_t( klines, option.expire_datetime)
1273
1299
impv = tafunc.get_impv(klines["close1"], klines["close"], 45000, 0.025, v, t, "CALL")
1274
1300
print("impv", list((impv * 100).round(2)))
1275
1301
api.close()
0 commit comments