siat 3.5.2__py3-none-any.whl → 3.5.9__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/bond.py CHANGED
@@ -2705,5 +2705,133 @@ def bond_malkiel(coupon_rate,maturity_years,ytm,coupon_times=2,par_value=100, \
2705
2705
 
2706
2706
 
2707
2707
  #==============================================================================
2708
+ if __name__ =="__main__":
2709
+ start="MRY"; end="today"
2710
+ term="1Y"
2711
+ term=["1Y","5Y","10Y"]
2712
+
2713
+ power=1
2714
+ average_value=True
2715
+ loc1="best"; loc2="best"
2716
+ mark_top=False; mark_bottom=False; mark_end=False
2717
+ twinx=False
2718
+
2719
+ annotate=True; annotate_value=True
2720
+ facecolor="papayawhip"
2721
+
2722
+ rates=treasury_yield_trend_china(term="1Y")
2723
+ rates=treasury_yield_trend_china(term=["1Y","5Y","10Y"])
2724
+
2725
+ def treasury_trend_china(term="1Y",start="MRY",end="today", \
2726
+ power=0, \
2727
+ average_value=False, \
2728
+ mark_top=False,mark_bottom=False,mark_end=False, \
2729
+ annotate=True,annotate_value=True, \
2730
+ twinx=False, \
2731
+ loc1="best",loc2="best", \
2732
+ facecolor="papayawhip"):
2733
+ """
2734
+
2735
+ 功能:分析中国国债收益率走势,支持单个期限或多个期限进行对比
2736
+ """
2737
+ #检查国债期限
2738
+ term_list=['3M','6M','1Y','3Y','5Y','7Y','10Y','30Y']
2739
+ term_list_names=['3个月','6个月','1年期','3年期','5年期','7年期','10年期','30年期']
2740
+
2741
+ start1,end1=start_end_preprocess(start,end)
2742
+ #期间不能超过一年
2743
+ import pandas as pd
2744
+ date1=pd.to_datetime(start1)
2745
+ date2=pd.to_datetime(end1)
2746
+ days=days_between_dates(date1, date2)
2747
+ if days>=365:
2748
+ days=365
2749
+ start1=date_adjust(end1, adjust=-days)
2750
+
2751
+ if isinstance(term,str):
2752
+ if not term in term_list:
2753
+ print(" #Warning(treasury_trend_china): unsupported treasury term",term)
2754
+ print(" Supported terms:", end='')
2755
+ print_list(term_list,leading_blanks=1,end='\n')
2756
+ return None
2757
+ termlist=[term]
2758
+ elif isinstance(term,list):
2759
+ for t in term:
2760
+ if not t in term_list:
2761
+ print(" #Warning(treasury_trend_china): unsupported treasury term",t)
2762
+ term.remove(t)
2763
+ termlist=term
2764
+ else:
2765
+ print(" #Warning(treasury_trend_china):",term," is unsupported")
2766
+ print(" Supported terms:", end='')
2767
+ print_list(term_list,leading_blanks=1,end='\n')
2768
+ return None
2769
+
2770
+ print(" Searching treasury information in China ...")
2771
+ df=pd.DataFrame()
2772
+ for t in termlist:
2773
+ if len(termlist) > 1:
2774
+ print_progress_percent2(t,termlist,steps=len(termlist),leading_blanks=4)
2775
+
2776
+ dftmp=treasury_yields_china(start1,end1,term=t)
2777
+ dftmp[t]=dftmp['rate']*100 #转换为百分数
2778
+ dftmp1=pd.DataFrame(dftmp[t])
2779
+
2780
+ if len(df)==0:
2781
+ df=dftmp1
2782
+ else:
2783
+ df=pd.merge(df,dftmp1,left_index=True,right_index=True)
2784
+
2785
+ #绘图
2786
+ titletxt=text_lang("中国国债收益率走势","China Treasury Yield Trend")
2787
+ ylabeltxt=text_lang('收益率%',"Yield%")
2788
+ import datetime; todaydt = datetime.date.today()
2789
+ footnote=text_lang("数据来源:中国债券信息网,","Data source: China Bond Info, ")+str(todaydt)
2790
+
2791
+ if len(termlist)==1: #单曲线
2792
+ pos=term_list.index(termlist[0])
2793
+ termname=term_list_names[pos]
2794
+ ylabeltxt=text_lang(termname+ylabeltxt,termlist[0]+' '+ylabeltxt)
2795
+
2796
+ plot_line(df,colname=termlist[0],collabel=termlist[0], \
2797
+ ylabeltxt=ylabeltxt,titletxt=titletxt,footnote=footnote, \
2798
+ power=power,average_value=average_value, \
2799
+ loc=loc1, \
2800
+ mark_top=mark_top,mark_bottom=mark_bottom,mark_end=mark_end, \
2801
+ facecolor=facecolor)
2802
+
2803
+ if len(termlist)==2: #两条曲线,twinx
2804
+ bond1=termlist[0]; pos1=term_list.index(bond1); bond1name=term_list_names[pos1]
2805
+ bond2=termlist[1]; pos2=term_list.index(bond2); bond2name=term_list_names[pos2]
2708
2806
 
2807
+ df1=pd.DataFrame(df[bond1]); ticker1=''; colname1=bond1; label1=bond1name
2808
+ df2=pd.DataFrame(df[bond2]); ticker2=''; colname2=bond2; label2=bond2name
2809
+
2810
+ plot_line2(df1,ticker1,colname1,label1, \
2811
+ df2,ticker2,colname2,label2, \
2812
+ ylabeltxt=ylabeltxt,titletxt=titletxt,footnote=footnote, \
2813
+ power=power, \
2814
+ twinx=twinx, \
2815
+ loc1=loc1,loc2=loc2, \
2816
+ color1='red',color2='blue',facecolor=facecolor)
2817
+
2818
+ if len(termlist) > 2: #多条曲线
2819
+ df['date']=df.index
2820
+ df.set_index("date",inplace=True)
2821
+
2822
+ for t in termlist:
2823
+ tpos=term_list.index(t); tname=term_list_names[tpos]
2824
+ df.rename(columns={t:tname},inplace=True)
2825
+
2826
+ draw_lines(df,y_label=ylabeltxt,x_label=footnote, \
2827
+ axhline_value=0,axhline_label='', \
2828
+ title_txt=titletxt, \
2829
+ data_label=False, \
2830
+ loc=loc1,annotate=annotate,annotate_value=annotate_value, \
2831
+ mark_top=mark_top,mark_bottom=mark_bottom,mark_end=mark_end, \
2832
+ facecolor=facecolor)
2833
+
2834
+ return df
2835
+
2836
+
2709
2837
  #==============================================================================
siat/common.py CHANGED
@@ -1361,38 +1361,45 @@ if __name__=='__main__':
1361
1361
  shibor_rate('2021-11-19',rate_period='ON')
1362
1362
  #==============================================================================
1363
1363
  if __name__=='__main__':
1364
- start='2020-1-1'
1365
- end='2023-3-4'
1364
+ start='2023-11-1'
1365
+ end='2024-10-30'
1366
1366
  term='1Y'
1367
+
1368
+ treasury_yields_china(start,end,term='1Y')
1367
1369
 
1368
- def treasury_yields_china(start,end,term='1Y'):
1370
+ def treasury_yields_china(start,end='today',term='1Y'):
1369
1371
  """
1370
1372
  功能:抓取指定期间和期限的国债收益率
1371
1373
 
1372
1374
  注意:这里得到的是年化利率,不带百分号,不是日利率!(日利率=年化利率/365)
1373
1375
  """
1376
+ start,end=start_end_preprocess(start,end)
1377
+
1374
1378
  #检查日期期间
1375
1379
  valid,start1,end1=check_period(start,end)
1376
1380
  if not valid:
1377
- print(" #Error(treasury_yields_china): invalid date period from",start,"to",end)
1381
+ print(" #Warning(treasury_yields_china): invalid date period from",start,"to",end)
1378
1382
  return None
1379
1383
 
1380
1384
  #检查利率期间有效性
1381
1385
  term_list=['3M','6M','1Y','3Y','5Y','7Y','10Y','30Y']
1382
1386
  if not (term in term_list):
1383
- print(" #Error(treasury_yields_china): invalid rate period",term)
1387
+ print(" #Warning(treasury_yields_china): invalid rate period",term)
1384
1388
  print(" Supported rate periods:",term_list)
1385
1389
  return None
1386
1390
 
1387
1391
  #抓取中债国债收益率
1388
1392
  import akshare as ak
1389
- df = ak.bond_china_yield(start_date=start,end_date=end)
1393
+ start2=start1.strftime("%Y%m%d")
1394
+ end2=end1.strftime("%Y%m%d")
1395
+ df = ak.bond_china_yield(start_date=start2,end_date=end2)
1390
1396
  if len(df)==0:
1397
+ print(" #Warning(treasury_yields_china): empty data found, try again later")
1391
1398
  return None
1392
1399
 
1393
1400
  df1=df[df['曲线名称']=='中债国债收益率曲线']
1394
1401
  df1.columns=['curve','date']+term_list
1395
- df1.sort_values(by=['date'],ascending=['True'],inplace=True)
1402
+ df1.sort_values(by=['date'],ascending=True,inplace=True)
1396
1403
 
1397
1404
  df1['Date']=pd.to_datetime(df1['date'])
1398
1405
  df1.set_index(['Date'],inplace=True)
@@ -1401,6 +1408,7 @@ def treasury_yields_china(start,end,term='1Y'):
1401
1408
  df1['period']=term
1402
1409
  df2=df1[['date','rate','period']]
1403
1410
 
1411
+
1404
1412
  return df2
1405
1413
 
1406
1414
  if __name__=='__main__':
@@ -4329,15 +4337,20 @@ def df_save(df,file="df"):
4329
4337
  file_name=file
4330
4338
  else:
4331
4339
  file_name=file+'.pkl'
4340
+
4341
+ try:
4342
+ df.to_pickle(file_name)
4332
4343
 
4333
- df.to_pickle(file_name)
4334
- print(" Data is saved in",file_name)
4344
+ import os; path=os.getcwd()
4345
+ print(" Data is saved to file",path+"\\"+file_name)
4346
+ except:
4347
+ print(" #Error(df_save): failed to save data to file",file_name)
4335
4348
 
4336
4349
  return
4337
4350
 
4338
4351
  def df_restore(file):
4339
4352
  """
4340
- 功能:从文件保存df数据,适用于那些需要大量时间获取的df
4353
+ 功能:从文件恢复df数据,适用于那些需要大量时间获取的df
4341
4354
  """
4342
4355
 
4343
4356
  import pandas as pd
@@ -4349,9 +4362,11 @@ def df_restore(file):
4349
4362
 
4350
4363
  try:
4351
4364
  df=pd.read_pickle(file_name)
4352
- print(" Data is restored from",file_name)
4365
+
4366
+ import os; path=os.getcwd()
4367
+ print(" Data is restored from file",path+"\\"+file_name)
4353
4368
  except:
4354
- print(" #Warning(df_dump): file not found for",file_name)
4369
+ print(" #Error(df_restore): file not found for",file_name)
4355
4370
  df=None
4356
4371
  return df
4357
4372
 
siat/fund_china.py CHANGED
@@ -911,7 +911,7 @@ def oef_rank_china2(df,fund_type='全部类型',rank=5,indicator='单位净值')
911
911
  formatted_hour = time.strftime("%H", current_time)
912
912
  footnote5=''
913
913
  if (formatted_hour >= '18' or formatted_hour <= '06') and not is_weekend(todaydt):
914
- footnote5="注意:此时可能为数据源更新时段,获取的信息可能不全\n"
914
+ footnote5="注意:此时若为数据源更新时段,获取的信息可能不全\n"
915
915
 
916
916
  footnote=footnote1+footnote2+footnote3+footnote4+footnote5
917
917
 
@@ -1149,7 +1149,7 @@ def oef_rank_china(indicator='单位净值',fund_type='全部类型',rank=5):
1149
1149
  formatted_hour = time.strftime("%H", current_time)
1150
1150
  footnote4=''
1151
1151
  if formatted_hour > '17':
1152
- footnote4="此时为数据源更新时段,获取的信息可能不全\n"
1152
+ footnote4="此时若为数据源更新时段,获取的信息可能不全\n"
1153
1153
 
1154
1154
  footnote5="数据来源:新浪财经/天天基金"
1155
1155
  footnote=footnote1+footnote2+footnote3+footnote4+footnote5
siat/grafix.py CHANGED
@@ -209,7 +209,7 @@ def plot_line(df0,colname,collabel,ylabeltxt,titletxt,footnote,datatag=False, \
209
209
  #y1=round(y+high_low*0.01,2)
210
210
  y1=y+high_low*0.01
211
211
  #s='%.0f' if y >= 100 else '%.2f'
212
- s='%.0f' if abs(y) >= 100 else '%.2f' if abs(y) >= 10 else '%.3f'
212
+ s='%.2f' if abs(y) >= 100 else '%.2f' if abs(y) >= 10 else '%.3f'
213
213
  plt.text(x,y1,s % y,ha='right',va='bottom',color='red')
214
214
  """
215
215
  s='%.0f' if y >= 100 else '%.2f'
@@ -224,7 +224,7 @@ def plot_line(df0,colname,collabel,ylabeltxt,titletxt,footnote,datatag=False, \
224
224
  #y1=round(y-high_low*0.055,2) #标记位置对应y1的底部
225
225
  y1=y-high_low*0.050 #标记位置对应y1的底部
226
226
  #s='%.0f' if y >= 100 else '%.2f'
227
- s='%.0f' if abs(y) >= 100 else '%.2f' if abs(y) >= 10 else '%.3f'
227
+ s='%.2f' if abs(y) >= 100 else '%.2f' if abs(y) >= 10 else '%.3f'
228
228
  #plt.text(x,y1,s % y,ha='center',va='bottom',color='seagreen')
229
229
  plt.text(x,y1,s % y,ha='right',va='bottom',color='seagreen')
230
230
  plt.scatter(x,y, color='seagreen',marker='8',s=70)
@@ -236,7 +236,7 @@ def plot_line(df0,colname,collabel,ylabeltxt,titletxt,footnote,datatag=False, \
236
236
  x_end = df_end[colname].idxmin() # 末端值的x坐标
237
237
 
238
238
  #y1=str(int(y_end)) if y_end >= 100 else str(round(y_end,2))
239
- y1=str(int(y_end)) if abs(y_end) >= 100 else str(round(y_end,2)) if abs(y_end) >= 10 else str(round(y_end,3))
239
+ y1=str(round(y_end,2)) if abs(y_end) >= 100 else str(round(y_end,2)) if abs(y_end) >= 10 else str(round(y_end,3))
240
240
  plt.annotate(text=' '+y1,
241
241
  xy=(x_end, y_end),
242
242
  xytext=(x_end, y_end),fontsize=annotate_size)
@@ -1242,7 +1242,7 @@ def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
1242
1242
 
1243
1243
  if annotate_value: #在标记曲线名称的同时标记其末端数值
1244
1244
  #y1=str(int(y_end)) if y_end >= 100 else str(round(y_end,2))
1245
- y1=str(int(y_end)) if abs(y_end) >= 100 else str(round(y_end,2)) if abs(y_end) >= 10 else str(round(y_end,3))
1245
+ y1=str(round(y_end,2)) if abs(y_end) >= 100 else str(round(y_end,2)) if abs(y_end) >= 10 else str(round(y_end,3))
1246
1246
  plt.annotate(text=c+':'+y1,
1247
1247
  xy=(x_end, y_end),
1248
1248
  xytext=(x_end, y_end),fontsize=annotate_size,
@@ -1274,7 +1274,7 @@ def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
1274
1274
  #y1=round(y+high_low*0.01,2)
1275
1275
  y1=y+high_low*0.01
1276
1276
  #s='%.0f' if y >= 100 else '%.2f'
1277
- s='%.0f' if abs(y) >= 100 else '%.2f' if abs(y) >= 10 else '%.3f'
1277
+ s='%.2f' if abs(y) >= 100 else '%.2f' if abs(y) >= 10 else '%.3f'
1278
1278
  #plt.text(x,y1,s % y,ha='center',va='bottom',color='red')
1279
1279
  plt.text(x,y1,s % y,ha='right',va='bottom',color=last_line_color)
1280
1280
  plt.scatter(x,y, color='red',marker='8',s=70)
@@ -1285,7 +1285,7 @@ def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
1285
1285
  #y1=round(y-high_low*0.055,2) #标记位置对应y1的底部
1286
1286
  y1=y-high_low*0.050 #标记位置对应y1的底部
1287
1287
  #s='%.0f' if y >= 100 else '%.2f'
1288
- s='%.0f' if abs(y) >= 100 else '%.2f' if abs(y) >= 10 else '%.3f'
1288
+ s='%.2f' if abs(y) >= 100 else '%.2f' if abs(y) >= 10 else '%.3f'
1289
1289
  #plt.text(x,y1,s % y,ha='center',va='bottom',color='seagreen')
1290
1290
  plt.text(x,y1,s % y,ha='right',va='bottom',color=last_line_color)
1291
1291
  plt.scatter(x,y, color='seagreen',marker='8',s=70)
@@ -1297,7 +1297,7 @@ def draw_lines(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
1297
1297
  x_end = df_end[c].idxmin() # 末端值的x坐标
1298
1298
 
1299
1299
  #y1=str(int(y_end)) if y_end >= 100 else str(round(y_end,2))
1300
- y1=str(int(y_end)) if abs(y_end) >= 100 else str(round(y_end,2)) if abs(y_end) >= 10 else str(round(y_end,3))
1300
+ y1=str(round(y_end,2)) if abs(y_end) >= 100 else str(round(y_end,2)) if abs(y_end) >= 10 else str(round(y_end,3))
1301
1301
  plt.annotate(text=' '+y1,
1302
1302
  xy=(x_end, y_end),
1303
1303
  xytext=(x_end, y_end),fontsize=annotate_size,
@@ -1471,7 +1471,7 @@ def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
1471
1471
  #y1=round(y+high_low*0.01,2)
1472
1472
  y1=y+high_low*0.01
1473
1473
  #s='%.0f' if y >= 100 else '%.2f'
1474
- s='%.0f' if abs(y) >= 100 else '%.2f' if abs(y) >= 10 else '%.3f'
1474
+ s='%.2f' if abs(y) >= 100 else '%.2f' if abs(y) >= 10 else '%.3f'
1475
1475
  #plt.text(x,y1,s % y,ha='center',va='bottom',color='red')
1476
1476
  plt.text(x,y1,s % y,ha='right',va='bottom',color=last_line_color)
1477
1477
  plt.scatter(x,y, color='red',marker='8',s=70)
@@ -1482,7 +1482,7 @@ def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
1482
1482
  #y1=round(y-high_low*0.055,2) #标记位置对应y1的底部
1483
1483
  y1=y-high_low*0.050 #标记位置对应y1的底部
1484
1484
  #s='%.0f' if y >= 100 else '%.2f'
1485
- s='%.0f' if abs(y) >= 100 else '%.2f' if abs(y) >= 10 else '%.3f'
1485
+ s='%.2f' if abs(y) >= 100 else '%.2f' if abs(y) >= 10 else '%.3f'
1486
1486
  #plt.text(x,y1,s % y,ha='center',va='bottom',color='seagreen')
1487
1487
  plt.text(x,y1,s % y,ha='right',va='bottom',color=last_line_color)
1488
1488
  plt.scatter(x,y, color='seagreen',marker='8',s=70)
@@ -1513,7 +1513,7 @@ def draw_lines2(df0,y_label,x_label,axhline_value,axhline_label,title_txt, \
1513
1513
  x_end = df_end[c].idxmin() # 末端值的x坐标
1514
1514
 
1515
1515
  #y1=str(int(y_end)) if y_end >= 100 else str(round(y_end,2))
1516
- y1=str(int(y_end)) if abs(y_end) >= 100 else str(round(y_end,2)) if abs(y_end) >= 10 else str(round(y_end,3))
1516
+ y1=str(round(y_end,2)) if abs(y_end) >= 100 else str(round(y_end,2)) if abs(y_end) >= 10 else str(round(y_end,3))
1517
1517
  plt.annotate(text=y1,
1518
1518
  xy=(x_end, y_end),
1519
1519
  xytext=(x_end, y_end),fontsize=annotate_size,
siat/stock.py CHANGED
@@ -681,6 +681,10 @@ def security_indicator(ticker,indicator, \
681
681
  adjust=adjust, \
682
682
  todate=todate,source=source,ticker_type=ticker_type)
683
683
 
684
+ if not found == "Found":
685
+ print(" #Error(security_indicator): no security info found for",ticker)
686
+ return None
687
+
684
688
  # 去掉时区信息,避免日期时区冲突问题
685
689
  pricedf=df_index_timezone_remove(pricedf)
686
690
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: siat
3
- Version: 3.5.2
3
+ Version: 3.5.9
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
@@ -9,7 +9,7 @@ siat/beta_adjustment.py,sha256=viJJE9O82SbA_VYuJtrs3HT0OWYhk4yvmoywskrAhaI,37287
9
9
  siat/beta_adjustment_china.py,sha256=QAVhTQxfV7NSakNPMfQtGMeRzEHVBC8JZQTqD5Owp2I,20802
10
10
  siat/beta_adjustment_test.py,sha256=nBhvQQfqxooCHjy5hL0a8V0ZC58BjuCZVFpqpWpHeF0,2467
11
11
  siat/blockchain.py,sha256=awF3GDtlwaJhku0a2kLuXOS8d3IzkjR_RyzlZWvD3L4,6032
12
- siat/bond.py,sha256=9dIj2MMGXByxHkqLuBpWhfEkcix9RzAtzQovLRQUCZA,103903
12
+ siat/bond.py,sha256=BswqLEiOWbsfYD6ZDVLrvgQRQu2qGVzMDnf8y7RHQLU,109140
13
13
  siat/bond_base.py,sha256=KBm0hOQSE6fruXd9eJztY9pXCN19iv7aCXZZcnVM4yY,37637
14
14
  siat/bond_china.py,sha256=eYv-nMoWSS5fZ4VxnuJ29QFY9GUS6meGiIc0Xjm1fQI,3038
15
15
  siat/bond_test.py,sha256=yUOFw7ddGU-kb1rJdnsjkJWziDNgUR7OLDA7F7Ub91A,5246
@@ -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=rWOQWvkkmLiOwj5XAagLLP-ii7VJNKYPSK5rimCUTfo,158534
21
+ siat/common.py,sha256=PFo30Yu2Vua1GEr02joJj-Wej-e47dAAqwCAVHjj40A,159050
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,14 +53,14 @@ 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=ocqQnDHdnQWnRmSQ0KTBC5FoBwKtualKZprtdMlPe_A,111907
56
+ siat/fund_china.py,sha256=jRAibZiHXAjUwlHoIiXK_moFhEYvVzl2Q0FhfYRZiFk,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
60
60
  siat/future_china_test.py,sha256=BrSzmDVaOHki6rntOtosmRn-6dkfOBuLulJNqh7MOpc,1163
61
61
  siat/global_index_test.py,sha256=hnFp3wqqzzL-kAP8mgxDZ54Bd5Ijf6ENi5YJlGBgcXw,2402
62
62
  siat/google_authenticator.py,sha256=ZUbZR8OW0IAKDbcYtlqGqIpZdERpFor9NccFELxg9yI,1637
63
- siat/grafix.py,sha256=irpjbeRTDorDOwkJYv6wArtrdM-KrU27I7CjeKuHWqM,87857
63
+ siat/grafix.py,sha256=9brQItikS7aHXO1mnwgEYCzfq1tjzOHWOCVgiFyaHNA,87873
64
64
  siat/grafix_test.py,sha256=kXvcpLgQNO7wd30g_bWljLj5UH7bIVI0_dUtXbfiKR0,3150
65
65
  siat/holding_risk.py,sha256=G3wpaewAKF9CwEqRpr4khyuDu9SU2EGyQUHdk7cmHOA,30693
66
66
  siat/holding_risk_test.py,sha256=FRlw_9wFG98BYcg_cSj95HX5WZ1TvkGaOUdXD7-V86s,474
@@ -105,7 +105,7 @@ siat/security_trend2-20240620.py,sha256=QVnEcb7AyVbO77jVqfFsJffGXrX8pgJ9xCfoAKmW
105
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=8zOIiPDlzLCqHqvyLOLzmaAt6B1QOSW24r7giRc2jKc,154911
108
+ siat/stock.py,sha256=-vhAVxaEjoF3jlU2geAI3Y_OT9-IsEz21DFSOy68QCA,155054
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
@@ -140,8 +140,8 @@ 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.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,,
143
+ siat-3.5.9.dist-info/LICENSE,sha256=NTEMMROY9_4U1szoKC3N2BLHcDd_o5uTgqdVH8tbApw,1071
144
+ siat-3.5.9.dist-info/METADATA,sha256=oEnRGAyy2ZxYebqnrDoiTgQE0OIEmVyc8kAtcOSExkA,8009
145
+ siat-3.5.9.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
146
+ siat-3.5.9.dist-info/top_level.txt,sha256=r1cVyL7AIKqeAmEJjNR8FMT20OmEzufDstC2gv3NvEY,5
147
+ siat-3.5.9.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: bdist_wheel (0.41.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
File without changes