siat 3.9.1__py3-none-any.whl → 3.9.10__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- siat/event_study.py +68 -11
- {siat-3.9.1.dist-info → siat-3.9.10.dist-info}/METADATA +1 -1
- {siat-3.9.1.dist-info → siat-3.9.10.dist-info}/RECORD +6 -6
- {siat-3.9.1.dist-info → siat-3.9.10.dist-info}/LICENSE +0 -0
- {siat-3.9.1.dist-info → siat-3.9.10.dist-info}/WHEEL +0 -0
- {siat-3.9.1.dist-info → siat-3.9.10.dist-info}/top_level.txt +0 -0
siat/event_study.py
CHANGED
@@ -44,6 +44,15 @@ if __name__=='__main__':
|
|
44
44
|
event_window=[1,1] #事件发生时股市已经收盘,故检测下一个交易日的股市反应
|
45
45
|
market_index='000001.SS' #贵州茅台在上交所上市,故使用上证综合指数
|
46
46
|
RF=0
|
47
|
+
|
48
|
+
#测试组1b
|
49
|
+
ticker='600519.SS'
|
50
|
+
|
51
|
+
event_date='2024-4-2' #贵州茅台2023年报于2024年4月2日晚披露
|
52
|
+
start='2024-3-1'; end='2024-4-30'
|
53
|
+
event_window=[0,2] #事件发生时股市已经收盘,故检测下一个交易日的股市反应
|
54
|
+
market_index='000001.SS' #贵州茅台在上交所上市,故使用上证综合指数
|
55
|
+
RF=0
|
47
56
|
|
48
57
|
#测试组2
|
49
58
|
ticker=['600519.SS','399997.SZ']
|
@@ -75,6 +84,7 @@ if __name__=='__main__':
|
|
75
84
|
facecolor="whitesmoke"
|
76
85
|
show_AR=True
|
77
86
|
show_RF=True
|
87
|
+
show_BHAR=True
|
78
88
|
loc='best'
|
79
89
|
|
80
90
|
es=event_study("600519.SS",event_date="2024-4-2", \
|
@@ -111,8 +121,9 @@ def event_study(ticker,event_date, \
|
|
111
121
|
RF="market index", \
|
112
122
|
ret_type="Daily Adj Ret%", \
|
113
123
|
ticker_type='auto', \
|
114
|
-
|
115
|
-
|
124
|
+
show_AR='auto',show_RF=False,show_BHAR=False, \
|
125
|
+
draw_CAR=True,draw_BHAR=False, \
|
126
|
+
facecolor="whitesmoke",loc='best'):
|
116
127
|
"""
|
117
128
|
===========================================================================
|
118
129
|
功能:展示事件研究法的累计异常收益率CAR。
|
@@ -127,13 +138,15 @@ def event_study(ticker,event_date, \
|
|
127
138
|
注意:事件窗口不一定包括事件日(适用于事件日在非交易日的情形,例如周末或假日,或者在当日闭市后发生)
|
128
139
|
如果事件日为非交易日,事件窗口需要后移至事件日后的第一个交易日。
|
129
140
|
如果怀疑市场提前对事件发生反应,可以考虑前移事件窗口的开始日期。
|
141
|
+
使用CAR时,事件窗口长度一般为数日;使用BHAR时可长达数月。
|
130
142
|
post_event_days:用于分析事件窗口后的漂移效应,取事件窗口后多少天。
|
131
143
|
默认不分析,取0天。可以指定天数,注意是否跨过非交易日情形,过长的窗口期也可能混杂其他事件的影响。
|
132
144
|
method:估计事件窗口以及事件后窗口收益率预期值的方法
|
133
|
-
默认为CAPM(主要用于ticker
|
145
|
+
默认为CAPM(主要用于ticker为股票等),即通常所说的市场模型法。
|
134
146
|
如果ticker为股票等,也可直接使用指数收益率为其预期收益率,此时method为Market或Index,即常说的市场调整模型。
|
135
147
|
如果ticker为指数,无法再借助指数,method只能使用Random Walk,即使用前一个收益率为预期收益率。
|
136
148
|
注意:不管多个ticker时里面的不同证券类型,仅按第一个ticker的类型判断,并使用同一种证券类型。
|
149
|
+
使用CAR时,对每日异常收益率相加,反映短期逐日异常收益的累积;使用BHAR时则为复利累积,反映长期异常收益。
|
137
150
|
early_response_days:默认为-2,即提前2天市场就开始有反应。
|
138
151
|
市场很可能对事件提前发生反应(因为泄密等原因),例如中国市场规定上市公司董事会开完后两天内必须披露。
|
139
152
|
很可能刚开完董事会,市场就得到了消息。为规避这种情况对估计窗口的影响,可以调节此参数。
|
@@ -145,12 +158,17 @@ def event_study(ticker,event_date, \
|
|
145
158
|
默认使用市场模型"market index"自动计算,无需指定。
|
146
159
|
可直接指定具体数值。
|
147
160
|
也可指定特定指标替代,例如一年期中国国债收益率"1YCNY.B"或一年期美债收益率"1YUSY.B"等。
|
148
|
-
show_RF:在使用市场模型或指定指标时是否显示计算出的RF均值,默认为False。
|
149
161
|
ticker_type:显式指明ticker的证券类型,当siat误判其类型(中国内地股票/债券/基金)时使用,默认'auto'。
|
150
|
-
|
162
|
+
show_RF:在使用市场模型或指定指标时是否显示计算出的RF均值,默认为False。
|
151
163
|
show_AR:是否绘图时绘制异常收益率AR
|
152
164
|
默认'auto'(单个ticker时绘制,多个时不绘制)。
|
153
165
|
也可指定True/False强行绘制/不绘制。
|
166
|
+
show_BHAR;是否显示BHAR数值,适用于长期窗口,默认否False。
|
167
|
+
draw_CAR:是否绘制CAR曲线,默认是True。
|
168
|
+
draw_BHAR:是否绘制BHAR曲线,默认否False。
|
169
|
+
注意:对于短期窗口,CAR曲线与BHAR曲线差异微小,可能基本重合,因此建议仅绘制其中之一。
|
170
|
+
facecolor:显式指定绘图背景颜色,默认"whitesmoke"。
|
171
|
+
|
154
172
|
|
155
173
|
示例:美的收购库卡事件对股价的影响
|
156
174
|
es=event_study(["000333.SZ"],
|
@@ -441,10 +459,11 @@ def event_study(ticker,event_date, \
|
|
441
459
|
if DEBUG2:
|
442
460
|
print(" DEBUG: RF_type={0}, RF_text={1}, rf_dict={2}".format(RF_type,RF_text, rf_dict))
|
443
461
|
|
444
|
-
#=====计算CAR==============================================================
|
462
|
+
#=====计算CAR和BHAR==============================================================
|
445
463
|
for t in ticker_name(ticker,ticker_type):
|
446
464
|
try:
|
447
465
|
df_ret[t+"_CAR"]=0
|
466
|
+
df_ret[t+"_BHAR"]=0
|
448
467
|
except: continue
|
449
468
|
|
450
469
|
event_window_startpd=pd.to_datetime(event_window_start)
|
@@ -452,11 +471,14 @@ def event_study(ticker,event_date, \
|
|
452
471
|
post_event_endpd=pd.to_datetime(post_event_end)
|
453
472
|
startpd=pd.to_datetime(start); endpd=pd.to_datetime(end)
|
454
473
|
|
455
|
-
#计算CAR
|
474
|
+
#计算CAR和BHAR
|
456
475
|
df_ret_event=df_ret[(df_ret.index >=event_window_startpd) & (df_ret.index <=endpd)]
|
457
476
|
for t in ticker_name(ticker,ticker_type):
|
458
477
|
try:
|
459
|
-
|
478
|
+
# CAR:单利累加求和(每日异常收益相加)
|
479
|
+
df_ret_event[t+'_CAR'] = df_ret_event[t+'_AR'].cumsum(skipna=True)
|
480
|
+
# BHAR:复利累积
|
481
|
+
df_ret_event[t+'_BHAR'] = ((1+df_ret_event[t+'_AR']/100).cumprod()-1)*100
|
460
482
|
except: continue
|
461
483
|
|
462
484
|
#合成事件前期间
|
@@ -464,11 +486,12 @@ def event_study(ticker,event_date, \
|
|
464
486
|
for t in ticker_name(ticker,ticker_type):
|
465
487
|
try:
|
466
488
|
df_ret_before_event[t+'_CAR']=np.nan
|
489
|
+
df_ret_before_event[t+'_BHAR']=np.nan
|
467
490
|
except: continue
|
468
491
|
|
469
492
|
df_show=pd.concat([df_ret_before_event,df_ret_event])
|
470
493
|
|
471
|
-
#是否显示AR
|
494
|
+
#是否显示AR:默认单证券显示,多证券时不显示
|
472
495
|
df_show_cols=[]
|
473
496
|
for c in list(df_show):
|
474
497
|
if show_AR=='auto':
|
@@ -555,6 +578,17 @@ def event_study(ticker,event_date, \
|
|
555
578
|
#footnote5=footnote5+c_name+p_value_str+","
|
556
579
|
#footnote5=footnote5+"{0}({1}, {2}), ".format(c_name,car_value_str,p_value_str)
|
557
580
|
footnote5=footnote5+"{0}({1}, {2}, {3}), ".format(c_name,car_mean_str,car_median_str,p_value_str)
|
581
|
+
|
582
|
+
if 'BHAR' in c.upper():
|
583
|
+
bhar_value=df_event_window[c][-1]
|
584
|
+
if bhar_value > 0:
|
585
|
+
bhar_value_str=str(round(bhar_value,4))[:6]
|
586
|
+
else:
|
587
|
+
bhar_value_str=str(round(bhar_value,4))[:7]
|
588
|
+
|
589
|
+
if show_BHAR:
|
590
|
+
footnote5=footnote5+"BHAR: {0}, ".format(bhar_value_str)
|
591
|
+
|
558
592
|
footnote5=footnote5.strip(", ")
|
559
593
|
|
560
594
|
#显著性检验:异于零的t检验,事件后窗口
|
@@ -606,6 +640,17 @@ def event_study(ticker,event_date, \
|
|
606
640
|
|
607
641
|
#footnote6=footnote6+c[:-4]+str(p_value)[:6]+","
|
608
642
|
footnote6=footnote6+"{0}({1}, {2}, {3}), ".format(c_name,car_mean_str,car_median_str,p_value_str)
|
643
|
+
|
644
|
+
if 'BHAR' in c.upper():
|
645
|
+
bhar_value=df_post_event_window[c][-1]
|
646
|
+
if bhar_value > 0:
|
647
|
+
bhar_value_str=str(round(bhar_value,4))[:6]
|
648
|
+
else:
|
649
|
+
bhar_value_str=str(round(bhar_value,4))[:7]
|
650
|
+
|
651
|
+
if show_BHAR:
|
652
|
+
footnote6=footnote6+"BHAR: {0}, ".format(bhar_value_str)
|
653
|
+
|
609
654
|
footnote6=footnote6.strip(", ")
|
610
655
|
|
611
656
|
footnote7="数据来源:Sina/EM/Yahoo/Stooq/SWHY,"+stoday
|
@@ -659,8 +704,16 @@ def event_study(ticker,event_date, \
|
|
659
704
|
attention_point.sort(reverse=False)
|
660
705
|
attention_point=list({}.fromkeys(attention_point).keys())
|
661
706
|
|
707
|
+
# 是否绘制CAR或BHAR曲线:对于短期窗口,CAR曲线和BHAR曲线很可能基本重合,建议仅绘制其中之一!
|
708
|
+
df0draw=df0.copy()
|
709
|
+
for c in list(df0draw):
|
710
|
+
if not draw_CAR and 'CAR' in c:
|
711
|
+
del df0draw[c]
|
712
|
+
if not draw_BHAR and 'BHAR' in c:
|
713
|
+
del df0draw[c]
|
714
|
+
|
662
715
|
#绘图
|
663
|
-
draw_lines(
|
716
|
+
draw_lines(df0draw,y_label,x_label,axhline_value,axhline_label,title_txt, \
|
664
717
|
data_label=False, \
|
665
718
|
loc=loc,resample_freq='D',smooth=False, \
|
666
719
|
annotate=True,annotate_value=False, \
|
@@ -668,7 +721,7 @@ def event_study(ticker,event_date, \
|
|
668
721
|
attention_point_area=attention_point_area, \
|
669
722
|
ticker_type=ticker_type,facecolor=facecolor)
|
670
723
|
|
671
|
-
#=====输出AR和/或CAR表格====================================================
|
724
|
+
#=====输出AR和/或CAR或BHAR表格====================================================
|
672
725
|
df1=df0.copy()
|
673
726
|
#df1=df1.replace([np.nan, None], np.nan).dropna()
|
674
727
|
df1=df1.replace([np.nan, None],'-')
|
@@ -735,6 +788,10 @@ def event_study(ticker,event_date, \
|
|
735
788
|
else:
|
736
789
|
footnote=footnote2+footnote3+footnote4+'\n'+footnote5+'\n'+footnote6
|
737
790
|
|
791
|
+
for c in list(df1):
|
792
|
+
if not show_BHAR and 'BHAR' in c:
|
793
|
+
del df1[c]
|
794
|
+
|
738
795
|
#显示结果表格
|
739
796
|
df_display_CSS(df1,titletxt=title_txt,footnote=footnote,facecolor=facecolor,decimals=4, \
|
740
797
|
first_col_align='left',second_col_align='left', \
|
@@ -34,7 +34,7 @@ siat/economy2.py,sha256=inmArHl43HFnSn6O4uY-xcsQY93IyMlFet3pQ7JpsjM,81089
|
|
34
34
|
siat/economy_test.py,sha256=6vjNlPz7W125pJb7simCddobSEp3jmLIMvVkLRZ7zW8,13339
|
35
35
|
siat/esg.py,sha256=GMhaonIKtvOK83rhpQUH5aJt2OL3HQBSVfD__Yw-0oo,19040
|
36
36
|
siat/esg_test.py,sha256=Z9m6GUt8O7oHZSEG9aDYpGdvvrv2AiRJdHTiU6jqmZ0,2944
|
37
|
-
siat/event_study.py,sha256=
|
37
|
+
siat/event_study.py,sha256=xhWpKMcLbXxyFWADxgEeMLp_370CsPonGlELbpOJVLA,36978
|
38
38
|
siat/exchange_bond_china.pickle,sha256=zDqdPrFacQ0nqjP_SuF6Yy87EgijIRsFvFroW7FAYYY,1265092
|
39
39
|
siat/fama_french.py,sha256=aUTC-67t_CEPbLk4u79woW_zfZ7OCP6Fo4z5EdWCSkQ,48051
|
40
40
|
siat/fama_french_test.py,sha256=M4O23lBKsJxhWHRluwCb3l7HSEn3OFTjzGMpehcevRg,4678
|
@@ -145,8 +145,8 @@ siat/valuation_china.py,sha256=eSKIDckyjG8QkENlW_OKkqbQHno8pzDcomBO9iGNJVM,83079
|
|
145
145
|
siat/valuation_market_china_test.py,sha256=gbJ0ioauuo4koTPH6WKUkqcXiQPafnbhU5eKJ6lpdLA,1571
|
146
146
|
siat/var_model_validation.py,sha256=R0caWnuZarrRg9939hxh3vJIIpIyPfvelYmzFNZtPbo,14910
|
147
147
|
siat/yf_name.py,sha256=laNKMTZ9hdenGX3IZ7G0a2RLBKEWtUQJFY9CWuk_fp8,24058
|
148
|
-
siat-3.9.
|
149
|
-
siat-3.9.
|
150
|
-
siat-3.9.
|
151
|
-
siat-3.9.
|
152
|
-
siat-3.9.
|
148
|
+
siat-3.9.10.dist-info/LICENSE,sha256=NTEMMROY9_4U1szoKC3N2BLHcDd_o5uTgqdVH8tbApw,1071
|
149
|
+
siat-3.9.10.dist-info/METADATA,sha256=tcyrbbCQ4PKsHAi4jCkJXdIAXyCicGRom6snzC3cqso,8335
|
150
|
+
siat-3.9.10.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
151
|
+
siat-3.9.10.dist-info/top_level.txt,sha256=r1cVyL7AIKqeAmEJjNR8FMT20OmEzufDstC2gv3NvEY,5
|
152
|
+
siat-3.9.10.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|