siat 3.0.43__py3-none-any.whl → 3.0.44__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/capm_beta2.py +29 -21
- siat/common.py +1 -1
- siat/risk_adjusted_return2.py +11 -6
- {siat-3.0.43.dist-info → siat-3.0.44.dist-info}/METADATA +1 -1
- {siat-3.0.43.dist-info → siat-3.0.44.dist-info}/RECORD +7 -7
- {siat-3.0.43.dist-info → siat-3.0.44.dist-info}/WHEEL +0 -0
- {siat-3.0.43.dist-info → siat-3.0.44.dist-info}/top_level.txt +0 -0
siat/capm_beta2.py
CHANGED
@@ -35,8 +35,8 @@ def get_market_index_code(ticker):
|
|
35
35
|
"""
|
36
36
|
功能:基于股票ticker确定其所在市场的大盘指数代码
|
37
37
|
"""
|
38
|
-
ticker=
|
39
|
-
_,_,suffix=split_prefix_suffix(ticker
|
38
|
+
ticker=tickers_cvt2yahoo(ticker)
|
39
|
+
_,_,suffix=split_prefix_suffix(ticker)
|
40
40
|
|
41
41
|
if suffix in ['SS']:
|
42
42
|
mktidx='000001.SS' #上证综合指数
|
@@ -78,15 +78,14 @@ if __name__=='__main__':
|
|
78
78
|
|
79
79
|
start2='2022-10-31'
|
80
80
|
end='2024-3-23'
|
81
|
-
ret_type='Annual Ret%'
|
82
81
|
RF=0.01759
|
83
82
|
regtrddays=252
|
84
83
|
|
85
84
|
mktidx='auto'; source='auto'
|
86
85
|
|
87
|
-
reg_result,dretdf3=regression_capm(ticker,start2,end,
|
86
|
+
reg_result,dretdf3=regression_capm(ticker,start2,end,RF,regtrddays)
|
88
87
|
|
89
|
-
def regression_capm(ticker,start2,end,
|
88
|
+
def regression_capm(ticker,start2,end,RF=0,regtrddays=252, \
|
90
89
|
mktidx='auto',source='auto',ticker_type='auto'):
|
91
90
|
"""
|
92
91
|
功能:进行CAPM回归,R-Rf=beta*(Rm-Rf),无截距项回归
|
@@ -138,13 +137,9 @@ def regression_capm(ticker,start2,end,ret_type='Annual Ret%',RF=0,regtrddays=252
|
|
138
137
|
dretdf1=pd.merge(marketdf1,pricedf1,how='inner',left_index=True,right_index=True)
|
139
138
|
|
140
139
|
#准备CAPM回归文件
|
141
|
-
ret_type_lower=ret_type.lower()
|
142
140
|
dretname='Daily Ret'
|
143
141
|
#计算日无风险利率
|
144
142
|
RF_daily=RF / 365
|
145
|
-
if '%' in ret_type_lower:
|
146
|
-
dretname='Daily Ret%'
|
147
|
-
RF_daily=RF_daily * 100
|
148
143
|
|
149
144
|
dretx=dretname+'_x' #指数日收益率
|
150
145
|
drety=dretname+'_y' #股票日收益率
|
@@ -194,6 +189,8 @@ def regression_capm(ticker,start2,end,ret_type='Annual Ret%',RF=0,regtrddays=252
|
|
194
189
|
if 'index' in list(dretdf3):
|
195
190
|
del dretdf3['index']
|
196
191
|
|
192
|
+
reg_result['mktidx']=mktidx
|
193
|
+
|
197
194
|
return reg_result,dretdf3
|
198
195
|
|
199
196
|
#==============================================================================
|
@@ -220,9 +217,9 @@ def get_capm_beta(ticker,start,end,RF=0,regtrddays=252,mktidx='auto', \
|
|
220
217
|
start2=date_adjust(start,adjust=-365/252 * regtrddays -31*2)
|
221
218
|
|
222
219
|
reg_result,_=regression_capm(ticker=ticker,start2=start2,end=end, \
|
223
|
-
|
220
|
+
RF=RF, \
|
224
221
|
regtrddays=regtrddays,mktidx=mktidx, \
|
225
|
-
|
222
|
+
source=source,ticker_type=ticker_type)
|
226
223
|
|
227
224
|
startpd=pd.to_datetime(date_adjust(start,adjust=-7))
|
228
225
|
endpd=pd.to_datetime(end)
|
@@ -246,6 +243,7 @@ if __name__=='__main__':
|
|
246
243
|
annotate=False
|
247
244
|
mktidx='auto'
|
248
245
|
source='auto'
|
246
|
+
ticker_type='auto'
|
249
247
|
|
250
248
|
betas=compare_mticker_1beta(ticker,start,end)
|
251
249
|
|
@@ -298,7 +296,7 @@ def compare_mticker_1beta(ticker,start,end, \
|
|
298
296
|
else:
|
299
297
|
dft=df_tmp[['beta']]
|
300
298
|
dft.rename(columns={'beta':ticker_name(t,tt)},inplace=True)
|
301
|
-
|
299
|
+
mktidx_name=ticker_name(df_tmp['mktidx'].values[0])
|
302
300
|
if len(df)==0: #第一个
|
303
301
|
df=dft
|
304
302
|
else:
|
@@ -310,7 +308,9 @@ def compare_mticker_1beta(ticker,start,end, \
|
|
310
308
|
|
311
309
|
#仅用于绘图和制表
|
312
310
|
df1=df.copy()
|
313
|
-
|
311
|
+
beta_list=list(df1)
|
312
|
+
|
313
|
+
for c in beta_list:
|
314
314
|
#是否绘制水平线
|
315
315
|
if df1[c].max() > axhline_value and df1[c].min() < axhline_value:
|
316
316
|
axhline_label='零线'
|
@@ -323,7 +323,7 @@ def compare_mticker_1beta(ticker,start,end, \
|
|
323
323
|
else:
|
324
324
|
footnote2="假设年化无风险利率为零。"
|
325
325
|
|
326
|
-
footnote3="
|
326
|
+
footnote3="基于"+mktidx_name+",回归期间为"+str(regression_period)+"个自然日。"
|
327
327
|
|
328
328
|
import datetime; todaydt = datetime.date.today()
|
329
329
|
footnote4="数据来源: 综合新浪/stooq/Yahoo,"+str(todaydt)+"统计"
|
@@ -361,6 +361,7 @@ if __name__=='__main__':
|
|
361
361
|
annotate=False
|
362
362
|
mktidx='auto'
|
363
363
|
source='auto'
|
364
|
+
ticker_type='auto'
|
364
365
|
|
365
366
|
betas=compare_1ticker_mRF(ticker,start,end,RF)
|
366
367
|
|
@@ -412,7 +413,8 @@ def compare_1ticker_mRF(ticker,start,end, \
|
|
412
413
|
else:
|
413
414
|
dft=df_tmp[['beta']]
|
414
415
|
dft.rename(columns={'beta':"基于无风险利率"+str(round(t*100,4))+'%'},inplace=True)
|
415
|
-
|
416
|
+
mktidx_name=ticker_name(df_tmp['mktidx'].values[0])
|
417
|
+
|
416
418
|
if len(df)==0: #第一个
|
417
419
|
df=dft
|
418
420
|
else:
|
@@ -424,7 +426,9 @@ def compare_1ticker_mRF(ticker,start,end, \
|
|
424
426
|
|
425
427
|
#仅用于绘图和制表
|
426
428
|
df1=df.copy()
|
427
|
-
|
429
|
+
beta_list=list(df1)
|
430
|
+
|
431
|
+
for c in beta_list:
|
428
432
|
#是否绘制水平线
|
429
433
|
if df1[c].max() > axhline_value and df1[c].min() < axhline_value:
|
430
434
|
axhline_label='零线'
|
@@ -438,7 +442,8 @@ def compare_1ticker_mRF(ticker,start,end, \
|
|
438
442
|
footnote1="注:"
|
439
443
|
footnote2=""
|
440
444
|
|
441
|
-
footnote3="贝塔系数基于日收益率,回归期间跨度为"+str(regression_period)+"个自然日。"
|
445
|
+
#footnote3="贝塔系数基于日收益率,回归期间跨度为"+str(regression_period)+"个自然日。"
|
446
|
+
footnote3="基于"+mktidx_name+",回归期间为"+str(regression_period)+"个自然日。"
|
442
447
|
|
443
448
|
import datetime; todaydt = datetime.date.today()
|
444
449
|
footnote4="数据来源: 综合新浪/stooq/Yahoo,"+str(todaydt)+"统计"
|
@@ -526,7 +531,7 @@ def compare_1ticker_mregression_period(ticker,start,end, \
|
|
526
531
|
else:
|
527
532
|
dft=df_tmp[['beta']]
|
528
533
|
dft.rename(columns={'beta':"基于"+str(t)+"自然日回归"},inplace=True)
|
529
|
-
|
534
|
+
mktidx_name=ticker_name(df_tmp['mktidx'].values[0])
|
530
535
|
if len(df)==0: #第一个
|
531
536
|
df=dft
|
532
537
|
else:
|
@@ -538,7 +543,9 @@ def compare_1ticker_mregression_period(ticker,start,end, \
|
|
538
543
|
|
539
544
|
#仅用于绘图和制表
|
540
545
|
df1=df.copy()
|
541
|
-
|
546
|
+
beta_list=list(df1)
|
547
|
+
|
548
|
+
for c in beta_list:
|
542
549
|
#是否绘制水平线
|
543
550
|
if df1[c].max() > axhline_value and df1[c].min() < axhline_value:
|
544
551
|
axhline_label='零线'
|
@@ -548,8 +555,9 @@ def compare_1ticker_mregression_period(ticker,start,end, \
|
|
548
555
|
footnote1="注:"
|
549
556
|
footnote2=""
|
550
557
|
|
551
|
-
footnote3="贝塔系数基于日收益率,无风险利率为"+str(round(RF*100,4))+'%'
|
552
|
-
|
558
|
+
#footnote3="贝塔系数基于日收益率,无风险利率为"+str(round(RF*100,4))+'%'
|
559
|
+
footnote3="基于"+mktidx_name+",回归期间为"+str(regression_period)+"个自然日。"
|
560
|
+
|
553
561
|
import datetime; todaydt = datetime.date.today()
|
554
562
|
footnote4="数据来源: 综合新浪/stooq/Yahoo,"+str(todaydt)+"统计"
|
555
563
|
if footnote3 !='':
|
siat/common.py
CHANGED
siat/risk_adjusted_return2.py
CHANGED
@@ -282,7 +282,7 @@ def get_rolling_treynor_alpha(ticker,start,end,rar_name="alpha", \
|
|
282
282
|
start2=date_adjust(start1,adjust=-regression_period-7*2)
|
283
283
|
|
284
284
|
#CAPM回归,计算贝塔系数
|
285
|
-
reg_result,dretdf3=regression_capm(ticker,start2,end,
|
285
|
+
reg_result,dretdf3=regression_capm(ticker,start2,end,RF=RF, \
|
286
286
|
regtrddays=regtrddays,mktidx=mktidx, \
|
287
287
|
source=source,ticker_type=ticker_type)
|
288
288
|
|
@@ -368,7 +368,7 @@ def get_expanding_treynor_alpha(ticker,start,end,rar_name="alpha", \
|
|
368
368
|
start2=date_adjust(start1,adjust=-regression_period-7*2)
|
369
369
|
|
370
370
|
#CAPM回归,计算贝塔系数
|
371
|
-
reg_result,dretdf3=regression_capm(ticker,start2,end,
|
371
|
+
reg_result,dretdf3=regression_capm(ticker,start2,end,RF=RF, \
|
372
372
|
regtrddays=regtrddays,mktidx=mktidx, \
|
373
373
|
source=source,ticker_type=ticker_type)
|
374
374
|
|
@@ -910,7 +910,7 @@ def compare_mticker_mrar(ticker,start,end,rar=['sharpe','alpha','sortino','treyn
|
|
910
910
|
from IPython.display import display
|
911
911
|
display(df3)
|
912
912
|
"""
|
913
|
-
|
913
|
+
"""
|
914
914
|
disph=df1.style.hide() #不显示索引列
|
915
915
|
dispp=disph.format(precision=3) #设置带有小数点的列精度调整为小数点后3位
|
916
916
|
#设置标题/列名
|
@@ -931,7 +931,7 @@ def compare_mticker_mrar(ticker,start,end,rar=['sharpe','alpha','sortino','treyn
|
|
931
931
|
|
932
932
|
from IPython.display import display
|
933
933
|
display(dispf2)
|
934
|
-
|
934
|
+
"""
|
935
935
|
|
936
936
|
"""
|
937
937
|
print(df1.to_string(justify='left'))
|
@@ -977,7 +977,10 @@ def compare_mticker_mrar(ticker,start,end,rar=['sharpe','alpha','sortino','treyn
|
|
977
977
|
|
978
978
|
footnote3=''
|
979
979
|
if 'treynor' in rar or 'alpha' in rar:
|
980
|
-
|
980
|
+
if mktidx=='auto':
|
981
|
+
mktidx=get_market_index_code(ticker[0] if isinstance(ticker,list) else ticker)
|
982
|
+
mktidx_name=ticker_name(mktidx)
|
983
|
+
footnote3="贝塔系数基于"+mktidx_name+",回归期间"+str(regression_period)+"个自然日"
|
981
984
|
|
982
985
|
import datetime; todaydt = datetime.date.today()
|
983
986
|
footnote4="数据来源: 综合新浪/stooq/Yahoo,"+str(todaydt)+"统计"
|
@@ -987,7 +990,9 @@ def compare_mticker_mrar(ticker,start,end,rar=['sharpe','alpha','sortino','treyn
|
|
987
990
|
footnotex=footnote1+footnote2+'\n'+footnote4
|
988
991
|
|
989
992
|
#print("\n"+footnotex)
|
990
|
-
print(footnotex)
|
993
|
+
#print(footnotex)
|
994
|
+
|
995
|
+
df_display_CSS(df1,titletxt=titletxt,footnote=footnotex,decimals=4)
|
991
996
|
|
992
997
|
return df
|
993
998
|
|
@@ -14,10 +14,10 @@ siat/bond_china.py,sha256=eYv-nMoWSS5fZ4VxnuJ29QFY9GUS6meGiIc0Xjm1fQI,3038
|
|
14
14
|
siat/bond_test.py,sha256=yUOFw7ddGU-kb1rJdnsjkJWziDNgUR7OLDA7F7Ub91A,5246
|
15
15
|
siat/bond_zh_sina.py,sha256=26BohGcS120utwqg9dJvdGm5OkuNpNu5bco80uOuQpU,4423
|
16
16
|
siat/capm_beta.py,sha256=cxXdRVBQBllhbfz1LeTJAIWvyRYhW54nhtNUXv4HwS0,29063
|
17
|
-
siat/capm_beta2.py,sha256=
|
17
|
+
siat/capm_beta2.py,sha256=UOI4sCz3ld7yezlARqPHvgHzfduDiGeRqNa82dDTCZ8,25849
|
18
18
|
siat/capm_beta_test.py,sha256=ImR0c5mc4hIl714XmHztdl7qg8v1E2lycKyiqnFj6qs,1745
|
19
19
|
siat/cmat_commons.py,sha256=Nj9Kf0alywaztVoMVeVVL_EZk5jRERJy8R8kBw88_Tg,38116
|
20
|
-
siat/common.py,sha256=
|
20
|
+
siat/common.py,sha256=0_fT64-X80rOPOqc6x6D_3WOLN2mKQ4UWZTuRqoLIAc,142992
|
21
21
|
siat/compare_cross.py,sha256=3iP9TH2h3w27F2ARZc7FjKcErYCzWRc-TPiymOyoVtw,24171
|
22
22
|
siat/compare_cross_test.py,sha256=xra5XYmQGEtfIZL2h-GssdH2hLdFIhG3eoCrkDrL3gY,3473
|
23
23
|
siat/concepts_iwencai.py,sha256=m1YEDtECRT6FqtzlKm91pt2I9d3Z_XoP59BtWdRdu8I,3061
|
@@ -85,7 +85,7 @@ siat/option_sina_api_test.py,sha256=dn-k_wrQnAaNKHoROvWJEc7lqlU0bwiV2Aa4usWAFGM,
|
|
85
85
|
siat/proxy_test.py,sha256=erQJrmGs2X46z8Gb1h-7GYQ0rTUcaR8dxHExWoBz2eM,2610
|
86
86
|
siat/quandl_test.py,sha256=EcPoXnLuqzPl5dKyVEZi3j3PJZFpsnU_iNPhLWC9p-A,1552
|
87
87
|
siat/risk_adjusted_return.py,sha256=L5FoeOFzvItT03gNBTCaIo32hUvncOJkbchtHOveSBM,54929
|
88
|
-
siat/risk_adjusted_return2.py,sha256=
|
88
|
+
siat/risk_adjusted_return2.py,sha256=0HtLKvXSZ8NO3lyVPRAj55axtvqsvpnHkzIi4NOdhmc,64593
|
89
89
|
siat/risk_adjusted_return_test.py,sha256=m_VHL5AtT74cJv5i7taTeTfnkX48y0AFJk5phawyYWg,3416
|
90
90
|
siat/risk_evaluation.py,sha256=I6B3gty-t--AkDCO0tKF-291YfpnF-IkXcFjqNKCt9I,76286
|
91
91
|
siat/risk_evaluation_test.py,sha256=YEXM96gKzTfwN4U61AS4Rr1tV7KgUvn4rRC6f3iMw9s,3731
|
@@ -132,7 +132,7 @@ siat/valuation.py,sha256=NKfeZMdDJOW42oLVHob6eSVBXUqlN1OCnnzwyGAst8c,48855
|
|
132
132
|
siat/valuation_china.py,sha256=Tde2LzPDQy3Z7xOQQDw4ckQMPdROp_z0-GjFE6Z5_lI,67639
|
133
133
|
siat/valuation_market_china_test.py,sha256=gbJ0ioauuo4koTPH6WKUkqcXiQPafnbhU5eKJ6lpdLA,1571
|
134
134
|
siat/var_model_validation.py,sha256=f-oDewg7bPzyNanz_Y_jLH68NowAA3gXFehW_weKGG0,14898
|
135
|
-
siat-3.0.
|
136
|
-
siat-3.0.
|
137
|
-
siat-3.0.
|
138
|
-
siat-3.0.
|
135
|
+
siat-3.0.44.dist-info/METADATA,sha256=lpYsF83FvwNlChiPm7slWucBOXtr6f2JcxFVEiMDSps,1448
|
136
|
+
siat-3.0.44.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
|
137
|
+
siat-3.0.44.dist-info/top_level.txt,sha256=r1cVyL7AIKqeAmEJjNR8FMT20OmEzufDstC2gv3NvEY,5
|
138
|
+
siat-3.0.44.dist-info/RECORD,,
|
File without changes
|
File without changes
|