Skip to content

Commit 828850c

Browse files
shinny-mayanqiongshinny-chengzhi
authored andcommitted
ta/tafunc: 增加 get_t 获取到期时间序列
1 parent 1712835 commit 828850c

File tree

2 files changed

+38
-12
lines changed

2 files changed

+38
-12
lines changed

tqsdk/ta.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2551,7 +2551,7 @@ def BS_VALUE(df, quote, r=0.025, v=None):
25512551
v = tqsdk.tafunc._get_volatility(df["close"], df["duration"], quote.trading_time)
25522552
if math.isnan(v):
25532553
return pd.DataFrame(np.full_like(df["close"], float('nan')), columns=["bs_price"])
2554-
t = tqsdk.tafunc._get_t_series(df["datetime"], df["duration"], quote)
2554+
t = tqsdk.tafunc._get_t_series(df["datetime"], df["duration"], quote.expire_datetime)
25552555
return pd.DataFrame(data=list(tqsdk.tafunc.get_bs_price(df["close"], quote.strike_price, r, v, t, quote.option_class)),
25562556
columns=["bs_price"])
25572557

@@ -2611,7 +2611,7 @@ def OPTION_GREEKS(df, quote, r=0.025, v=None):
26112611
new_df["vega"] = pd.Series(np.full_like(df["close1"], float('nan')))
26122612
new_df["rho"] = pd.Series(np.full_like(df["close1"], float('nan')))
26132613
else:
2614-
t = tqsdk.tafunc._get_t_series(df["datetime"], df["duration"], quote) # 到期时间
2614+
t = tqsdk.tafunc._get_t_series(df["datetime"], df["duration"], quote.expire_datetime) # 到期时间
26152615
if v is None:
26162616
v = tqsdk.tafunc.get_impv(df["close1"], df["close"], quote.strike_price, r, 0.3, t, quote.option_class)
26172617
d1 = tqsdk.tafunc._get_d1(df["close1"], quote.strike_price, r, v, t)
@@ -2706,7 +2706,7 @@ def OPTION_IMPV(df, quote, r=0.025):
27062706
return pd.DataFrame(np.full_like(df["close1"], float('nan')), columns=["impv"])
27072707
his_v = tqsdk.tafunc._get_volatility(df["close1"], df["duration"], quote.trading_time)
27082708
his_v = 0.3 if math.isnan(his_v) else his_v
2709-
t = tqsdk.tafunc._get_t_series(df["datetime"], df["duration"], quote) # 到期时间
2709+
t = tqsdk.tafunc._get_t_series(df["datetime"], df["duration"], quote.expire_datetime) # 到期时间
27102710
return pd.DataFrame(
27112711
data=list(tqsdk.tafunc.get_impv(df["close1"], df["close"], quote.strike_price, r, his_v, t, quote.option_class)),
27122712
columns=["impv"])

tqsdk/tafunc.py

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -826,8 +826,8 @@ def barlast(cond):
826826
return pd.Series(r)
827827

828828

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'))
831831
return (t.dt.days * 86400 + t.dt.seconds) / (360 * 86400)
832832

833833

@@ -846,6 +846,32 @@ def _get_pdf(series: pd.Series):
846846
return series.loc[series.isna()].append(pd.Series(stats.norm.pdf(s), index=s.index), verify_integrity=True)
847847

848848

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+
849875
def get_his_volatility(df, quote):
850876
"""
851877
计算某个合约的历史波动率
@@ -929,7 +955,7 @@ def get_bs_price(series, k, r, v, t, option_class):
929955
930956
option = api.get_quote("SHFE.cu2006C45000")
931957
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)
933959
bs_price = tafunc.get_bs_price(klines["close1"], 45000, 0.025, v, t, option.option_class) # 理论价
934960
print(list(bs_price.round(2)))
935961
api.close()
@@ -986,7 +1012,7 @@ def get_delta(series, k, r, v, t, option_class, d1=None):
9861012
9871013
option = api.get_quote("SHFE.cu2006C45000")
9881014
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)
9901016
impv = tafunc.get_impv(klines["close1"], klines["close"], 45000, 0.025, v, t, "CALL")
9911017
delta = tafunc.get_delta(klines["close1"], 45000, 0.025, v, t, "CALL")
9921018
print("delta", list(delta))
@@ -1042,7 +1068,7 @@ def get_gamma(series, k, r, v, t, d1=None):
10421068
10431069
option = api.get_quote("SHFE.cu2006C45000")
10441070
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)
10461072
impv = tafunc.get_impv(klines["close1"], klines["close"], 45000, 0.025, v, t, "CALL")
10471073
gamma = tafunc.get_gamma(klines["close1"], 45000, 0.025, v, t)
10481074
print("gamma", list(gamma))
@@ -1097,7 +1123,7 @@ def get_theta(series, k, r, v, t, option_class, d1=None):
10971123
10981124
option = api.get_quote("SHFE.cu2006C45000")
10991125
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)
11011127
impv = tafunc.get_impv(klines["close1"], klines["close"], 45000, 0.025, v, t, "CALL")
11021128
theta = tafunc.get_theta(klines["close1"], 45000, 0.025, v, t, "CALL")
11031129
print("theta", list(theta))
@@ -1155,7 +1181,7 @@ def get_vega(series, k, r, v, t, d1=None):
11551181
11561182
option = api.get_quote("SHFE.cu2006C45000")
11571183
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)
11591185
impv = tafunc.get_impv(klines["close1"], klines["close"], 45000, 0.025, v, t, "CALL")
11601186
vega = tafunc.get_vega(klines["close1"], 45000, 0.025, v, t)
11611187
print("vega", list(vega))
@@ -1210,7 +1236,7 @@ def get_rho(series, k, r, v, t, option_class, d1=None):
12101236
12111237
option = api.get_quote("SHFE.cu2006C45000")
12121238
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)
12141240
impv = tafunc.get_impv(klines["close1"], klines["close"], 45000, 0.025, v, t, "CALL")
12151241
rho = tafunc.get_rho(klines["close1"], 45000, 0.025, v, t, "CALL")
12161242
print("rho", list(rho))
@@ -1269,7 +1295,7 @@ def get_impv(series, series_option, k, r, init_v, t, option_class):
12691295
12701296
option = api.get_quote("SHFE.cu2006C45000")
12711297
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)
12731299
impv = tafunc.get_impv(klines["close1"], klines["close"], 45000, 0.025, v, t, "CALL")
12741300
print("impv", list((impv * 100).round(2)))
12751301
api.close()

0 commit comments

Comments
 (0)