siat 3.1.28__py3-none-any.whl → 3.2.2__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 CHANGED
@@ -85,7 +85,9 @@ if __name__=='__main__':
85
85
 
86
86
  reg_result,dretdf3=regression_capm(ticker,start2,end,RF,regtrddays)
87
87
 
88
- def regression_capm(ticker,start2,end,RF=0,regtrddays=252, \
88
+ def regression_capm(ticker,start2,end, \
89
+ adjust='', \
90
+ RF=0,regtrddays=252, \
89
91
  mktidx='auto',source='auto',ticker_type='auto'):
90
92
  """
91
93
  功能:进行CAPM回归,R-Rf=beta*(Rm-Rf),无截距项回归
@@ -100,8 +102,9 @@ def regression_capm(ticker,start2,end,RF=0,regtrddays=252, \
100
102
  print("*** DEBUG:",ticker,start2,end)
101
103
  #pricedf=get_price(ticker,start2,end,source=source)
102
104
  #pricedf=get_price_security(ticker,start2,end,source=source)
103
- pricedf,found=get_price_1ticker_mixed(ticker=ticker,fromdate=start2, \
104
- todate=end,source=source,ticker_type=ticker_type)
105
+ pricedf,found=get_price_1ticker_mixed(ticker=ticker,fromdate=start2,todate=end, \
106
+ adjust=adjust, \
107
+ source=source,ticker_type=ticker_type)
105
108
 
106
109
  if pricedf is None:
107
110
  print(" #Error(regression_capm): info of security",ticker_name(ticker,ticker_type),"not found or inaccessible")
@@ -124,8 +127,10 @@ def regression_capm(ticker,start2,end,RF=0,regtrddays=252, \
124
127
  mktidx=get_market_index_code(ticker)
125
128
 
126
129
  #marketdf=get_price(mktidx,start2,end,source=source)
127
- marketdf,found=get_price_1ticker_mixed(ticker=mktidx,fromdate=start2, \
128
- todate=end,source=source,ticker_type=ticker_type)
130
+ #大盘指数实际上无复权价?
131
+ marketdf,found=get_price_1ticker_mixed(ticker=mktidx,fromdate=start2,todate=end, \
132
+ adjust=adjust, \
133
+ source=source,ticker_type=ticker_type)
129
134
 
130
135
  if marketdf is None:
131
136
  print(" #Error(regression_capm): info of market index",mktidx,"not found or inaccessible")
@@ -137,7 +142,11 @@ def regression_capm(ticker,start2,end,RF=0,regtrddays=252, \
137
142
  dretdf1=pd.merge(marketdf1,pricedf1,how='inner',left_index=True,right_index=True)
138
143
 
139
144
  #准备CAPM回归文件
140
- dretname='Daily Ret'
145
+ if adjust == '':
146
+ dretname='Daily Ret'
147
+ else:
148
+ dretname='Daily Adj Ret'
149
+
141
150
  #计算日无风险利率
142
151
  RF_daily=RF / 365
143
152
 
@@ -207,7 +216,7 @@ if __name__=='__main__':
207
216
  beta1=get_capm_beta(ticker,start,end,RF,regtrddays)
208
217
  beta1.plot()
209
218
 
210
- def get_capm_beta(ticker,start,end,RF=0,regtrddays=252,mktidx='auto', \
219
+ def get_capm_beta(ticker,start,end,adjust='',RF=0,regtrddays=252,mktidx='auto', \
211
220
  source='auto',ticker_type='auto'):
212
221
  """
213
222
  功能:套壳函数regression_capm,仅返回滚动的贝塔系数,基于日收益率
@@ -217,6 +226,7 @@ def get_capm_beta(ticker,start,end,RF=0,regtrddays=252,mktidx='auto', \
217
226
  start2=date_adjust(start,adjust=-365/252 * regtrddays -31*2)
218
227
 
219
228
  reg_result,_=regression_capm(ticker=ticker,start2=start2,end=end, \
229
+ adjust=adjust, \
220
230
  RF=RF, \
221
231
  regtrddays=regtrddays,mktidx=mktidx, \
222
232
  source=source,ticker_type=ticker_type)
@@ -248,6 +258,7 @@ if __name__=='__main__':
248
258
  betas=compare_mticker_1beta(ticker,start,end)
249
259
 
250
260
  def compare_mticker_1beta(ticker,start,end, \
261
+ adjust='', \
251
262
  RF=0,regression_period=365, \
252
263
  graph=True,axhline_value=1,axhline_label='',facecolor='whitesmoke', \
253
264
  annotate=False,annotate_value=False, \
@@ -289,7 +300,7 @@ def compare_mticker_1beta(ticker,start,end, \
289
300
 
290
301
  #关闭print输出
291
302
  with HiddenPrints():
292
- df_tmp=get_capm_beta(t,start,end,RF,regtrddays,mktidx,source,ticker_type=tt)
303
+ df_tmp=get_capm_beta(t,start,end,adjust,RF,regtrddays,mktidx,source,ticker_type=tt)
293
304
 
294
305
  if df_tmp is None:
295
306
  break
@@ -366,6 +377,7 @@ if __name__=='__main__':
366
377
  betas=compare_1ticker_mRF(ticker,start,end,RF)
367
378
 
368
379
  def compare_1ticker_mRF(ticker,start,end, \
380
+ adjust='', \
369
381
  RF=[0,0.02,0.05], \
370
382
  regression_period=365, \
371
383
  graph=True,axhline_value=1,axhline_label='',facecolor='whitesmoke', \
@@ -406,7 +418,7 @@ def compare_1ticker_mRF(ticker,start,end, \
406
418
  for t in RF:
407
419
  #关闭print输出
408
420
  with HiddenPrints():
409
- df_tmp=get_capm_beta(ticker,start,end,t,regtrddays,mktidx,source,ticker_type=ticker_type)
421
+ df_tmp=get_capm_beta(ticker,start,end,adjust,t,regtrddays,mktidx,source,ticker_type=ticker_type)
410
422
 
411
423
  if df_tmp is None:
412
424
  break
@@ -484,6 +496,7 @@ if __name__=='__main__':
484
496
  betas=compare_1ticker_mregression_period(ticker,start,end,RF,regression_period)
485
497
 
486
498
  def compare_1ticker_mregression_period(ticker,start,end, \
499
+ adjust='', \
487
500
  RF=0, \
488
501
  regression_period=[183,365,730], \
489
502
  graph=True,axhline_value=1,axhline_label='',facecolor='whitesmoke', \
@@ -524,7 +537,7 @@ def compare_1ticker_mregression_period(ticker,start,end, \
524
537
 
525
538
  #关闭print输出
526
539
  with HiddenPrints():
527
- df_tmp=get_capm_beta(ticker,start,end,RF,regtrddays,mktidx,source,ticker_type=ticker_type)
540
+ df_tmp=get_capm_beta(ticker,start,end,adjust,RF,regtrddays,mktidx,source,ticker_type=ticker_type)
528
541
 
529
542
  if df_tmp is None:
530
543
  break
@@ -601,7 +614,9 @@ if __name__=='__main__':
601
614
 
602
615
  betas=compare_beta_security(ticker,start,end,RF)
603
616
 
604
- def compare_beta_security(ticker,start,end,RF=0,regression_period=365, \
617
+ def compare_beta_security(ticker,start,end, \
618
+ adjust='', \
619
+ RF=0,regression_period=365, \
605
620
  graph=True,facecolor='whitesmoke', \
606
621
  annotate=False,annotate_value=False, \
607
622
  mark_top=False,mark_bottom=False,mark_end=False, \
@@ -618,8 +633,10 @@ def compare_beta_security(ticker,start,end,RF=0,regression_period=365, \
618
633
  if isinstance(RF,list):
619
634
  RF=RF[0]
620
635
 
621
- df=compare_mticker_1beta(ticker,start,end,RF,regression_period, \
622
- graph,facecolor=facecolor, \
636
+ df=compare_mticker_1beta(ticker,start,end, \
637
+ adjust=adjust, \
638
+ RF=RF,regression_period=regression_period, \
639
+ graph=graph,facecolor=facecolor, \
623
640
  annotate=annotate,annotate_value=annotate, \
624
641
  mark_top=mark_top,mark_bottom=mark_bottom,mark_end=mark_end, \
625
642
  mktidx=mktidx,source=source, \
@@ -632,8 +649,10 @@ def compare_beta_security(ticker,start,end,RF=0,regression_period=365, \
632
649
  #情形2:1只证券,多个RF。时间区间要尽可能短,不然难以看出差异!
633
650
  if isinstance(RF,list):
634
651
  if len(RF) > 1:
635
- df=compare_1ticker_mRF(ticker,start,end,RF,regression_period, \
636
- graph,facecolor=facecolor, \
652
+ df=compare_1ticker_mRF(ticker,start,end, \
653
+ adjust=adjust, \
654
+ RF=RF,regression_period=regression_period, \
655
+ graph=graph,facecolor=facecolor, \
637
656
  annotate=annotate,annotate_value=annotate, \
638
657
  mark_top=mark_top,mark_bottom=mark_bottom,mark_end=mark_end, \
639
658
  mktidx=mktidx,source=source, \
@@ -647,8 +666,9 @@ def compare_beta_security(ticker,start,end,RF=0,regression_period=365, \
647
666
  if isinstance(regression_period,list):
648
667
  if len(regression_period) > 1:
649
668
  df=compare_1ticker_mregression_period(ticker,start,end, \
650
- RF,regression_period, \
651
- graph,facecolor=facecolor, \
669
+ adjust=adjust, \
670
+ RF=RF,regression_period=regression_period, \
671
+ graph=graph,facecolor=facecolor, \
652
672
  annotate=annotate,annotate_value=annotate, \
653
673
  mark_top=mark_top,mark_bottom=mark_bottom,mark_end=mark_end, \
654
674
  mktidx=mktidx,source=source, \
@@ -659,8 +679,10 @@ def compare_beta_security(ticker,start,end,RF=0,regression_period=365, \
659
679
  regression_period=regression_period[0]
660
680
 
661
681
  #情形4:1只证券,1个RF,1个回归天数?
662
- df=compare_mticker_1beta(ticker,start,end,RF,regression_period, \
663
- graph,facecolor=facecolor, \
682
+ df=compare_mticker_1beta(ticker,start,end, \
683
+ adjust=adjust, \
684
+ RF=RF,regression_period=regression_period, \
685
+ graph=graph,facecolor=facecolor, \
664
686
  annotate=annotate,annotate_value=annotate, \
665
687
  mark_top=mark_top,mark_bottom=mark_bottom,mark_end=mark_end, \
666
688
  mktidx=mktidx,source=source, \
siat/fund_china.py CHANGED
@@ -2375,14 +2375,14 @@ def compare_metf_china(fund_list,start,end,ftype='单位净值',graph=True):
2375
2375
 
2376
2376
  #绘图
2377
2377
  y_label=ftype
2378
- import datetime; today = datetime.date.today()
2378
+ import datetime; todaydt = datetime.date.today()
2379
2379
 
2380
2380
  lang=check_language()
2381
2381
  if lang == 'English':
2382
- x_label="Source: eastmoney/tiantian funds, "+str(today)
2382
+ x_label="Source: eastmoney/tiantian funds, "+str(todaydt)
2383
2383
  title_txt="Compare Multiple ETF Fund Performance"
2384
2384
  else:
2385
- x_label="数据来源: 东方财富/天天基金,"+str(today)
2385
+ x_label="数据来源: 东方财富/天天基金,"+str(todaydt)
2386
2386
  title_txt="比较多只ETF基金的净值指标"
2387
2387
 
2388
2388
  draw_lines(fdf,y_label,x_label,axhline_value=0,axhline_label='',title_txt=title_txt, \
@@ -81,11 +81,18 @@ def get_rolling_sharpe_sortino(ticker,start,end,rar_name="sharpe", \
81
81
 
82
82
  start1=date_adjust(start,adjust=-dateahead)
83
83
 
84
+ #判断复权价
85
+ if ('adj' in ret_type_lower):
86
+ adjust='qfq'
87
+ else:
88
+ adjust=''
89
+
84
90
  #抓取股价
85
91
  #pricedf=get_price(ticker,start1,end,source=source)
86
92
  #pricedf=get_price_security(ticker,start1,end,source=source)
87
- pricedf,found=get_price_1ticker_mixed(ticker=ticker,fromdate=start1, \
88
- todate=end,source=source,ticker_type=ticker_type)
93
+ pricedf,found=get_price_1ticker_mixed(ticker=ticker,fromdate=start1,todate=end, \
94
+ adjust=adjust, \
95
+ source=source,ticker_type=ticker_type)
89
96
 
90
97
  if found !='Found':
91
98
  print(" #Error(get_rolling_sharpe_sortino): no records found for",ticker)
@@ -115,6 +122,12 @@ def get_rolling_sharpe_sortino(ticker,start,end,rar_name="sharpe", \
115
122
  #开始日期富余一段时间,有助于绘图时显示出期望的开始日期
116
123
  startpd=pd.to_datetime(date_adjust(start,adjust=-7))
117
124
  endpd=pd.to_datetime(end)
125
+
126
+ rardf4['index_tmp']=rardf4.index
127
+ rardf4['index_tmp']=rardf4['index_tmp'].apply(lambda x: pd.to_datetime(x))
128
+ rardf4.set_index(['index_tmp'],inplace=True)
129
+ #rardf4.drop(['index_tmp'],inplace=True)
130
+
118
131
  rardf5=rardf4[(rardf4.index >=startpd) & (rardf4.index <=endpd)]
119
132
 
120
133
  #确定风险字段名
@@ -169,11 +182,19 @@ def get_expanding_sharpe_sortino(ticker,start,end,rar_name="sharpe", \
169
182
  dateahead=7
170
183
  start1=date_adjust(start,adjust=-dateahead)
171
184
 
185
+ #判断复权价
186
+ ret_type=ret_type.title()
187
+ if ('Adj' in ret_type):
188
+ adjust='qfq'
189
+ else:
190
+ adjust=''
191
+
172
192
  #抓取股价
173
193
  #pricedf=get_price(ticker,start1,end,source=source)
174
194
  #pricedf=get_price_security(ticker,start1,end,source=source)
175
- pricedf,found=get_price_1ticker_mixed(ticker=ticker,fromdate=start1, \
176
- todate=end,source=source,ticker_type=ticker_type)
195
+ pricedf,found=get_price_1ticker_mixed(ticker=ticker,fromdate=start1,todate=end, \
196
+ adjust=adjust, \
197
+ source=source,ticker_type=ticker_type)
177
198
 
178
199
  #计算收益率和收益率标准差
179
200
  rardf2=calc_expanding_return(pricedf,start)
@@ -285,8 +306,17 @@ def get_rolling_treynor_alpha(ticker,start,end,rar_name="alpha", \
285
306
  #计算CAPM需要的日期提前量
286
307
  start2=date_adjust(start1,adjust=-regression_period-7*2)
287
308
 
309
+ #判断复权价
310
+ ret_type=ret_type.title()
311
+ if ('Adj' in ret_type):
312
+ adjust='qfq'
313
+ else:
314
+ adjust=''
315
+
288
316
  #CAPM回归,计算贝塔系数
289
- reg_result,dretdf3=regression_capm(ticker,start2,end,RF=RF, \
317
+ reg_result,dretdf3=regression_capm(ticker,start2,end, \
318
+ adjust=adjust, \
319
+ RF=RF, \
290
320
  regtrddays=regtrddays,mktidx=mktidx, \
291
321
  source=source,ticker_type=ticker_type)
292
322
 
@@ -371,8 +401,17 @@ def get_expanding_treynor_alpha(ticker,start,end,rar_name="alpha", \
371
401
  #计算CAPM需要的日期提前量
372
402
  start2=date_adjust(start1,adjust=-regression_period-7*2)
373
403
 
404
+ #判断复权价
405
+ ret_type=ret_type.title()
406
+ if ('Adj' in ret_type):
407
+ adjust='qfq'
408
+ else:
409
+ adjust=''
410
+
374
411
  #CAPM回归,计算贝塔系数
375
- reg_result,dretdf3=regression_capm(ticker,start2,end,RF=RF, \
412
+ reg_result,dretdf3=regression_capm(ticker,start2,end, \
413
+ adjust=adjust, \
414
+ RF=RF, \
376
415
  regtrddays=regtrddays,mktidx=mktidx, \
377
416
  source=source,ticker_type=ticker_type)
378
417
 
siat/security_price2.py CHANGED
@@ -89,7 +89,7 @@ def get_price_1ticker(ticker,fromdate,todate, \
89
89
  #检查复权选项合理性
90
90
  ak_fq_list=['','qfq','hfq','qfq-factor','hfq-factor']
91
91
  if adjust not in ak_fq_list:
92
- adjust=''
92
+ adjust='qfq'
93
93
 
94
94
  #变换ticker为内部格式(yahoo格式)
95
95
  ticker1=ticker1_cvt2yahoo(ticker)
siat/security_prices.py CHANGED
@@ -766,7 +766,11 @@ def get_price_ak_cn(ticker,fromdate,todate,adjust='',ticker_type='auto'):
766
766
  if ticker_type in ['auto','stock'] and suffix not in ['SW']:
767
767
  try:
768
768
  #仅用于股票的历史行情数据(考虑复权)
769
- df=ak.stock_zh_a_daily(ticker2,start1,end1,adjust=adjust)
769
+ dffqno=ak.stock_zh_a_daily(ticker2,start1,end1,adjust='')
770
+ dffq=ak.stock_zh_a_daily(ticker2,start1,end1,adjust=adjust)
771
+ dffq.rename(columns={'close':'Adj Close'},inplace=True)
772
+
773
+ df=pd.merge(dffqno,dffq[['date','Adj Close']],on=['date'])
770
774
  df['Date']=df['date']
771
775
  except:
772
776
  df=None
@@ -901,7 +905,6 @@ def get_price_ak_cn(ticker,fromdate,todate,adjust='',ticker_type='auto'):
901
905
  #设置新的索引
902
906
  df.set_index(['Date'],inplace=True)
903
907
  df.rename(columns={'open':'Open','high':'High','low':'Low','close':'Close','volume':'Volume'},inplace=True)
904
- df['Adj Close']=df['Close']
905
908
 
906
909
  try:
907
910
  df1=df[df.index >= start]
@@ -956,7 +959,15 @@ def get_price_ak_us(symbol, fromdate, todate, adjust=""):
956
959
  import akshare as ak
957
960
  #print(" Searching info in Sina for",symbol,"... ...")
958
961
  try:
959
- df=ak.stock_us_daily(symbol=symbol, adjust=adjust)
962
+ if adjust=='':
963
+ df=ak.stock_us_daily(symbol=symbol,adjust=adjust)
964
+ else:
965
+ dffqno=ak.stock_us_daily(symbol=symbol,adjust='')
966
+ dffq=ak.stock_us_daily(symbol=symbol,adjust='qfq')
967
+ dffq.rename(columns={'close':'Adj Close'},inplace=True)
968
+
969
+ df=pd.merge(dffqno,dffq[['date','Adj Close']],on=['date'])
970
+
960
971
  except:
961
972
  #print(" #Error(get_price_ak_us): no info found for",symbol)
962
973
  return None
@@ -982,7 +993,8 @@ def get_price_ak_us(symbol, fromdate, todate, adjust=""):
982
993
 
983
994
  df2.rename(columns={'open':'Open','high':'High','low':'Low','close':'Close','volume':'Volume'},inplace=True)
984
995
  df2['ticker']=symbol
985
- df2['Adj Close']=df2['Close']
996
+ if 'Adj Close' not in list(df2):
997
+ df2['Adj Close']=df2['Close']
986
998
  df2['source']='新浪'
987
999
  df2['footnote']=adjust
988
1000
 
@@ -1000,14 +1012,21 @@ if __name__=='__main__':
1000
1012
  if __name__=='__main__':
1001
1013
  symbol='0700.HK'
1002
1014
  symbol='0700.hk'
1015
+
1003
1016
  symbol='00700.HK'
1004
- fromdate='2020-12-1'
1005
- todate='2021-1-31'
1017
+ fromdate='2014-5-1'
1018
+ todate ='2014-5-31'
1019
+ adjust="qfq"
1020
+
1021
+ tx=get_price_ak_hk(symbol='00700.HK',fromdate='2014-5-1',todate='2014-5-30',adjust="qfq")
1006
1022
 
1007
- def get_price_ak_hk(symbol, fromdate, todate, adjust=""):
1023
+ def get_price_ak_hk(symbol,fromdate,todate,adjust=""):
1008
1024
  """
1009
1025
  抓取单个港股股价,不能处理股指,股指无.HK后缀
1010
1026
  """
1027
+ DEBUG=False
1028
+ if DEBUG:
1029
+ print("Start searching HK stock prices for",symbol,"...")
1011
1030
 
1012
1031
  #检查日期期间
1013
1032
  result,start,end=check_period(fromdate,todate)
@@ -1027,19 +1046,20 @@ def get_price_ak_hk(symbol, fromdate, todate, adjust=""):
1027
1046
  symbol3=symbol2
1028
1047
 
1029
1048
  try:
1030
- df=ak.stock_hk_daily(symbol=symbol3, adjust="")
1049
+ if adjust == '':
1050
+ df=ak.stock_hk_daily(symbol=symbol3, adjust=adjust)
1051
+ else:
1052
+ dffqno=ak.stock_hk_daily(symbol=symbol3, adjust='')
1053
+ dffq =ak.stock_hk_daily(symbol=symbol3,adjust='qfq')
1054
+ dffq.rename(columns={'close':'Adj Close'},inplace=True)
1055
+
1056
+ df=pd.merge(dffqno,dffq[['date','Adj Close']],on=['date'])
1031
1057
  except:
1032
1058
  print(" #Error(get_price_ak_hk): no info found for",symbol)
1033
1059
  return None
1034
1060
 
1035
- df['Date']=df.index
1036
- #去掉可能出现的时区信息,必须使用datetime中的tz_localize
1037
- import datetime as dt
1038
- try:
1039
- df['Date']=df['Date'].dt.tz_localize(None)
1040
- except:
1041
- import pandas as pd
1042
- df['Date']=pd.to_datetime(df['date'])
1061
+ #去掉可能出现的时区信息
1062
+ df['Date']=pd.to_datetime(df['date'])
1043
1063
  #设置新的索引
1044
1064
  df.set_index(['Date'],inplace=True)
1045
1065
 
@@ -1056,7 +1076,8 @@ def get_price_ak_hk(symbol, fromdate, todate, adjust=""):
1056
1076
 
1057
1077
  df2.rename(columns={'open':'Open','high':'High','low':'Low','close':'Close','volume':'Volume'},inplace=True)
1058
1078
  df2['ticker']=symbol
1059
- df2['Adj Close']=df2['Close']
1079
+ if 'Adj Close' not in list(df2):
1080
+ df2['Adj Close']=df2['Close']
1060
1081
  df2['source']='新浪'
1061
1082
 
1062
1083
  ptname=ticker_name(symbol,'stock')