Skip to content

Commit 2e147ae

Browse files
shinny-mayanqiongshinny-chengzhi
authored andcommitted
ta: _get_volatility 去掉 defalut 参数
1 parent 259dbc8 commit 2e147ae

File tree

2 files changed

+19
-20
lines changed

2 files changed

+19
-20
lines changed

tqsdk/ta.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2542,7 +2542,7 @@ def BS_VALUE(df, quote=None, r=0.025, v=None):
25422542
if not (quote and quote.ins_class.endswith("OPTION") and quote.underlying_symbol == df["symbol"][0]):
25432543
return pd.DataFrame(np.full_like(df["close"], float('nan')), columns=["bs_price"])
25442544
if v is None:
2545-
v = tqsdk.tafunc._get_volatility(df["close"], df["duration"], quote.trading_time, float('nan'))
2545+
v = tqsdk.tafunc._get_volatility(df["close"], df["duration"], quote.trading_time)
25462546
if math.isnan(v):
25472547
return pd.DataFrame(np.full_like(df["close"], float('nan')), columns=["bs_price"])
25482548
o = 1 if quote.option_class == "CALL" else -1
@@ -2595,8 +2595,7 @@ def OPTION_GREEKS(df, quote=None, r=0.025, v=None):
25952595
o = 1 if quote.option_class == "CALL" else -1
25962596
t = tqsdk.tafunc._get_t_series(df["datetime"], df["duration"], quote) # 到期时间
25972597
if v is None:
2598-
his_v = tqsdk.tafunc._get_volatility(df["close1"], df["duration"], quote.trading_time, 0.3)
2599-
v = tqsdk.tafunc.get_impv(df["close1"], df["close"], quote.strike_price, r, his_v, t, o)
2598+
v = tqsdk.tafunc.get_impv(df["close1"], df["close"], quote.strike_price, r, 0.3, t, o)
26002599
d1 = tqsdk.tafunc._get_d1(df["close1"], quote.strike_price, r, v, t)
26012600
new_df["delta"] = tqsdk.tafunc.get_delta(df["close1"], quote.strike_price, r, v, t, o, d1)
26022601
new_df["theta"] = tqsdk.tafunc.get_theta(df["close1"], quote.strike_price, r, v, t, o, d1)
@@ -2672,9 +2671,10 @@ def OPTION_IMPV(df, quote=None, r=0.025):
26722671
if not (quote and quote.ins_class.endswith("OPTION") and quote.instrument_id == df["symbol"][0]
26732672
and quote.underlying_symbol == df["symbol1"][0]):
26742673
return pd.DataFrame(np.full_like(df["close1"], float('nan')), columns=["impv"])
2675-
init_v = tqsdk.tafunc._get_volatility(df["close1"], df["duration"], quote.trading_time, 0.3)
2674+
his_v = tqsdk.tafunc._get_volatility(df["close1"], df["duration"], quote.trading_time)
2675+
his_v = 0.3 if math.isnan(his_v) else his_v
26762676
o = 1 if quote.option_class == "CALL" else -1
26772677
t = tqsdk.tafunc._get_t_series(df["datetime"], df["duration"], quote) # 到期时间
26782678
return pd.DataFrame(
2679-
data=list(tqsdk.tafunc.get_impv(df["close1"], df["close"], quote.strike_price, r, init_v, t, o)),
2679+
data=list(tqsdk.tafunc.get_impv(df["close1"], df["close"], quote.strike_price, r, his_v, t, o)),
26802680
columns=["impv"])

tqsdk/tafunc.py

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -832,20 +832,6 @@ def _get_t_series(series: pd.Series, dur: int, quote):
832832
return (t.dt.days * 86400 + t.dt.seconds) / (360 * 86400)
833833

834834

835-
def _get_volatility(series: pd.Series, dur: Union[pd.Series, int] = 86400, trading_time: list = None,
836-
default: float = 0.3) -> float:
837-
series_u = np.log(series.shift(1)[1:] / series[1:])
838-
series_u = series_u[~np.isnan(series_u)]
839-
if series_u.size < 2: # 自由度小于2无法计算,返回一个默认值
840-
return default
841-
seconds_per_day = 24 * 60 * 60
842-
dur = dur[0] if isinstance(dur, pd.Series) else dur
843-
if dur < 24 * 60 * 60 and trading_time:
844-
periods = tqsdk.sim.TqSim._get_period_timestamp(0, trading_time.get("day", []) + trading_time.get("night", []))
845-
seconds_per_day = sum([p[1] - p[0] for p in periods]) / 1e9
846-
return math.sqrt((250 * seconds_per_day / dur) * np.cov(series_u))
847-
848-
849835
def _get_d1(series: pd.Series, k: float, r: float, v: Union[float, pd.Series], t: Union[float, pd.Series]):
850836
return pd.Series(
851837
np.where((v <= 0) | (t <= 0), np.nan, (np.log(series / k) + (r + 0.5 * np.power(v, 2)) * t) / (v * np.sqrt(t))))
@@ -888,7 +874,20 @@ def get_his_volatility(df: pd.DataFrame, quote: tqsdk.objs.Quote = None):
888874
trading_time = quote.trading_time
889875
else:
890876
trading_time = None
891-
return _get_volatility(df["close"], df["duration"], trading_time, default=float("nan"))
877+
return _get_volatility(df["close"], df["duration"], trading_time)
878+
879+
880+
def _get_volatility(series: pd.Series, dur: Union[pd.Series, int] = 86400, trading_time: list = None) -> float:
881+
series_u = np.log(series.shift(1)[1:] / series[1:])
882+
series_u = series_u[~np.isnan(series_u)]
883+
if series_u.size < 2: # 自由度小于2无法计算,返回一个默认值
884+
return float("nan")
885+
seconds_per_day = 24 * 60 * 60
886+
dur = dur[0] if isinstance(dur, pd.Series) else dur
887+
if dur < 24 * 60 * 60 and trading_time:
888+
periods = tqsdk.sim.TqSim._get_period_timestamp(0, trading_time.get("day", []) + trading_time.get("night", []))
889+
seconds_per_day = sum([p[1] - p[0] for p in periods]) / 1e9
890+
return math.sqrt((250 * seconds_per_day / dur) * np.cov(series_u))
892891

893892

894893
def get_bs_price(series: pd.Series, k: float, r: float, v: Union[float, pd.Series], t: Union[float, pd.Series],

0 commit comments

Comments
 (0)