siat 3.5.1__py3-none-any.whl → 3.5.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/common.py CHANGED
@@ -4236,7 +4236,126 @@ def list_intersection(lists=[],numberPerLine=5,printout=True,return_result=False
4236
4236
  else: return
4237
4237
 
4238
4238
  #==============================================================================
4239
+ if __name__ == '__main__':
4240
+ hpr=3.17
4241
+ years=20
4242
+
4243
+ annual_return1(hpr,years)
4244
+
4245
+ def annual_return1(hpr,years):
4246
+ """
4247
+ 功能:计算年均复合增长率,1个
4248
+ """
4249
+ #text1="Holding period return for "+str(years)+" years: "+str(hpr*100)+'%'
4250
+ text1=str(years)+"年的持有期收益率:"+str(round(hpr*100,3))+'%'
4251
+ print(text1,end=',')
4252
+
4253
+ #text2="Annualized compound return:"
4254
+ text2="年均复合收益率:"+str(round((pow(1+hpr,1/years)-1)*100,3))+'%'
4255
+ print(text2)
4256
+
4257
+ return
4258
+
4259
+ if __name__ == '__main__':
4260
+ hpr=3.17
4261
+ hpr=[3.17,2.5]
4262
+ years=20
4263
+
4264
+ annual_return(hpr,years)
4265
+
4266
+ def annual_return(hpr,years):
4267
+ """
4268
+ 功能:hpr可为多个
4269
+ """
4270
+ if isinstance(hpr,float) or isinstance(hpr,int):
4271
+ hpr=[hpr]
4272
+
4273
+ for h in hpr:
4274
+ annual_return1(h,years)
4275
+
4276
+ return
4277
+
4278
+ if __name__ == '__main__':
4279
+ df=security_trend(['801811.SW','801813.SW'],
4280
+ indicator='Exp Adj Ret%',
4281
+ start='L5Y',
4282
+ annotate=True,annotate_value=True)
4283
+
4284
+ df_annual_return(df)
4285
+
4286
+ def df_annual_return(df):
4287
+ """
4288
+ 功能:计算df1中每列的年复合收益率
4289
+ """
4290
+
4291
+ #计算年数
4292
+ date1=df.index[0]
4293
+ date2=df.index[-1]
4294
+ delta=date2-date1
4295
+ years=round(delta.days/365,2)
4296
+ months=int(delta.days/30)
4297
+
4298
+ #计算每列的年均复合增长率
4299
+ collist=list(df)
4300
+ for c in collist:
4301
+ hpr=df[c][-1]
4302
+ hpr1=hpr/100
4303
+ annual_rate=str(round((pow(1+hpr1,1/years)-1)*100,3))+'%'
4304
+
4305
+ if years >=1:
4306
+ text=c+": "+str(years)+"年持有期收益率"+str(round(hpr,3))+'%,年均复合收益率'+annual_rate
4307
+ else:
4308
+ text=c+": "+str(months)+"个月持有期收益率"+str(round(hpr,3))+'%,年均复合收益率'+annual_rate
4309
+ print(text)
4310
+
4311
+ return
4312
+
4239
4313
  #==============================================================================
4314
+
4315
+
4316
+ if __name__ == '__main__':
4317
+ df=security_trend("600519.SS",graph=False)
4318
+ option="save"
4319
+
4320
+ df_save(df,file="moutai")
4321
+ mt=df_restore(file="moutai")
4322
+
4323
+ def df_save(df,file="df"):
4324
+ """
4325
+ 功能:保存df数据,适用于那些需要大量时间获取的df,以便使用时可以恢复
4326
+ """
4327
+
4328
+ if ".pkl" in file:
4329
+ file_name=file
4330
+ else:
4331
+ file_name=file+'.pkl'
4332
+
4333
+ df.to_pickle(file_name)
4334
+ print(" Data is saved in",file_name)
4335
+
4336
+ return
4337
+
4338
+ def df_restore(file):
4339
+ """
4340
+ 功能:从文件保存df数据,适用于那些需要大量时间获取的df
4341
+ """
4342
+
4343
+ import pandas as pd
4344
+
4345
+ if ".pkl" in file:
4346
+ file_name=file
4347
+ else:
4348
+ file_name=file+'.pkl'
4349
+
4350
+ try:
4351
+ df=pd.read_pickle(file_name)
4352
+ print(" Data is restored from",file_name)
4353
+ except:
4354
+ print(" #Warning(df_dump): file not found for",file_name)
4355
+ df=None
4356
+ return df
4357
+
4358
+
4240
4359
  #==============================================================================
4241
4360
  #==============================================================================
4242
4361
  #==============================================================================
siat/fund_china.py CHANGED
@@ -762,7 +762,7 @@ def get_oef_rank_china():
762
762
  df3['基金类型']=df3['基金类型'].astype(str)
763
763
  df3['净值日期']=nvdate
764
764
 
765
- print("Successfully retrieved",len(df3),"Chinese OEF products disclosing performance on",nvdate)
765
+ print("Successfully retrieved",len(df3),"OEF products on",nvdate)
766
766
 
767
767
  return df3
768
768
 
@@ -864,7 +864,10 @@ def oef_rank_china2(df,fund_type='全部类型',rank=5,indicator='单位净值')
864
864
  titletxt="中国开放式基金排名:累计净值"
865
865
 
866
866
  if indicator == '手续费':
867
- df.sort_values(by=['手续费'],ascending=False,inplace=True)
867
+ try:
868
+ df['手续费'] = df['手续费'].astype(str)
869
+ df.sort_values(by=['手续费'],ascending=False,inplace=True)
870
+ except: pass
868
871
  #dfprint=df[['基金简称','基金代码','基金类型','手续费','申购状态','赎回状态']]
869
872
  dfprint=df[['基金简称','基金代码','基金类型','手续费','单位净值']]
870
873
  #print(texttranslate("\n===== 中国开放式基金排名:手续费 ====="))
siat/security_trend2.py CHANGED
@@ -500,7 +500,7 @@ def security_trend(ticker,indicator='Close',adjust='', \
500
500
  return df
501
501
 
502
502
 
503
- # 情形8:估值指标PE/PB/MV/ROE,仅针对股票,无需ticker_type====================
503
+ # 情形8:估值指标PE/PB/MV/ROE,仅针对股票/行业指数代码,无需ticker_type========
504
504
  if indicator_group3:
505
505
  df=security_valuation(tickers=tickers,indicators=measures,start=fromdate,end=todate, \
506
506
  preprocess=preprocess,scaling_option=scaling_option, \
siat/stock.py CHANGED
@@ -1588,7 +1588,11 @@ def compare_security(tickers,measures,fromdate,todate, \
1588
1588
  source=source, \
1589
1589
  ticker_type=ticker_type, \
1590
1590
  graph=False)
1591
- pltdf1= df1tmp[[measure1]]
1591
+ if df_have_data(df1tmp)=="Found":
1592
+ pltdf1= df1tmp[[measure1]]
1593
+ else:
1594
+ print(" #Error(compare_security):no info found for",ticker1,"on",measure1)
1595
+ return None,None
1592
1596
 
1593
1597
  print(" Searching",ticker1,"for",measure2,"info ... ...")
1594
1598
  #复权价判断2
@@ -1604,7 +1608,11 @@ def compare_security(tickers,measures,fromdate,todate, \
1604
1608
  ticker_type=ticker_type, \
1605
1609
  graph=False)
1606
1610
 
1607
- pltdf2= df2tmp[[measure2]]
1611
+ if df_have_data(df2tmp)=="Found":
1612
+ pltdf2= df2tmp[[measure2]]
1613
+ else:
1614
+ print(" #Error(compare_security):no info found for",ticker1,"on",measure2)
1615
+ return None,None
1608
1616
 
1609
1617
  pltdf=pd.merge(pltdf1,pltdf2,left_index=True,right_index=True)
1610
1618
  pltdf['ticker']=ticker1
@@ -1635,14 +1643,22 @@ def compare_security(tickers,measures,fromdate,todate, \
1635
1643
  source=source, \
1636
1644
  ticker_type=ticker_type, \
1637
1645
  graph=False)
1638
- pltdf1=df1tmp[['ticker',measure1]]
1646
+ if df_have_data(df1tmp)=="Found":
1647
+ pltdf1=df1tmp[['ticker',measure1]]
1648
+ else:
1649
+ print(" #Error(compare_security):no info found for",ticker1,"on",measure1)
1650
+ return None,None
1639
1651
 
1640
1652
  df2tmp=security_indicator(ticker=ticker2,indicator=measure1,adjust=adjust, \
1641
1653
  fromdate=fromdate,todate=todate, \
1642
1654
  source=source, \
1643
1655
  ticker_type=ticker_type, \
1644
1656
  graph=False)
1645
- pltdf2=df2tmp[['ticker',measure1]]
1657
+ if df_have_data(df2tmp)=="Found":
1658
+ pltdf2=df2tmp[['ticker',measure1]]
1659
+ else:
1660
+ print(" #Error(compare_security):no info found for",ticker2,"on",measure1)
1661
+ return None,None
1646
1662
 
1647
1663
  #绘制双证券单指标对比图
1648
1664
  if graph:
siat/valuation.py CHANGED
@@ -718,11 +718,13 @@ if __name__=='__main__':
718
718
  tickers='光伏设备(申万)'
719
719
  tickers='中证500'
720
720
  tickers='801735.SW'
721
+ tickers='801853.SW'
721
722
 
722
723
  tickers=['PZU.PL','WIG.PL']
723
724
  tickers=['PZU.PL','JD','600519.SS','00700.HK','801735.SW','光伏设备(申万)','中证500']
724
725
 
725
726
  indicators='PE'
727
+ indicators='PB'
726
728
  indicators=['pe','pb']
727
729
  indicators=['pe','pb','mv']
728
730
  indicators='ROE'
@@ -802,8 +804,20 @@ def get_valuation(tickers,indicators,start,end):
802
804
  dft=get_stock_valuation_pl(t1,indicators1,start,end)
803
805
  if dft is not None: gotit=True
804
806
 
805
- # 申万指数代码?可能没有机会走到这里!
806
- if not gotit and (result and suffix in ['SW']) and not ROE_flag:
807
+ # 行业指数代码?
808
+ suffix_list=['SW','SI',#申万行业
809
+ 'GI',#谷歌
810
+ 'CSI',#中证
811
+ 'CNI',#国证
812
+ 'SH','SZ','BJ',#沪深京交易所
813
+ 'WI',#万得
814
+ 'HI',#恒生
815
+ 'SPI',#标普
816
+ 'MI',#MSCI
817
+ 'BO',#孟买
818
+ ]
819
+ if not gotit and (result and suffix in suffix_list) and not ROE_flag:
820
+
807
821
  #dft=get_index_valuation_funddb(t1,indicators1,start,end)
808
822
  indicator1=indicators1[0]
809
823
  dft0=industry_valuation_history_sw(industry=t1,
@@ -981,7 +995,7 @@ def security_valuation(tickers,indicators,start,end, \
981
995
  footnote1="注:市值金额:十亿,当地货币单位\n"
982
996
 
983
997
  todaydt = datetime.date.today()
984
- footnote9="数据来源: 综合baidu/stooq/funddb/swhysc,"+str(todaydt)
998
+ footnote9="数据来源: Baidu/Stooq/FundDB/SWHY,"+str(todaydt)
985
999
  footnote=footnote1+footnote9
986
1000
 
987
1001
  draw_lines(df2,y_label=ylabeltxt,x_label=footnote, \
@@ -1009,7 +1023,7 @@ def security_valuation(tickers,indicators,start,end, \
1009
1023
  footnote1="注:市值金额:十亿,当地货币单位\n"
1010
1024
 
1011
1025
  todaydt = datetime.date.today()
1012
- footnote9="数据来源: 综合baidu/stooq/funddb/swhysc,"+str(todaydt)
1026
+ footnote9="数据来源: Baidu/Stooq/FundDB/SWHY,"+str(todaydt)
1013
1027
  footnote=footnote1+footnote9
1014
1028
 
1015
1029
  df2_1.rename(columns={i1:ectranslate(i1)},inplace=True)
@@ -1043,7 +1057,7 @@ def security_valuation(tickers,indicators,start,end, \
1043
1057
  footnote1="注:市值金额:十亿,当地货币单位\n"
1044
1058
 
1045
1059
  todaydt = datetime.date.today()
1046
- footnote9="数据来源: 综合baidu/stooq/funddb/swhysc,"+str(todaydt)
1060
+ footnote9="数据来源: Baidu/Stooq/FundDB/SWHY,"+str(todaydt)
1047
1061
  footnote=footnote1+footnote9
1048
1062
 
1049
1063
  colname1=i; label1=t1
@@ -1078,7 +1092,7 @@ def security_valuation(tickers,indicators,start,end, \
1078
1092
  footnote1="注:市值金额:十亿,当地货币单位\n"
1079
1093
 
1080
1094
  todaydt = datetime.date.today()
1081
- footnote9="数据来源: 综合baidu/stooq/funddb/swhysc,"+str(todaydt)
1095
+ footnote9="数据来源: Baidu/Stooq/FundDB/SWHY,"+str(todaydt)
1082
1096
  footnote=footnote1+footnote9
1083
1097
 
1084
1098
  #ylabeltxt=i
@@ -1123,7 +1137,7 @@ def security_valuation(tickers,indicators,start,end, \
1123
1137
  footnote1="注:市值金额:十亿,当地货币单位\n"
1124
1138
 
1125
1139
  todaydt = datetime.date.today()
1126
- footnote9="数据来源: 综合baidu/stooq/funddb/swhysc,"+str(todaydt)
1140
+ footnote9="数据来源: Baidu/Stooq/FundDB/SWHY,"+str(todaydt)
1127
1141
  footnote=footnote1+footnote9
1128
1142
 
1129
1143
  #ylabeltxt=''
siat/valuation_china.py CHANGED
@@ -432,10 +432,11 @@ if __name__=='__main__':
432
432
  #==============================================================================
433
433
  if __name__=='__main__':
434
434
  industry='食品饮料'
435
-
436
435
  industry='生猪养殖'
437
-
438
436
  industry='国防军工'
437
+
438
+ industry='801853.SW'
439
+
439
440
  start='2021-1-1'
440
441
  end='2022-11-15'
441
442
  vtype='PE'
@@ -443,12 +444,18 @@ if __name__=='__main__':
443
444
  graph=True
444
445
  loc='best'
445
446
 
447
+ df=industry_valuation_history_sw_daily(industry,start,end,vtype)
448
+
446
449
  def industry_valuation_history_sw_daily(industry,start,end,vtype='PE', \
447
- graph=True,loc='best'):
450
+ graph=True,loc='best', \
451
+ error_message=True):
448
452
  """
449
453
  功能:绘制一个申万行业的日历史估值趋势,不支持二级三级行业分类
450
454
  vtype: PE, PB, dividend
451
455
 
456
+ *** 注意:必须安装插件ipywidgets
457
+ 如果出现下列错误信息:Error displaying widget: model not found
458
+ 先卸载再重新安装插件ipywidgets
452
459
  """
453
460
  #检查日期期间
454
461
  result,start1,end1=check_period(start,end)
@@ -469,14 +476,35 @@ def industry_valuation_history_sw_daily(industry,start,end,vtype='PE', \
469
476
  pos=vtypelist.index(vtypeu)
470
477
  vtypes=typelist[pos]
471
478
 
479
+ # 适配industry名称/代码
480
+ industry_split=industry.split('.')
481
+ split1=industry.split('.')[0]
482
+ split1_name=industry_sw_code(split1)
483
+
484
+ #industry情形1:无后缀,名称
485
+ if len(industry_split)==1 and not split1.isdigit():
486
+
487
+ if not split1_name is None: #是申万名称
488
+ sindustry=industry+'(申万)'
489
+ else: #不是申万名称
490
+ sindustry=industry
491
+ #industry情形2:数字
492
+ else:
493
+ if not split1_name is None: #是申万代码
494
+ sindustry=industry_sw_name(split1)+'(申万)'
495
+ else: #不是申万代码
496
+ index_val=ak.index_value_name_funddb()
497
+ sindustry=index_val[index_val['指数代码']==industry]['指数名称'].values[0]
498
+
472
499
  # 获取行业估值历史数据
473
500
  import akshare as ak
474
- sindustry=industry+'(申万)'
475
501
  try:
476
- # 不支持申万三级行业
502
+ # symbol:指数名称,申万行业名称需要加后缀(申万),仅支持申万一级行业和部分二级行业,不支持申万三级行业
503
+ # 支持的指数查看:ak.index_value_name_funddb()
477
504
  df = ak.index_value_hist_funddb(symbol=sindustry, indicator=vtypes)
478
505
  except:
479
- print(" #Warning(industry_valuation_history_sw_daily): failed to fetch industry info for",industry)
506
+ if error_message:
507
+ print(" #Warning(industry_valuation_history_sw_daily): failed to access index",sindustry)
480
508
  return None
481
509
 
482
510
  import pandas as pd
@@ -632,6 +660,7 @@ def industry_valuation_history_sw_weekly(industry,start,end,vtype='PE', \
632
660
 
633
661
  industry1=industry.split('.')[0]
634
662
  industry_name_flag=industry_code_flag=False
663
+ type_name=''
635
664
  try:
636
665
  type_name=sw_codes[sw_codes['name']==industry1]['type_name'].values[0]
637
666
  industry_name_flag=True
@@ -640,19 +669,20 @@ def industry_valuation_history_sw_weekly(industry,start,end,vtype='PE', \
640
669
  type_name=sw_codes[sw_codes['code']==industry1]['type_name'].values[0]
641
670
  industry_code_flag=True
642
671
  except:
643
- print(" #Error(industry_valuation_history_sw_weekly): Shenwan industry not found for",industry)
644
- return None
672
+ print(" #Warning(industry_valuation_history_sw_weekly): not a Shenwan index for",industry)
673
+ #return None
645
674
 
646
675
  if type_name=='三级行业':
647
- print(" #Error(industry_valuation_history_sw_weekly): currently does not support Shenwan 3rd_level industry",industry)
676
+ print(" #Warning(industry_valuation_history_sw_weekly): currently does not support Shenwan 3rd_level industry",industry)
648
677
  return None
649
678
 
650
- if not (type_name=='二级行业'):
679
+ if not (type_name in ['二级行业','风格指数']):
651
680
  df=industry_valuation_history_sw_daily(industry=industry,start=start,end=end,vtype=vtype, \
652
- graph=graph,loc=loc)
653
- return df
681
+ graph=graph,loc=loc,error_message=False)
682
+ if not (df is None):
683
+ return df
654
684
 
655
- # 获取行业估值历史周数据
685
+ # 获取行业估值历史周数据:啰嗦方法,需要反复下载,容易出ipywidgets引起的错误,需要安装之或卸载后重新安装
656
686
  import pandas as pd
657
687
  import akshare as ak
658
688
  df=None
@@ -717,6 +747,9 @@ def industry_valuation_history_sw_weekly(industry,start,end,vtype='PE', \
717
747
  if __name__=='__main__':
718
748
  industry='食品饮料'
719
749
  industry='白酒Ⅱ'
750
+ industry='绩优股指数'
751
+ industry='801853.SW'
752
+
720
753
  start='2023-10-1'
721
754
  end='2023-12-15'
722
755
  vtype='PE'
@@ -765,11 +798,12 @@ def industry_valuation_history_sw(industry,start,end,vtype='PE', \
765
798
  industry_name_flag=industry_code_flag=False
766
799
  try:
767
800
  type_name=sw_codes[sw_codes['name']==industry1]['type_name'].values[0]
768
- industry_name_flag=True
801
+ industry_name_flag=True; industry_name=industry1
769
802
  except:
770
803
  try:
771
804
  type_name=sw_codes[sw_codes['code']==industry1]['type_name'].values[0]
772
805
  industry_code_flag=True
806
+ industry_name=sw_codes[sw_codes['code']==industry1]['name'].values[0]
773
807
  except:
774
808
  print(" #Error(industry_valuation_history_sw): Shenwan industry not found for",industry)
775
809
  return None
@@ -778,12 +812,14 @@ def industry_valuation_history_sw(industry,start,end,vtype='PE', \
778
812
  print(" #Error(industry_valuation_history_sw): currently does not support Shenwan 3rd_level industry",industry)
779
813
  return None
780
814
 
781
- if not (type_name=='二级行业'):
815
+ #if not (type_name=='二级行业'):
816
+ if not (type_name in ['二级行业','风格指数']):
782
817
  df=industry_valuation_history_sw_daily(industry=industry,start=start,end=end,vtype=vtype, \
783
818
  graph=graph,loc=loc)
784
- return df
819
+ if not (df is None):
820
+ return df
785
821
 
786
- # 获取行业估值历史周数据
822
+ # 获取行业估值历史周数据:笨方法,反复下载。易出ipywidgets引起的错误,可卸载后重装
787
823
  import pandas as pd
788
824
  import akshare as ak
789
825
  start2=start1.strftime('%Y-%m-%d')
@@ -852,7 +888,7 @@ def industry_valuation_history_sw(industry,start,end,vtype='PE', \
852
888
  df2['平均值']=df2[vtypes].mean()
853
889
  df2['中位数']=df2[vtypes].median()
854
890
 
855
- titletxt="行业估值趋势:"+industry+','+vtypes
891
+ titletxt="行业估值趋势:"+industry_name+','+vtypes
856
892
 
857
893
  footnote0="注:申万行业分类指数,"
858
894
  footnote1=''
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: siat
3
- Version: 3.5.1
3
+ Version: 3.5.2
4
4
  Summary: Securities Investment Analysis Tools (siat)
5
5
  Home-page: https://pypi.org/project/siat/
6
6
  Author: Prof. WANG Dehong, International Business School, Beijing Foreign Studies University
@@ -18,7 +18,7 @@ siat/capm_beta.py,sha256=cxXdRVBQBllhbfz1LeTJAIWvyRYhW54nhtNUXv4HwS0,29063
18
18
  siat/capm_beta2.py,sha256=lUuCPVSxebkA2yye1PXu1V2Jd2UKEwD_kIA25DCIDTs,29750
19
19
  siat/capm_beta_test.py,sha256=ImR0c5mc4hIl714XmHztdl7qg8v1E2lycKyiqnFj6qs,1745
20
20
  siat/cmat_commons.py,sha256=Nj9Kf0alywaztVoMVeVVL_EZk5jRERJy8R8kBw88_Tg,38116
21
- siat/common.py,sha256=4cQOWSaKFqiGgMVoub559lZcRRoNtz9r_gAPZ8x8pX8,155546
21
+ siat/common.py,sha256=rWOQWvkkmLiOwj5XAagLLP-ii7VJNKYPSK5rimCUTfo,158534
22
22
  siat/compare_cross.py,sha256=3iP9TH2h3w27F2ARZc7FjKcErYCzWRc-TPiymOyoVtw,24171
23
23
  siat/compare_cross_test.py,sha256=xra5XYmQGEtfIZL2h-GssdH2hLdFIhG3eoCrkDrL3gY,3473
24
24
  siat/concepts_iwencai.py,sha256=m1YEDtECRT6FqtzlKm91pt2I9d3Z_XoP59BtWdRdu8I,3061
@@ -53,7 +53,7 @@ siat/financials_test.py,sha256=HJ3CPo_Xckz2wXi3AEP6ZNWCF1Duc1pLi0Y10USiImc,23829
53
53
  siat/fred_test.py,sha256=KF50ssSbsfpa_kT6iuomD0vG4eXztAcOasZxg1OGX5w,1201
54
54
  siat/fund.py,sha256=wMDORsCBV8ZXfgwbtq-0bu3qqWY66dHnbqgllW0gWCo,24637
55
55
  siat/fund_china.pickle,sha256=x_nPPdwy7wzIhtZQOplgDyTSyyUdXy9lbNxWysq7N6k,2437771
56
- siat/fund_china.py,sha256=rPGnYSPkbZUqtBoJnxLZLIQ8MjD8vD3TovCMfletBP4,111839
56
+ siat/fund_china.py,sha256=ocqQnDHdnQWnRmSQ0KTBC5FoBwKtualKZprtdMlPe_A,111907
57
57
  siat/fund_china_test.py,sha256=-Bh6m0J0GPpIbYXx-H2vpzJoNFI6pE2C2jVPa8DazgE,6649
58
58
  siat/fund_test.py,sha256=V4ADb8Gsp8gyeFTwcgRsJBpnUih_O-Q2V1ILc5oKjK8,1116
59
59
  siat/future_china.py,sha256=F-HsIf2Op8Z22RzTjet1g8COzldgnMjFNSXsAkeGyWo,17595
@@ -102,10 +102,10 @@ siat/security_prices.py,sha256=M8Qflbd6cgIJAnXBn3Ifn2z8A0SWzw6Ns_VHn74v1O8,10803
102
102
  siat/security_prices_test.py,sha256=OEphoJ87NPKoNow1QA8EU_5MUYrJF-qKoWKNapVfZNI,10779
103
103
  siat/security_trend.py,sha256=o0vpWdrJkmODCP94X-Bvn-w7efHhj9HpUYBHtLl55D0,17240
104
104
  siat/security_trend2-20240620.py,sha256=QVnEcb7AyVbO77jVqfFsJffGXrX8pgJ9xCfoAKmWBPk,24854
105
- siat/security_trend2.py,sha256=1k8DWeEWecBG_RVz6Bvl5-YOxHsJvuFPg0B-uZFR4BM,26329
105
+ siat/security_trend2.py,sha256=JHrO5zDBYMLbpvotdaqaUcFrxm2di60kMVOdeom8t8A,26336
106
106
  siat/setup.py,sha256=up65rQGLmTBkhtaMLowjoQXYmIsnycnm4g1SYmeQS6o,1335
107
107
  siat/shenwan index history test.py,sha256=JCVAzOSEldHalhSFa3pqD8JI_8_djPMQOxpkuYU-Esg,1418
108
- siat/stock.py,sha256=rcL64oBPWPoPsLHsZUtHWyoe5FXBdT7VFgdB6ZoIbvY,154184
108
+ siat/stock.py,sha256=8zOIiPDlzLCqHqvyLOLzmaAt6B1QOSW24r7giRc2jKc,154911
109
109
  siat/stock_advice_linear.py,sha256=-twT7IGP-NEplkL1WPSACcNJjggRB2j4mlAQCkzOAuo,31655
110
110
  siat/stock_base.py,sha256=uISvbRyOGy8p9QREA96CVydgflBkn5L3OXOGKl8oanc,1312
111
111
  siat/stock_china.py,sha256=zyUyghIrkkkYWlHRRP7Hoblxzfp-jrck60pTJpwMahg,91553
@@ -135,13 +135,13 @@ siat/translate.py,sha256=12-Qx2sqwANobFsh2k5qyE_idjHs0j2g5cTlh9by7co,240806
135
135
  siat/translate_20240606.py,sha256=63IyHWEU3Uz9mjwyuAX3fqY4nUMdwh0ICQAgmgPXP7Y,215121
136
136
  siat/translate_241003_keep.py,sha256=un7Fqe1v35MXsja5exZgjmLzrZtt66NARZIGlyFuGGU,218747
137
137
  siat/universal_test.py,sha256=CDAOffW1Rvs-TcNN5giWVvHMlch1w4dp-w5SIV9jXL0,3936
138
- siat/valuation.py,sha256=NKfeZMdDJOW42oLVHob6eSVBXUqlN1OCnnzwyGAst8c,48855
139
- siat/valuation_china.py,sha256=EkZQaVkoBjM0c4MCNbaX-bMnlG0e3FXeaWczZDnkptU,67784
138
+ siat/valuation.py,sha256=WCqL5zYkZ_Y3MLeoWXTu3G1CknwGdYzhpszbT6cEoYk,49255
139
+ siat/valuation_china.py,sha256=CVp1IwIsF3Om0J29RGkyxZLt4n9Ug-ua_RKhLwL9fUQ,69624
140
140
  siat/valuation_market_china_test.py,sha256=gbJ0ioauuo4koTPH6WKUkqcXiQPafnbhU5eKJ6lpdLA,1571
141
141
  siat/var_model_validation.py,sha256=R0caWnuZarrRg9939hxh3vJIIpIyPfvelYmzFNZtPbo,14910
142
142
  siat/yf_name.py,sha256=9U_XfEeMlS3TrCrO3Bww21nuFgghbnO-cqDJMhQWqew,16193
143
- siat-3.5.1.dist-info/LICENSE,sha256=NTEMMROY9_4U1szoKC3N2BLHcDd_o5uTgqdVH8tbApw,1071
144
- siat-3.5.1.dist-info/METADATA,sha256=g069GGhSmTRj8wW-XpeH9Tqq22oCF3DwLD--R2DGDys,8009
145
- siat-3.5.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
146
- siat-3.5.1.dist-info/top_level.txt,sha256=r1cVyL7AIKqeAmEJjNR8FMT20OmEzufDstC2gv3NvEY,5
147
- siat-3.5.1.dist-info/RECORD,,
143
+ siat-3.5.2.dist-info/LICENSE,sha256=NTEMMROY9_4U1szoKC3N2BLHcDd_o5uTgqdVH8tbApw,1071
144
+ siat-3.5.2.dist-info/METADATA,sha256=aR703O3uk2D33oAxA_vW9ozjcvFBQG2LrUBIbJK2EUA,8009
145
+ siat-3.5.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
146
+ siat-3.5.2.dist-info/top_level.txt,sha256=r1cVyL7AIKqeAmEJjNR8FMT20OmEzufDstC2gv3NvEY,5
147
+ siat-3.5.2.dist-info/RECORD,,
File without changes
File without changes