siat 2.14.2__py3-none-any.whl → 3.0.1__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/allin.py +1 -0
- siat/assets_liquidity.py +16 -16
- siat/beta_adjustment.py +6 -6
- siat/beta_adjustment_china.py +9 -9
- siat/bond.py +71 -67
- siat/capm_beta.py +11 -11
- siat/capm_beta2.py +49 -23
- siat/common.py +427 -60
- siat/compare_cross.py +15 -82
- siat/exchange_bond_china.pickle +0 -0
- siat/fama_french.py +3 -3
- siat/financials.py +15 -15
- siat/financials2.py +8 -8
- siat/financials_china.py +20 -20
- siat/financials_china2.py +25 -25
- siat/fund_china.pickle +0 -0
- siat/fund_china.py +5 -4
- siat/grafix.py +195 -132
- siat/markowitz.py +6 -5
- siat/option_china.py +1 -1
- siat/option_pricing.py +6 -6
- siat/risk_adjusted_return.py +14 -14
- siat/risk_adjusted_return2.py +64 -42
- siat/risk_evaluation.py +32 -32
- siat/risk_free_rate.py +0 -0
- siat/sector_china.py +3 -195
- siat/security_price2.py +616 -0
- siat/security_prices.py +935 -308
- siat/security_trend2.py +28 -47
- siat/stock.py +225 -437
- siat/stock_china.py +19 -19
- siat/stock_info.pickle +0 -0
- siat/stock_technical.py +547 -144
- siat/transaction.py +3 -3
- siat/translate.py +781 -24
- siat/valuation.py +6 -6
- siat/var_model_validation.py +2 -2
- {siat-2.14.2.dist-info → siat-3.0.1.dist-info}/METADATA +1 -1
- {siat-2.14.2.dist-info → siat-3.0.1.dist-info}/RECORD +41 -40
- {siat-2.14.2.dist-info → siat-3.0.1.dist-info}/WHEEL +0 -0
- {siat-2.14.2.dist-info → siat-3.0.1.dist-info}/top_level.txt +0 -0
siat/allin.py
CHANGED
siat/assets_liquidity.py
CHANGED
@@ -112,9 +112,9 @@ def roll_spread_portfolio(portfolio,start,end,printout=True):
|
|
112
112
|
|
113
113
|
_,_,tickerlist,sharelist=decompose_portfolio(portfolio)
|
114
114
|
if len(tickerlist)==1:
|
115
|
-
product=str(
|
115
|
+
product=str(ticker_name(tickerlist,'bond'))
|
116
116
|
else:
|
117
|
-
product=str(
|
117
|
+
product=str(ticker_name(tickerlist))+' by '+str(sharelist)
|
118
118
|
print("投资组合:",product)
|
119
119
|
print("计算期间:",date_start,"to",date_end, \
|
120
120
|
"(可用日期)")
|
@@ -193,9 +193,9 @@ def amihud_illiquidity_portfolio(portfolio,start,end,printout=True):
|
|
193
193
|
|
194
194
|
_,_,tickerlist,sharelist=decompose_portfolio(portfolio)
|
195
195
|
if len(tickerlist)==1:
|
196
|
-
product=str(
|
196
|
+
product=str(ticker_name(tickerlist,'bond'))
|
197
197
|
else:
|
198
|
-
product=str(
|
198
|
+
product=str(ticker_name(tickerlist))+' by '+str(sharelist)
|
199
199
|
print("投资组合:",product)
|
200
200
|
print("计算期间:",date_start,"至",date_end, \
|
201
201
|
"(可用日期)")
|
@@ -339,9 +339,9 @@ def ps_liquidity_portfolio(portfolio,start,end,printout=True):
|
|
339
339
|
|
340
340
|
_,_,tickerlist,sharelist=decompose_portfolio(portfolio)
|
341
341
|
if len(tickerlist)==1:
|
342
|
-
product=str(
|
342
|
+
product=str(ticker_name(tickerlist,'bond'))
|
343
343
|
else:
|
344
|
-
product=str(
|
344
|
+
product=str(ticker_name(tickerlist))+' by '+str(sharelist)
|
345
345
|
print("投资组合:",product)
|
346
346
|
print("计算期间:",date_start,"to",date_end, \
|
347
347
|
"(可用日期)")
|
@@ -424,9 +424,9 @@ def plot_liquidity_monthly(portfolio,start,end,liquidity_type):
|
|
424
424
|
|
425
425
|
_,_,tickerlist,sharelist=decompose_portfolio(portfolio)
|
426
426
|
if len(tickerlist)==1:
|
427
|
-
product=str(
|
427
|
+
product=str(ticker_name(tickerlist,'bond'))
|
428
428
|
else:
|
429
|
-
product=str(
|
429
|
+
product=str(ticker_name(tickerlist))+' by '+str(sharelist)
|
430
430
|
import datetime as dt; today=dt.date.today()
|
431
431
|
footnote="证券="+product+"\n数据来源:新浪/stooq, "+str(today)
|
432
432
|
datatag=False
|
@@ -522,9 +522,9 @@ def plot_liquidity_annual(portfolio,start,end,liquidity_type):
|
|
522
522
|
|
523
523
|
_,_,tickerlist,sharelist=decompose_portfolio(portfolio)
|
524
524
|
if len(tickerlist)==1:
|
525
|
-
product=str(
|
525
|
+
product=str(ticker_name(tickerlist,'bond'))
|
526
526
|
else:
|
527
|
-
product=str(
|
527
|
+
product=str(ticker_name(tickerlist,'bond'))+' by '+str(sharelist)
|
528
528
|
|
529
529
|
import datetime as dt; today=dt.date.today()
|
530
530
|
footnote="证券="+product+"\n数据来源:雅虎财经, "+str(today)
|
@@ -566,9 +566,9 @@ def draw_liquidity(liqs):
|
|
566
566
|
|
567
567
|
_,_,tickerlist,sharelist=decompose_portfolio(portfolio)
|
568
568
|
if len(tickerlist)==1:
|
569
|
-
product=str(
|
569
|
+
product=str(ticker_name(tickerlist))
|
570
570
|
else:
|
571
|
-
product=str(
|
571
|
+
product=str(ticker_name(tickerlist,'bond'))+' by '+str(sharelist)
|
572
572
|
|
573
573
|
import datetime as dt; today=dt.date.today()
|
574
574
|
footnote="证券="+product+"\n数据来源:新浪/stooq, "+str(today)
|
@@ -722,14 +722,14 @@ def compare_liquidity_rolling(portfolio1,portfolio2,start,end,liquidity_type,win
|
|
722
722
|
|
723
723
|
_,_,tickerlist1,sharelist1=decompose_portfolio(portfolio1)
|
724
724
|
if len(tickerlist1)==1:
|
725
|
-
product1=str(
|
725
|
+
product1=str(ticker_name(tickerlist1,'bond'))
|
726
726
|
else:
|
727
|
-
product1=str(
|
727
|
+
product1=str(ticker_name(tickerlist1,'bond'))+',持仓'+str(sharelist1)
|
728
728
|
_,_,tickerlist2,sharelist2=decompose_portfolio(portfolio2)
|
729
729
|
if len(tickerlist2)==1:
|
730
|
-
product2=str(
|
730
|
+
product2=str(ticker_name(tickerlist2,'bond'))
|
731
731
|
else:
|
732
|
-
product2=str(
|
732
|
+
product2=str(ticker_name(tickerlist2,'bond'))+',持仓'+str(sharelist2)
|
733
733
|
|
734
734
|
import datetime as dt; today=dt.date.today()
|
735
735
|
"""
|
siat/beta_adjustment.py
CHANGED
@@ -197,7 +197,7 @@ def draw2_betas(model,scope,ticker,betas):
|
|
197
197
|
stkname=stkinfo['shortName']
|
198
198
|
title1="\n"+stkname+"\n"+model+"\n(Benchmark on "+idxname+")"
|
199
199
|
"""
|
200
|
-
title1=
|
200
|
+
title1=ticker_name(ticker)+": "+model+"\n(基于"+ticker_name(scope)+")"
|
201
201
|
|
202
202
|
#转换索引类型为DatetimeIndex,便于后续处理
|
203
203
|
"""
|
@@ -846,11 +846,11 @@ def get_beta_hamada2(stkcd,mktidx,printout=True,graph=True):
|
|
846
846
|
cflb_avg_txt='均值: '+str(round(cflb_avg,1))+'%'
|
847
847
|
plt.axhline(y=cflb_avg,color='b',linestyle=':',label=cflb_avg_txt)
|
848
848
|
|
849
|
-
title1=
|
849
|
+
title1=ticker_name(stkcd)+": 财务杠杆对于贝塔系数的贡献度(CFLB)"
|
850
850
|
#plt.title(title1,fontsize=12,fontweight='bold')
|
851
851
|
plt.title(title1)
|
852
852
|
#plt.ylabel("CFLB %",fontsize=12,fontweight='bold')
|
853
|
-
footnote="注: 基于"+
|
853
|
+
footnote="注: 基于"+ticker_name(mktidx)
|
854
854
|
|
855
855
|
import datetime; today = datetime.date.today()
|
856
856
|
footnote2="\n数据来源: 新浪,"+str(today)
|
@@ -870,7 +870,7 @@ def get_beta_hamada2(stkcd,mktidx,printout=True,graph=True):
|
|
870
870
|
ticker1=ticker2=stkcd
|
871
871
|
colname1='CFLB%'; colname2='lev ratio'
|
872
872
|
label1='CFLB%'; label2='财务杠杆'
|
873
|
-
titletxt=
|
873
|
+
titletxt=ticker_name(stkcd)+": CFLB与财务杠杆之间的关系"
|
874
874
|
footnote='注: 这里的财务杠杆使用的是负债/所有者权益'
|
875
875
|
|
876
876
|
plot_line2_twinx(df1,ticker1,colname1,label1,df2,ticker2,colname2,label2, \
|
@@ -881,7 +881,7 @@ def get_beta_hamada2(stkcd,mktidx,printout=True,graph=True):
|
|
881
881
|
#ticker1=ticker2=stkcd
|
882
882
|
colname1='CFLB%'; colname2='tax rate'
|
883
883
|
label1='CFLB%'; label2='实际税率'
|
884
|
-
titletxt=
|
884
|
+
titletxt=ticker_name(stkcd)+": CFLB与税率之间的关系"
|
885
885
|
footnote='注: 这里使用的是实际税率'
|
886
886
|
|
887
887
|
plot_line2_twinx(df1,ticker1,colname1,label1,df2,ticker2,colname2,label2, \
|
@@ -994,7 +994,7 @@ def compare_mhamada(tickers,market_index="000001.SS"):
|
|
994
994
|
continue
|
995
995
|
else:
|
996
996
|
dft=df_tmp[['CFLB%']]
|
997
|
-
dft.rename(columns={'CFLB%':
|
997
|
+
dft.rename(columns={'CFLB%':ticker_name(t)},inplace=True)
|
998
998
|
|
999
999
|
if len(df)==0:
|
1000
1000
|
#第一个
|
siat/beta_adjustment_china.py
CHANGED
@@ -308,8 +308,8 @@ def get_beta_hamada_china_v0(stkcd,mktidx,start,end,printout=True,graph=True):
|
|
308
308
|
cflb_mean=betas['CFLB%'].mean()
|
309
309
|
plt.axhline(y=cflb_mean,color='b',linestyle=':',label='均值线')
|
310
310
|
|
311
|
-
title1=
|
312
|
-
"\n(基于"+
|
311
|
+
title1=ticker_name(stkcd)+": 财务杠杆对贝塔系数的贡献度(CFLB)"+ \
|
312
|
+
"\n(基于"+ticker_name(mktidx)+")"
|
313
313
|
plt.title(title1,fontsize=12,fontweight='bold')
|
314
314
|
plt.ylabel("CFLB%",fontsize=12,fontweight='bold')
|
315
315
|
|
@@ -359,8 +359,8 @@ def draw_hamada_factors_china(stkcd,mktidx,betas):
|
|
359
359
|
ax2.legend(loc='lower right')
|
360
360
|
ax2.set_xticklabels(betas.index,rotation=45)
|
361
361
|
|
362
|
-
title1=
|
363
|
-
"\n(基于"+
|
362
|
+
title1=ticker_name(stkcd)+": 滨田因子对贝塔系数的影响"+ \
|
363
|
+
"\n(基于"+ticker_name(mktidx)+")"
|
364
364
|
plt.title(title1,fontsize=12,fontweight='bold')
|
365
365
|
plt.style.use('ggplot')
|
366
366
|
plt.show()
|
@@ -461,9 +461,9 @@ def get_beta_hamada_china(stkcd,mktidx,start,end,period_type='all', \
|
|
461
461
|
return betas
|
462
462
|
|
463
463
|
#图1:绘制Hamada对比图
|
464
|
-
titletxt=
|
464
|
+
titletxt=ticker_name(stkcd)+":CAPM/无杠杆贝塔系数对比"
|
465
465
|
import datetime; today = datetime.date.today()
|
466
|
-
footnote="注: 基于"+
|
466
|
+
footnote="注: 基于"+ticker_name(mktidx)
|
467
467
|
footnote2="\n数据来源: 新浪,"+str(today)
|
468
468
|
#draw2_betas(model,mktidx,stkcd,betas)
|
469
469
|
plot_2lines(betas,'Beta(CAPM)','CAPM贝塔系数', \
|
@@ -494,7 +494,7 @@ def get_beta_hamada_china(stkcd,mktidx,start,end,period_type='all', \
|
|
494
494
|
plt.legend(loc='best')
|
495
495
|
plt.show(); plt.close()
|
496
496
|
"""
|
497
|
-
titletxt=
|
497
|
+
titletxt=ticker_name(stkcd)+": 财务杠杆对于贝塔系数的贡献度(CFLB)"
|
498
498
|
plot_line(betas,'CFLB%','CFLB%','财务杠杆对于贝塔系数的贡献度%',titletxt, \
|
499
499
|
footnote+cflb_avg_txt+footnote2,power=6)
|
500
500
|
|
@@ -503,7 +503,7 @@ def get_beta_hamada_china(stkcd,mktidx,start,end,period_type='all', \
|
|
503
503
|
ticker1=ticker2=stkcd
|
504
504
|
colname1='CFLB%'; colname2='lev ratio'
|
505
505
|
label1='CFLB%'; label2='财务杠杆'
|
506
|
-
titletxt=
|
506
|
+
titletxt=ticker_name(stkcd)+": CFLB与财务杠杆之间的关系"
|
507
507
|
footnote='注: 这里的财务杠杆使用的是负债/所有者权益'
|
508
508
|
|
509
509
|
plot_line2_twinx(df1,ticker1,colname1,label1,df2,ticker2,colname2,label2, \
|
@@ -514,7 +514,7 @@ def get_beta_hamada_china(stkcd,mktidx,start,end,period_type='all', \
|
|
514
514
|
#ticker1=ticker2=stkcd
|
515
515
|
colname1='CFLB%'; colname2='tax rate'
|
516
516
|
label1='CFLB%'; label2='实际税率'
|
517
|
-
titletxt=
|
517
|
+
titletxt=ticker_name(stkcd)+": CFLB与税率之间的关系"
|
518
518
|
footnote='注: 这里使用的是实际税率'
|
519
519
|
|
520
520
|
plot_line2_twinx(df1,ticker1,colname1,label1,df2,ticker2,colname2,label2, \
|
siat/bond.py
CHANGED
@@ -703,87 +703,73 @@ if __name__=='__main__':
|
|
703
703
|
symbol='sh019521'
|
704
704
|
symbol='019521.SS'
|
705
705
|
symbol='sz102229'
|
706
|
-
|
707
706
|
symbol='149124.SZ'
|
708
|
-
|
709
|
-
|
707
|
+
symbol='sh019319' #国债
|
708
|
+
|
709
|
+
fromdate='2024-1-1'
|
710
|
+
todate='2024-3-30'
|
710
711
|
power=4
|
712
|
+
graph=True
|
711
713
|
|
712
714
|
prices=exchange_bond_price(symbol,fromdate,todate,power=power)
|
713
715
|
|
714
|
-
def exchange_bond_price(symbol,fromdate,todate,power=0):
|
716
|
+
def exchange_bond_price(symbol,fromdate,todate,power=0,graph=True,data_crop=True):
|
715
717
|
"""
|
716
718
|
功能:获得沪深债券市场历史成交行情
|
717
719
|
输入:沪深债券代码symbol,起始日期fromdate,截止日期todate。
|
718
720
|
返回:历史价格df
|
719
721
|
输出:折线图
|
720
722
|
"""
|
721
|
-
|
723
|
+
import pandas as pd
|
724
|
+
import akshare as ak
|
725
|
+
import datetime
|
726
|
+
|
727
|
+
print(" Searching for bond",symbol,"\b, it may take great time, please wait ... ...")
|
722
728
|
|
723
729
|
#检查日期期间的合理性
|
724
730
|
result,start,end=check_period(fromdate, todate)
|
725
731
|
if result is None: return None
|
726
732
|
|
727
733
|
#变换代码格式
|
728
|
-
|
729
|
-
symbol2=symbol1
|
730
|
-
if '.ss' in symbol1:
|
731
|
-
symbol2='sh'+symbol1[:6]
|
732
|
-
if '.sz' in symbol1:
|
733
|
-
symbol2='sz'+symbol1[:6]
|
734
|
+
symbol2=tickers_cvt2ak(symbol)
|
734
735
|
|
735
736
|
#抓取历史行情
|
736
|
-
import akshare as ak
|
737
737
|
try:
|
738
738
|
df=ak.bond_zh_hs_daily(symbol=symbol2)
|
739
739
|
trddate1=str(df.head(1)['date'].values[0])
|
740
740
|
trddate2=str(df.tail(1)['date'].values[0])
|
741
741
|
except:
|
742
742
|
print(" #Error(exchange_bond_price), failed to get exchange bond prices of",symbol)
|
743
|
-
print(" Currently support bonds traded in
|
743
|
+
print(" Currently support bonds traded in exchanges only")
|
744
744
|
return None
|
745
745
|
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
df['s2date']=df['sdate'].dt.date
|
760
|
-
df1=df.drop(df[df.s2date < start].index)
|
761
|
-
df2=df1.drop(df1[df1.s2date > end].index)
|
762
|
-
df2.drop(['sdate','s2date'],axis=1,inplace=True)
|
763
|
-
|
764
|
-
if len(df2) == 0:
|
765
|
-
print(" #Warning(exchange_bond_price): no price info of",symbol,"between",fromdate,"and",todate)
|
766
|
-
print(" Price info of",symbol,"are only available between",trddate1,"and",trddate2)
|
767
|
-
return None
|
746
|
+
#是否过滤日期期间:债券有效时段较短,强制过滤时段可能形成空记录,影响其他函数判断
|
747
|
+
if data_crop:
|
748
|
+
df['datepd']=df['date'].apply(lambda x: pd.to_datetime(x))
|
749
|
+
df.set_index('datepd',inplace=True)
|
750
|
+
df2=df[(df.index >= start) & (df.index <= end)]
|
751
|
+
df2.rename(columns={'open':'Open','high':'High','low':'Low','close':'Close'},inplace=True)
|
752
|
+
|
753
|
+
if len(df2) == 0:
|
754
|
+
print(" #Warning(exchange_bond_price): no prices of",symbol,"between",fromdate,"and",todate)
|
755
|
+
print(" Prices of",symbol,"exist between",trddate1,"and",trddate2)
|
756
|
+
return df2
|
757
|
+
else:
|
758
|
+
df2=df
|
768
759
|
|
769
760
|
#绘图
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
titletxt=
|
780
|
-
footnote="Source: Sina Finance, "+today
|
781
|
-
close_txt='Close'
|
782
|
-
ylabel_txt='Price'
|
783
|
-
|
784
|
-
plot_line(df2,'close',texttranslate(close_txt),texttranslate(ylabel_txt),titletxt,footnote,power=power)
|
761
|
+
if graph:
|
762
|
+
todaydt = datetime.date.today().strftime("%Y-%m-%d")
|
763
|
+
titletxt1=text_lang('沪深债券行情:','Exchange Bond Price Trend: ')
|
764
|
+
titletxt=titletxt1+ticker_name(symbol,'bond')
|
765
|
+
close_txt=text_lang('收盘价','Close')
|
766
|
+
ylabel_txt=text_lang('价格','Price')
|
767
|
+
footnote0=text_lang('数据来源:新浪,','Data source: sina, ')
|
768
|
+
footnote=footnote0+todaydt
|
769
|
+
|
770
|
+
plot_line(df2,'Close',close_txt,ylabel_txt,titletxt,footnote,power=power)
|
785
771
|
|
786
|
-
return
|
772
|
+
return df2
|
787
773
|
|
788
774
|
if __name__=='__main__':
|
789
775
|
symbol='sh143595'
|
@@ -893,41 +879,59 @@ if __name__=='__main__':
|
|
893
879
|
|
894
880
|
#==============================================================================
|
895
881
|
if __name__=='__main__':
|
896
|
-
symbol='
|
897
|
-
|
898
|
-
|
882
|
+
symbol='sh019521'
|
883
|
+
symbol='sh113565'
|
884
|
+
symbol='sh019319'
|
885
|
+
|
886
|
+
fromdate='2024-1-1'
|
887
|
+
todate='2024-3-31'
|
888
|
+
|
889
|
+
cov=exchange_covbond_price(symbol,fromdate,todate)
|
899
890
|
|
900
|
-
def exchange_covbond_price(symbol,fromdate,todate):
|
891
|
+
def exchange_covbond_price(symbol,fromdate,todate,power=0,graph=True):
|
901
892
|
"""
|
902
893
|
功能:获得沪深市场可转债历史成交行情
|
903
894
|
输入:沪深债券代码symbol,起始日期fromdate,截止日期todate。
|
904
895
|
返回:历史价格df
|
905
896
|
输出:折线图
|
906
897
|
"""
|
898
|
+
print(" Searching for bond",symbol,"\b, it takes great time, please wait ... ...")
|
899
|
+
|
900
|
+
import pandas as pd
|
901
|
+
import akshare as ak
|
902
|
+
import datetime
|
903
|
+
|
907
904
|
#检查日期期间的合理性
|
908
905
|
result,start,end=check_period(fromdate, todate)
|
909
906
|
if result is None: return None
|
910
907
|
|
908
|
+
#变换代码格式
|
909
|
+
symbol2=tickers_cvt2ak(symbol)
|
910
|
+
|
911
911
|
#抓取历史行情
|
912
|
-
import akshare as ak
|
913
912
|
try:
|
914
|
-
df=ak.bond_zh_hs_cov_daily(symbol=
|
913
|
+
df=ak.bond_zh_hs_cov_daily(symbol=symbol2)
|
915
914
|
except:
|
916
915
|
print(" #Error(exchange_covbond_price), failed to get info of",symbol)
|
917
916
|
return None
|
918
917
|
|
919
|
-
|
920
|
-
|
921
|
-
|
922
|
-
|
923
|
-
df2
|
918
|
+
#过滤日期期间
|
919
|
+
df['datepd']=df['date'].apply(lambda x: pd.to_datetime(x))
|
920
|
+
df.set_index('datepd',inplace=True)
|
921
|
+
df2=df[(df.index >= start) & (df.index <= end)]
|
922
|
+
df2.rename(columns={'open':'Open','high':'High','low':'Low','close':'Close'},inplace=True)
|
924
923
|
|
925
924
|
#绘图
|
926
|
-
|
927
|
-
|
928
|
-
|
929
|
-
|
930
|
-
|
925
|
+
if graph:
|
926
|
+
todaydt = datetime.date.today().strftime("%Y-%m-%d")
|
927
|
+
titletxt1=text_lang('沪深债券行情:','Exchange Bond Price Trend: ')
|
928
|
+
titletxt=titletxt1+get_exchange_bond_name_china2(symbol)
|
929
|
+
close_txt=text_lang('收盘价','Close')
|
930
|
+
ylabel_txt=text_lang('价格','Price')
|
931
|
+
footnote0=text_lang('数据来源:新浪,','Data source: sina, ')
|
932
|
+
footnote=footnote0+todaydt
|
933
|
+
|
934
|
+
plot_line(df2,'Close',close_txt,ylabel_txt,titletxt,footnote,power=power)
|
931
935
|
|
932
936
|
return df
|
933
937
|
|
siat/capm_beta.py
CHANGED
@@ -155,8 +155,8 @@ def capm_beta(ticker,mktidx,start,end):
|
|
155
155
|
#显示回归结果
|
156
156
|
print(" \n===== 计算CAPM贝塔系数 =====")
|
157
157
|
print("回归模型:市场模型")
|
158
|
-
print(equalwidth("股票",16),
|
159
|
-
print(equalwidth("市场指数",16),
|
158
|
+
print(equalwidth("股票",16), ticker_name(ticker))
|
159
|
+
print(equalwidth("市场指数",16), ticker_name(mktidx))
|
160
160
|
print(equalwidth("样本期间开始于",16), start)
|
161
161
|
print(equalwidth("样本期间结束于",16), end)
|
162
162
|
print(equalwidth("截距项",16), round(alpha,4))
|
@@ -317,17 +317,17 @@ def capm_beta_yearly(ticker,mktidx,yearlist):
|
|
317
317
|
pd.set_option('display.unicode.east_asian_width', True)
|
318
318
|
pd.set_option('display.width', 180) # 设置打印宽度(**重要**)
|
319
319
|
|
320
|
-
print("\n ===== 股票的年度贝塔系数:",
|
320
|
+
print("\n ===== 股票的年度贝塔系数:",ticker_name(ticker),"=====")
|
321
321
|
print(betas.to_string(index=False))
|
322
322
|
import datetime as dt; today=dt.date.today()
|
323
|
-
print(" 数据来源:新浪/stooq/fred,基于"+
|
323
|
+
print(" 数据来源:新浪/stooq/fred,基于"+ticker_name(mktidx)+','+str(today))
|
324
324
|
|
325
325
|
betas.set_index('Year',inplace=True)
|
326
326
|
|
327
327
|
#绘图:年度贝塔系数趋势
|
328
328
|
df=pd.DataFrame(betas['Beta'])
|
329
|
-
title="股票的年度贝塔系数趋势: "+
|
330
|
-
foot="\n数据来源:新浪/stooq/fred,基于"+
|
329
|
+
title="股票的年度贝塔系数趋势: "+ticker_name(ticker)
|
330
|
+
foot="\n数据来源:新浪/stooq/fred,基于"+ticker_name(mktidx)+','+str(today)
|
331
331
|
plot_trend(title,foot,df,power=3,axhline_value=1,axhline_label='市场风险线')
|
332
332
|
|
333
333
|
return betas
|
@@ -488,7 +488,7 @@ def capm_beta_portfolio_yearly(tickerlist,sharelist,mktidx,yearlist):
|
|
488
488
|
#绘图:年度贝塔系数变化
|
489
489
|
df=pd.DataFrame(betas['Beta'])
|
490
490
|
title="投资组合的年度贝塔系数"+ \
|
491
|
-
"\n成分股: "+str(
|
491
|
+
"\n成分股: "+str(ticker_name(tickerlist,'bond'))+"\n持仓权重: "+str(sharelist)
|
492
492
|
import datetime; today = datetime.date.today()
|
493
493
|
foot="数据来源: 新浪/stooq/fred,"+str(today)
|
494
494
|
plot_trend(title,foot,df,power=2,axhline_value=1,axhline_label='市场风险线')
|
@@ -724,20 +724,20 @@ def compare2_betas_yearly(ticker1,ticker2,mktidx,yearlist):
|
|
724
724
|
betas2.set_index('Year',inplace=True)
|
725
725
|
|
726
726
|
#绘图:年度贝塔系数变化
|
727
|
-
plt.plot(betas1['Beta'],label=
|
728
|
-
plt.plot(betas2['Beta'],label=
|
727
|
+
plt.plot(betas1['Beta'],label=ticker_name(ticker1),c='red',marker='o',lw=1)
|
728
|
+
plt.plot(betas2['Beta'],label=ticker_name(ticker2),c='blue',marker='D',lw=2,linestyle='--')
|
729
729
|
|
730
730
|
#plt.axhline(y=1.0,color='b',linestyle=':',c='green',label='市场平均风险')
|
731
731
|
plt.axhline(y=1.0,color='b',linestyle=':',c='black')
|
732
732
|
|
733
733
|
plt.ylabel("贝塔系数",fontweight='bold')
|
734
734
|
plt.xticks(rotation=45,fontweight='bold')
|
735
|
-
trtitle="比较证券之间的贝塔系数"+"\n"+
|
735
|
+
trtitle="比较证券之间的贝塔系数"+"\n"+ticker_name(ticker1)+" vs "+ticker_name(ticker2)
|
736
736
|
plt.title(trtitle,fontweight='bold')
|
737
737
|
plt.legend(loc='best')
|
738
738
|
|
739
739
|
import datetime; today = datetime.date.today()
|
740
|
-
plt.xlabel("数据来源:新浪/stooq/fred,基于"+
|
740
|
+
plt.xlabel("数据来源:新浪/stooq/fred,基于"+ticker_name(mktidx)+','+str(today))
|
741
741
|
plt.show()
|
742
742
|
|
743
743
|
return betas1,betas2
|