siat 3.2.42__py3-none-any.whl → 3.2.46__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
@@ -3790,7 +3790,7 @@ if __name__=='__main__':
3790
3790
 
3791
3791
  def upgrade_siat(module_list=['siat','akshare','pandas','pandas_datareader', \
3792
3792
  'yfinance','yahooquery','urllib3','tabulate','twine', \
3793
- 'mplfinance','openpyxl','pip'], \
3793
+ 'mplfinance','openpyxl','pip','bottleneck'], \
3794
3794
  pipcmd="pip install --upgrade",alternative=""):
3795
3795
  """
3796
3796
  功能:一次性升级siat及其相关插件
@@ -3952,17 +3952,25 @@ if __name__=='__main__':
3952
3952
 
3953
3953
  show_df(data,search_mode=False)
3954
3954
  show_df(data,search_mode=True)
3955
+
3956
+ x=5
3957
+ show_df(x)
3955
3958
 
3956
3959
  def show_df(data,search_mode=False):
3957
3960
  """
3958
3961
  功能:在Jupyter中查看dataframe,并可下载成Excel
3959
3962
  """
3960
- df=data.copy()
3961
3963
 
3962
3964
  import pandas as pd
3965
+ if not isinstance(data,pd.DataFrame):
3966
+ print("#Warning: the first parameter must be a dataframe")
3967
+ return
3968
+
3963
3969
  import datetime
3964
3970
  from itables import init_notebook_mode, show
3965
3971
  init_notebook_mode(all_interactive=True)
3972
+
3973
+ df=data.copy()
3966
3974
 
3967
3975
  if not search_mode:
3968
3976
  show(df, buttons=["copyHtml5", "csvHtml5", "excelHtml5"])
siat/grafix.py CHANGED
@@ -71,8 +71,8 @@ if czxt in ['win32','win64']:
71
71
  plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置默认字体
72
72
  mpfrc={'font.family': 'SimHei'}
73
73
  """
74
- plt.rcParams['font.sans-serif'] = ['SimSun'] # 设置默认字体
75
- mpfrc={'font.family': 'SimSun'}
74
+ plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置默认字体
75
+ mpfrc={'font.family': 'SimHei'}
76
76
 
77
77
  if check_language() == "English":
78
78
  #设置英文字体
siat/market_china.py CHANGED
@@ -907,6 +907,8 @@ def market_detail_china2table(df,titletxt,firstColSpecial=True,leftColAlign='l',
907
907
  #==============================================================================
908
908
  if __name__=='__main__':
909
909
  category='price'
910
+ category='volume'
911
+ category='return'
910
912
  category='valuation'
911
913
 
912
914
  facecolor='papayawhip'
@@ -975,25 +977,40 @@ def market_detail_china2(category='price',
975
977
 
976
978
  # 前置空格个数
977
979
  heading=' '*1
980
+ df.rename(columns={'项目':'Item','上海证券交易所':'Shanghai SE','深圳证券交易所':'Shenzhen SE','北京证券交易所':'Beijing SE'},inplace=True)
978
981
 
979
982
  if category1=='PRICE':
980
- titletxt="中国三大股票交易所横向对比:股价与涨跌"
983
+ titletxt=text_lang("中国三大股票交易所横向对比:股价与涨跌","China Stock Exchanges: Differences in Price")
981
984
 
982
- ft0=heading+"信息来源:东方财富,统计时间:"+nowstr+"\n"
983
- ft1=heading+"注释:\n"
984
- ft2=heading+"☆可交易股票数量:将随着股票停复牌情况变化\n"
985
- ft3=heading+"☆昨日指的是上一个交易日\n"
986
- ft4=heading+"☆涨速:平均每分钟股价变化率,表示股价变化速度\n"
987
- ft5=heading+"☆5分钟涨跌:最新5分钟内股价的涨跌幅度\n"
988
- ft6=heading+"☆振幅:最高最低价差绝对值/昨收,表示股价变化活跃程度\n"
989
- ft7=heading+"☆涨跌幅:(最新价-昨收)/昨收,表示相对昨日的变化程度\n"
990
- ft8=heading+"☆涨跌额:最新价-昨收,表示相对昨日的变化金额\n"
985
+ ft0=heading+text_lang("信息来源:东方财富,统计时间:","Data source: EM, updated ")+nowstr+"\n"
986
+ ft1=heading+text_lang("注释:\n","Notes:\n")
987
+ ft2=heading+text_lang("☆可交易股票数量:将随着股票停复牌情况变化\n","*Tradeable stocks: vary with suspension/resumption\n")
988
+ ft3=heading+text_lang("☆昨日指的是上一个交易日\n","*Prev: refers to previous trading day\n")
989
+ ft4=heading+text_lang("☆涨速:平均每分钟股价变化率,表示股价变化速度\n","*Changing speed(涨速): rate of changes per minute\n")
990
+ ft5=heading+text_lang("☆5分钟涨跌:最新5分钟内股价的涨跌幅度\n","*5 min up-down(5分钟涨跌): changes recent 5 minutes\n")
991
+ ft6=heading+text_lang("☆振幅:最高最低价差绝对值/昨收,表示股价变化活跃程度\n","*Amplitude(振幅): (High - Low)/Prev Close\n")
992
+ ft7=heading+text_lang("☆涨跌幅:(最新价-昨收)/昨收,表示相对昨日的变化程度\n","*Change%(涨跌幅): (Current Price/Prev Close - 1\n")
993
+ ft8=heading+text_lang("☆涨跌额:最新价-昨收,表示相对昨日的变化金额\n","*Change(涨跌额): Current Price - Prev Close\n")
991
994
 
992
- ft9=heading+"☆使用实时数据,不同日期/每天不同时刻统计的结果可能不同\n"
993
- ft10=heading+"☆若在非交易日或开市前后短期内统计,数据可能出现空缺\n"
995
+ ft9=heading+text_lang("☆使用实时数据,不同日期/每天不同时刻统计的结果可能不同\n","*Based on real-time data, vary with time\n")
996
+ ft10=heading+text_lang("☆若在非交易日或开市前后短期内统计,数据可能出现空缺\n","*Missing data may happen around non-trading time\n")
994
997
 
995
998
  footnote=ft0+ft1+ft2+ft3+ft4+ft5+ft6+ft7+ft8+ft9+ft10
996
999
 
1000
+ itme_list=['Tradeable stocks',
1001
+ 'Stock Price Level',
1002
+ '.....Prev close mean',
1003
+ '.....Today open mean',
1004
+ '.....Current price mean',
1005
+ 'Stock Price Up-down',
1006
+ '.....Current change%',
1007
+ '.....Last 5 min change%',
1008
+ 'Today vs. Prev',
1009
+ '.....Amplitude%',
1010
+ '.....Change% mean',
1011
+ '.....Change mean(RMB)']
1012
+ df['Item']=itme_list
1013
+
997
1014
  df_display_CSS(df,titletxt=titletxt,footnote=footnote,facecolor=facecolor, \
998
1015
  first_col_align='left',second_col_align='right', \
999
1016
  last_col_align='right',other_col_align='right', \
@@ -1003,21 +1020,30 @@ def market_detail_china2(category='price',
1003
1020
 
1004
1021
 
1005
1022
  if category1=='VOLUME':
1006
- titletxt="中国三大股票交易所横向对比:成交状况"
1007
-
1008
- ft0=heading+"信息来源:东方财富,统计时间:"+nowstr+"\n"
1009
- ft1=heading+"注:\n"
1010
- ft2=heading+"☆可交易股票数量:将随着股票停复牌情况变化\n"
1011
- ft3=heading+"☆成交量:当前成交股数,表示交易活跃度\n"
1012
- ft4=heading+"☆成交额:当前开市后的累计成交金额\n"
1013
- ft5=heading+"☆换手率:成交量/流通股数,表示成交量占比\n"
1014
- ft6=heading+"☆量比:当前每分钟成交量/过去5个交易日均值,表示成交量变化\n"
1023
+ titletxt=text_lang("中国三大股票交易所横向对比:成交状况","China Stock Exchanges: Differences in Volume")
1024
+
1025
+ ft0=heading+text_lang("信息来源:东方财富,统计时间:","Data source: EM, updated ")+nowstr+"\n"
1026
+ ft1=heading+text_lang("注:\n","Notes:\n")
1027
+ ft2=heading+text_lang("☆可交易股票数量:将随着股票停复牌情况变化\n","*Tradeable stocks: vary with suspension/resumption\n")
1028
+ ft3=heading+text_lang("☆成交量:当前成交股数,表示交易活跃度\n","*Volume(成交量): traded number of shares since open today\n")
1029
+ ft4=heading+text_lang("☆成交额:当前开市后的累计成交金额\n","*Amount(成交额): traded dollar amount since open today\n")
1030
+ ft5=heading+text_lang("☆换手率:成交量/流通股数,表示成交量占比\n","*Turnover rate(换手率): volume/outstanding shares\n")
1031
+ ft6=heading+text_lang("☆量比:当前每分钟成交量/过去5个交易日均值,表示成交量变化\n","*Volume ratio(量比): current turnover per min/prev 5 mean\n")
1015
1032
 
1016
- ft9=heading+"☆使用实时数据,不同日期/每天不同时刻统计的结果可能不同\n"
1017
- ft10=heading+"☆若在非开市时间或开市前后短期内统计,数据可能出现空缺\n"
1033
+ ft9=heading+text_lang("☆使用实时数据,不同日期/每天不同时刻统计的结果可能不同\n","*Based on real-time data, vary with time\n")
1034
+ ft10=heading+text_lang("☆若在非开市时间或开市前后短期内统计,数据可能出现空缺\n","*Missing data may happen around non-trading time\n")
1018
1035
 
1019
1036
  footnote=ft0+ft1+ft2+ft3+ft4+ft5+ft6 + ft9+ft10
1020
1037
 
1038
+ itme_list=['Tradeable stocks',
1039
+ 'Volume Level Today',
1040
+ '.....Volume mean(million)',
1041
+ '.....Amount mean(100 millions)',
1042
+ '.....Turnover rate mean %',
1043
+ 'Today vs. Prev',
1044
+ '.....Volume ratio(times)']
1045
+ df['Item']=itme_list
1046
+
1021
1047
  df_display_CSS(df,titletxt=titletxt,footnote=footnote,facecolor=facecolor, \
1022
1048
  first_col_align='left',second_col_align='right', \
1023
1049
  last_col_align='right',other_col_align='right', \
@@ -1027,19 +1053,32 @@ def market_detail_china2(category='price',
1027
1053
 
1028
1054
 
1029
1055
  if category1=='RETURN':
1030
- titletxt="中国三大股票交易所横向对比:投资回报"
1056
+ titletxt=text_lang("中国三大股票交易所横向对比:投资回报","China Stock Exchanges: Differences in Return")
1031
1057
 
1032
- ft0=heading+"信息来源:东方财富,统计时间:"+nowstr+"\n"
1033
- ft1=heading+"注:\n"
1034
- ft2=heading+"☆可交易股票数量:将随着股票停复牌情况变化\n"
1035
- ft3=heading+"☆MRQ:最近一个季度的滚动数据\n"
1036
- ft4=heading+"☆YTD:今年以来的累计情况\n"
1058
+ ft0=heading+text_lang("信息来源:东方财富,统计时间:","Data source: EM, updated ")+nowstr+"\n"
1059
+ ft1=heading+text_lang("注:\n","Notes:\n")
1060
+ ft2=heading+text_lang("☆可交易股票数量:将随着股票停复牌情况变化\n","*Tradeable stocks: vary with suspension/resumption\n")
1061
+ ft3=heading+text_lang("☆MRQ:最近一个季度的滚动数据\n","*MRQ: most recent quarter\n")
1062
+ ft4=heading+text_lang("☆YTD:今年以来的累计情况\n","*YTD: year to today\n")
1037
1063
 
1038
- ft9=heading+"☆使用实时数据,不同日期/每天不同时刻统计的结果可能不同\n"
1039
- ft10=heading+"☆若在非开市时间或开市前后短期内统计,数据可能出现空缺\n"
1064
+ ft9=heading+text_lang("☆使用实时数据,不同日期/每天不同时刻统计的结果可能不同\n","*Based on real-time data, vary with time\n")
1065
+ ft10=heading+text_lang("☆若在非开市时间或开市前后短期内统计,数据可能出现空缺\n","*Missing data may happen around non-trading time\n")
1040
1066
 
1041
1067
  footnote=ft0+ft1+ft2+ft3+ft4 + ft9+ft10
1042
1068
 
1069
+ itme_list=['Tradeable stocks',
1070
+ 'MRQ Investment Return',
1071
+ '.....MRQ change% mean',
1072
+ '.....MRQ change% median',
1073
+ '.....MRQ change% std',
1074
+ '.....MRQ rising stock%',
1075
+ 'YTD Investment Return',
1076
+ '.....YTD change% mean',
1077
+ '.....YTD change% median',
1078
+ '.....YTD change% std',
1079
+ '.....YTD rising stock%']
1080
+ df['Item']=itme_list
1081
+
1043
1082
  df_display_CSS(df,titletxt=titletxt,footnote=footnote,facecolor=facecolor, \
1044
1083
  first_col_align='left',second_col_align='right', \
1045
1084
  last_col_align='right',other_col_align='right', \
@@ -1049,20 +1088,44 @@ def market_detail_china2(category='price',
1049
1088
 
1050
1089
 
1051
1090
  if category1=='VALUATION':
1052
- titletxt="中国三大股票交易所横向对比:市值与估值"
1091
+ titletxt=text_lang("中国三大股票交易所横向对比:市值与估值","China Stock Exchanges: Differences in Valuation")
1053
1092
 
1054
- ft0=heading+"信息来源:东方财富,统计时间:"+nowstr+"\n"
1055
- ft1=heading+"注:\n"
1056
- ft2=heading+"☆可交易股票数量:将随着股票停复牌情况变化\n"
1057
- ft3=heading+"☆市盈率:这里为动态市盈率,即市盈率TTM,过去12个月的连续变化\n"
1058
- ft4=heading+"☆市净率:这里为静态市净率\n"
1059
- ft5=heading+"☆标准差/均值=标准差(数值)/均值,提升可比性\n"
1093
+ ft0=heading+text_lang("信息来源:东方财富,统计时间:","Data source: EM, updated ")+nowstr+"\n"
1094
+ ft1=heading+text_lang("注:\n","Notes:\n")
1095
+ ft2=heading+text_lang("☆可交易股票数量:将随着股票停复牌情况变化\n","*Tradeable stocks: vary with suspension/resumption\n")
1096
+ ft3=heading+text_lang("☆市盈率:这里为动态市盈率,即市盈率TTM,过去12个月的连续变化\n","*P/E: price/earnings per share, TTM\n")
1097
+ ft4=heading+text_lang("☆市净率:这里为静态市净率\n","*P/B: price/net asset per share, stationary\n")
1098
+ ft5=heading+text_lang("☆标准差/均值=标准差(数值)/均值,提升可比性\n","*std/mean: degree of variation, better comparability\n")
1060
1099
 
1061
- ft9=heading+"☆使用实时数据,不同日期/每天不同时刻统计的结果可能不同\n"
1062
- ft10=heading+"☆若在非开市时间或开市前后短期内统计,数据可能出现空缺\n"
1100
+ ft9=heading+text_lang("☆使用实时数据,不同日期/每天不同时刻统计的结果可能不同\n","*Based on real-time data, vary with time\n")
1101
+ ft10=heading+text_lang("☆若在非开市时间或开市前后短期内统计,数据可能出现空缺\n","*Missing data may happen around non-trading time\n")
1063
1102
 
1064
1103
  footnote=ft0+ft1+ft2+ft3+ft4+ft5 + ft9+ft10
1065
1104
 
1105
+ itme_list=['Tradeable stocks',
1106
+ 'Total Market Cap (TMC)',
1107
+ '.....Whole Market TMC(trillion)',
1108
+ '.....Stock TMC mean(billion)',
1109
+ '.....Stock TMC median(billion)',
1110
+ '.....Stock TMC std/mean',
1111
+ 'Outstanding Market Cap (OMC)',
1112
+ '.....Whole Market OMC(trillion)',
1113
+ '.....Whole Market outstanding %',
1114
+ '.....Stock OMC mean(billion)',
1115
+ '.....Stock OMC median(billion)',
1116
+ '.....Stock OMC std/mean',
1117
+ 'Valuation: P/E',
1118
+ '.....Stock P/E mean',
1119
+ '.....Stock P/E median',
1120
+ '.....Stock P/E std/mean',
1121
+ 'Valuation: P/B',
1122
+ '.....Stock P/B mean',
1123
+ '.....Stock P/B median',
1124
+ '.....Stock P/B std/mean']
1125
+
1126
+ df['Item']=itme_list
1127
+
1128
+
1066
1129
  df_display_CSS(df,titletxt=titletxt,footnote=footnote,facecolor=facecolor, \
1067
1130
  first_col_align='left',second_col_align='right', \
1068
1131
  last_col_align='right',other_col_align='right', \
siat/security_prices.py CHANGED
@@ -1011,7 +1011,7 @@ def get_price_ak_us(symbol, fromdate, todate, adjust=""):
1011
1011
  df2['ticker']=symbol
1012
1012
  if 'Adj Close' not in list(df2):
1013
1013
  df2['Adj Close']=df2['Close']
1014
- df2['source']='新浪'
1014
+ df2['source']=text_lang('新浪','Sina')
1015
1015
  df2['footnote']=adjust
1016
1016
 
1017
1017
  ptname=ticker_name(symbol,'stock')
@@ -1097,7 +1097,7 @@ def get_price_ak_hk(symbol,fromdate,todate,adjust=""):
1097
1097
  df2['ticker']=symbol
1098
1098
  if 'Adj Close' not in list(df2):
1099
1099
  df2['Adj Close']=df2['Close']
1100
- df2['source']='新浪'
1100
+ df2['source']=text_lang('新浪','Sina')
1101
1101
 
1102
1102
  ptname=ticker_name(symbol,'stock')
1103
1103
  if ptname == symbol: ptname=''
@@ -2343,15 +2343,15 @@ def recent_stock_split(ticker):
2343
2343
 
2344
2344
  divprt=divdf[['Seq','Split Date','Weekday','Splits']]
2345
2345
 
2346
- print("\n=== 近期股票分拆历史 ===")
2347
- print("股票:",ticker,'\b,',ticker)
2348
- print("期间:",fromdate,"to",today)
2349
- divprt.columns=['序号','日期','星期','分拆比例']
2346
+ print(text_lang("\n=== 近期股票分拆历史 ===","\n=== Recent Stock Split ==="))
2347
+ print(text_lang("股票:","Stock:"),ticker,'\b,',ticker)
2348
+ print(text_lang("期间:","Period:"),fromdate,"to",today)
2349
+ divprt.columns=[text_lang('序号','No.'),text_lang('日期','Date'),text_lang('星期','Weekday'),text_lang('分拆比例','Split Ratio')]
2350
2350
  print(divprt.to_string(index=False))
2351
2351
 
2352
2352
  import datetime
2353
2353
  today = datetime.date.today()
2354
- print("数据来源: 综合新浪/yahoo,",today)
2354
+ print(text_lang("数据来源: 综合新浪/yahoo,","Data source: Yahoo Finance,"),today)
2355
2355
 
2356
2356
  return divdf
2357
2357
 
siat/stock.py CHANGED
@@ -1350,7 +1350,7 @@ def comp_2securities_1measure(df1,df2,measure,twinx=False,loc1='upper left', \
1350
1350
  #for c in nouselist: dfcols.remove(c)
1351
1351
 
1352
1352
  if not (measure in dfcols):
1353
- print(" #Error(comp_2securities_1measure): only support measurement types of",dfcols)
1353
+ print(" #Error(comp_2securities_1measure):only support measurement types of",dfcols)
1354
1354
  return
1355
1355
 
1356
1356
  #判断是否绘制水平0线
@@ -1404,13 +1404,33 @@ if __name__ =="__main__":
1404
1404
  df2=stock_ret(ticker2,fromdate,todate,graph=False)
1405
1405
  comp_2securities_1measure(df1,df2,measure)
1406
1406
  #==============================================================================
1407
+ if __name__ =="__main__":
1408
+ tickers=['MSFT','AAPL']
1409
+ measures='Annual Ret Volatility%'
1410
+
1411
+ tickers='MSFT'
1412
+ measures=['Annual Ret Volatility%','Annual Ret%']
1413
+
1414
+ fromdate='2023-1-1'
1415
+ todate='2023-12-31'
1416
+ adjust=''
1417
+ twinx=False
1418
+ loc1='best'
1419
+ loc2='lower left'
1420
+ graph=True
1421
+ source='auto'
1422
+ ticker_type='auto'
1423
+ facecolor='whitesmoke'
1424
+
1407
1425
  def compare_security(tickers,measures,fromdate,todate, \
1408
1426
  adjust='', \
1409
1427
  twinx=False, \
1410
1428
  loc1='best',loc2='lower left',graph=True,source='auto', \
1411
1429
  ticker_type='auto',facecolor='whitesmoke'):
1412
1430
  """
1413
- 功能:函数克隆compare_stock
1431
+ 功能:函数克隆compare_stock,只能处理两个ticker一个measure,或一个ticker两个measure
1432
+ 可以处理twinx=True
1433
+ """
1414
1434
  """
1415
1435
  # 应对导入失灵的函数
1416
1436
  from siat.security_prices import upper_ticker
@@ -1421,9 +1441,159 @@ def compare_security(tickers,measures,fromdate,todate, \
1421
1441
  twinx=twinx, \
1422
1442
  loc1=loc1,loc2=loc2,graph=graph,source=source, \
1423
1443
  ticker_type=ticker_type,facecolor=facecolor)
1444
+
1424
1445
  return result
1446
+ """
1447
+ #调试开关
1448
+ DEBUG=False
1449
+ # 应对导入失灵的函数
1450
+ from siat.common import upper_ticker
1451
+ tickers=upper_ticker(tickers)
1452
+
1453
+ #判断证券代码个数
1454
+ #如果tickers只是一个字符串
1455
+ security_num = 0
1456
+ if isinstance(tickers,str):
1457
+ security_num = 1
1458
+ ticker1 = tickers
1459
+ #如果tickers是一个列表
1460
+ if isinstance(tickers,list):
1461
+ security_num = len(tickers)
1462
+ if security_num == 0:
1463
+ print(" #Error(compare_security):security code/codes needed.")
1464
+ return None,None
1465
+ if security_num >= 1: ticker1 = tickers[0]
1466
+ if security_num >= 2: ticker2 = tickers[1]
1467
+
1468
+ #判断测度个数
1469
+ #如果measures只是一个字符串
1470
+ measure_num = 0
1471
+ if isinstance(measures,str):
1472
+ measure_num = 1
1473
+ measure1 = measures
1474
+ #如果measures是一个列表
1475
+ if isinstance(measures,list):
1476
+ measure_num = len(measures)
1477
+ if measure_num == 0:
1478
+ print(" #Error(compare_security): a measurement indicator needed.")
1479
+ return None,None
1480
+ if measure_num >= 1: measure1 = measures[0]
1481
+ if measure_num >= 2: measure2 = measures[1]
1482
+
1483
+ #解析ticker_type
1484
+ if isinstance(ticker_type,str):
1485
+ ticker_type1=ticker_type2=ticker_type
1486
+ if isinstance(ticker_type,list) and len(ticker_type)==1:
1487
+ ticker_type1=ticker_type2=ticker_type[0]
1488
+ if isinstance(ticker_type,list) and len(ticker_type) > 1:
1489
+ ticker_type1=ticker_type[0]
1490
+ ticker_type2=ticker_type[1]
1491
+ ticker_type_list=[ticker_type1,ticker_type2]
1492
+
1493
+ #单一证券代码+两个测度指标
1494
+ if (security_num == 1) and (measure_num >= 2):
1495
+ #复权价判断
1496
+ if (('Adj' in measure1) or ('Adj' in measure2)) and (adjust ==''):
1497
+ adjust='qfq'
1425
1498
 
1499
+ pltdf1=compare_msecurity(tickers=ticker1,measure=measure1, \
1500
+ start=fromdate,end=todate, \
1501
+ adjust=adjust, \
1502
+ graph=False, \
1503
+ source=source, \
1504
+ ticker_type=ticker_type_list[0])
1505
+ pltdf1.rename(columns={list(pltdf1)[0]:measure1},inplace=True)
1506
+
1507
+ pltdf2=compare_msecurity(tickers=ticker1,measure=measure2, \
1508
+ start=fromdate,end=todate, \
1509
+ adjust=adjust, \
1510
+ graph=False, \
1511
+ source=source, \
1512
+ ticker_type=ticker_type_list[0])
1513
+ pltdf2.rename(columns={list(pltdf2)[0]:measure2},inplace=True)
1514
+
1515
+ pltdf=pd.merge(pltdf1,pltdf2,left_index=True,right_index=True)
1516
+ pltdf['ticker']=ticker1
1517
+
1518
+ #绘制单个证券的双指标对比图
1519
+ if graph:
1520
+ comp_1security_2measures(pltdf,measure1,measure2,twinx=twinx, \
1521
+ loc1=loc1,loc2=loc2,graph=graph, \
1522
+ ticker_type=ticker_type[0],facecolor=facecolor)
1523
+
1524
+ try:
1525
+ result1=pltdf1[[measure1]]
1526
+ except:
1527
+ return None,None
1528
+ try:
1529
+ result2=pltdf1[[measure2]]
1530
+ except:
1531
+ return result1,None
1532
+ else:
1533
+ return result1,result2
1534
+
1535
+ elif (security_num >= 2) and (measure_num >= 1):
1536
+ #双证券+单个测度指标
1537
+ if ('Adj' in measure1) and (adjust ==''):
1538
+ adjust='qfq'
1539
+
1540
+ pltdf1=compare_msecurity(tickers=ticker1,measure=measure1, \
1541
+ start=fromdate,end=todate, \
1542
+ adjust=adjust, \
1543
+ graph=False, \
1544
+ source=source, \
1545
+ ticker_type=ticker_type_list[0])
1546
+ pltdf1.rename(columns={list(pltdf1)[0]:measure1},inplace=True)
1547
+ pltdf1['ticker']=ticker1
1548
+
1549
+ pltdf2=compare_msecurity(tickers=ticker2,measure=measure1, \
1550
+ start=fromdate,end=todate, \
1551
+ adjust=adjust, \
1552
+ graph=False, \
1553
+ source=source, \
1554
+ ticker_type=ticker_type_list[1])
1555
+ pltdf2.rename(columns={list(pltdf2)[0]:measure1},inplace=True)
1556
+ pltdf2['ticker']=ticker2
1557
+
1558
+ #绘制双证券单指标对比图
1559
+ if graph:
1560
+
1561
+ comp_2securities_1measure(pltdf1,pltdf2,measure1,twinx=twinx, \
1562
+ loc1=loc1,loc2=loc2,graph=graph, \
1563
+ ticker_type=ticker_type_list,facecolor=facecolor)
1564
+
1565
+ try:
1566
+ result1=pltdf1[[measure1]]
1567
+ result2=pltdf2[[measure1]]
1568
+ except:
1569
+ print(" #Error(compare_secuirty): measure",measure1,"not found")
1570
+ return None,None
1571
+ else:
1572
+ return result1,result2
1573
+
1574
+ else:
1575
+ print(" #Error(compare_secuirty):no idea on what to compare.")
1576
+ return None,None
1577
+
1578
+ return result1,result2
1579
+
1580
+
1426
1581
  #==============================================================================
1582
+ if __name__ =="__main__":
1583
+ tickers=['MSFT','AAPL']
1584
+ measures='Annual Ret Volatility%'
1585
+ fromdate='2023-1-1'
1586
+ todate='2023-12-31'
1587
+ adjust=''
1588
+ twinx=False
1589
+ loc1='best'
1590
+ loc2='lower left'
1591
+ graph=True
1592
+ source='auto'
1593
+ ticker_type='auto'
1594
+ facecolor='whitesmoke'
1595
+
1596
+
1427
1597
  def compare_stock(tickers,measures,fromdate,todate, \
1428
1598
  adjust='', \
1429
1599
  twinx=False, \
@@ -1442,6 +1612,8 @@ def compare_stock(tickers,measures,fromdate,todate, \
1442
1612
  开始日期fromdate,结束日期todate。
1443
1613
  输出:绘制证券价格折线图,手动指定是否使用单轴或双轴坐标。
1444
1614
  返回:无
1615
+
1616
+ 打算废弃?
1445
1617
  """
1446
1618
  #调试开关
1447
1619
  DEBUG=False
@@ -1479,27 +1651,30 @@ def compare_stock(tickers,measures,fromdate,todate, \
1479
1651
  if measure_num >= 1: measure1 = measures[0]
1480
1652
  if measure_num >= 2: measure2 = measures[1]
1481
1653
 
1654
+ #延伸开始日期
1655
+ fromdate1=date_adjust(fromdate,adjust=-365)
1656
+
1482
1657
  #单一证券代码+两个测度指标
1483
1658
  if (security_num == 1) and (measure_num >= 2):
1484
1659
  if (('Adj' in measure1) or ('Adj' in measure2)) and (adjust ==''):
1485
1660
  adjust='qfq'
1486
1661
 
1487
1662
  #证券ticker1:抓取行情,并计算其各种期间的收益率
1488
- df1a=stock_ret(ticker1,fromdate,todate,adjust=adjust,graph=False,source=source,ticker_type=ticker_type)
1663
+ df1a=stock_ret(ticker1,fromdate1,todate,adjust=adjust,graph=False,source=source,ticker_type=ticker_type)
1489
1664
  if df1a is None: return None,None
1490
1665
  if DEBUG: print("compare|df1a first date:",df1a.index[0])
1491
1666
  #加入价格波动指标
1492
- df1b=price_volatility2(df1a,ticker1,fromdate,todate,graph=False,ticker_type=ticker_type)
1667
+ df1b=price_volatility2(df1a,ticker1,fromdate1,todate,graph=False,ticker_type=ticker_type)
1493
1668
  if DEBUG: print("compare|df1b first date:",df1b.index[0])
1494
1669
  #加入收益率波动指标
1495
- df1c=ret_volatility2(df1b,ticker1,fromdate,todate,graph=False,ticker_type=ticker_type)
1670
+ df1c=ret_volatility2(df1b,ticker1,fromdate1,todate,graph=False,ticker_type=ticker_type)
1496
1671
  if DEBUG: print("compare|df1c first date:",df1c.index[0])
1497
1672
  #加入收益率下偏标准差指标
1498
- df1d=ret_lpsd2(df1c,ticker1,fromdate,todate,graph=False,ticker_type=ticker_type)
1673
+ df1d=ret_lpsd2(df1c,ticker1,fromdate1,todate,graph=False,ticker_type=ticker_type)
1499
1674
  if DEBUG: print("compare|df1d first date:",df1d.index[0])
1500
1675
 
1501
1676
  #去掉开始日期以前的数据
1502
- pltdf1=df1d[df1d.index >= fromdate]
1677
+ pltdf1=df1d[df1d.index >= fromdate1]
1503
1678
  #绘制单个证券的双指标对比图
1504
1679
  if graph:
1505
1680
  comp_1security_2measures(pltdf1,measure1,measure2,twinx=twinx, \
@@ -1531,24 +1706,24 @@ def compare_stock(tickers,measures,fromdate,todate, \
1531
1706
  ticker_type_list=[ticker_type1,ticker_type2]
1532
1707
 
1533
1708
  #证券ticker1:抓取行情,并计算其各种期间的收益率
1534
- df1a=stock_ret(ticker1,fromdate,todate,adjust=adjust,graph=False,source=source,ticker_type=ticker_type1)
1709
+ df1a=stock_ret(ticker1,fromdate1,todate,adjust=adjust,graph=False,source=source,ticker_type=ticker_type1)
1535
1710
  if df1a is None: return None,None
1536
1711
  #加入价格波动指标
1537
- df1b=price_volatility2(df1a,ticker1,fromdate,todate,graph=False,ticker_type=ticker_type1)
1712
+ df1b=price_volatility2(df1a,ticker1,fromdate1,todate,graph=False,ticker_type=ticker_type1)
1538
1713
  #加入收益率波动指标
1539
- df1c=ret_volatility2(df1b,ticker1,fromdate,todate,graph=False,ticker_type=ticker_type1)
1714
+ df1c=ret_volatility2(df1b,ticker1,fromdate1,todate,graph=False,ticker_type=ticker_type1)
1540
1715
  #加入收益率下偏标准差指标
1541
- df1d=ret_lpsd2(df1c,ticker1,fromdate,todate,graph=False,ticker_type=ticker_type1)
1716
+ df1d=ret_lpsd2(df1c,ticker1,fromdate1,todate,graph=False,ticker_type=ticker_type1)
1542
1717
  #去掉开始日期以前的数据
1543
- pltdf1=df1d[df1d.index >= fromdate]
1718
+ pltdf1=df1d[df1d.index >= fromdate1]
1544
1719
 
1545
1720
  #证券ticker2:
1546
- df2a=stock_ret(ticker2,fromdate,todate,adjust=adjust,graph=False,source=source,ticker_type=ticker_type2)
1721
+ df2a=stock_ret(ticker2,fromdate1,todate,adjust=adjust,graph=False,source=source,ticker_type=ticker_type2)
1547
1722
  if df2a is None: return None,None
1548
- df2b=price_volatility2(df2a,ticker2,fromdate,todate,graph=False,ticker_type=ticker_type2)
1549
- df2c=ret_volatility2(df2b,ticker2,fromdate,todate,graph=False,ticker_type=ticker_type2)
1550
- df2d=ret_lpsd2(df2c,ticker2,fromdate,todate,graph=False,ticker_type=ticker_type2)
1551
- pltdf2=df2d[df2d.index >= fromdate]
1723
+ df2b=price_volatility2(df2a,ticker2,fromdate1,todate,graph=False,ticker_type=ticker_type2)
1724
+ df2c=ret_volatility2(df2b,ticker2,fromdate1,todate,graph=False,ticker_type=ticker_type2)
1725
+ df2d=ret_lpsd2(df2c,ticker2,fromdate1,todate,graph=False,ticker_type=ticker_type2)
1726
+ pltdf2=df2d[df2d.index >= fromdate1]
1552
1727
 
1553
1728
  #绘制双证券单指标对比图
1554
1729
  if graph:
@@ -1647,16 +1822,19 @@ def compare_msecurity(tickers,measure,start,end, \
1647
1822
  # 应对导入失灵的函数
1648
1823
  from siat.common import upper_ticker
1649
1824
  tickers=upper_ticker(tickers)
1825
+ if not isinstance(tickers,list):
1826
+ tickers=[tickers]
1827
+
1650
1828
  # 去掉重复代码:有必要,重复代码将导致后续处理出错KeyError: 0!
1651
1829
  tickers=list(set(tickers))
1830
+ """
1652
1831
  num=len(tickers)
1653
1832
  if num <2:
1654
1833
  print(" #Error(compare_msecurity): need more tickers")
1655
1834
  return None
1656
-
1657
- if not isinstance(measure,str):
1658
- print(" #Error(compare_msecurity): support only one measure")
1659
- return None
1835
+ """
1836
+ if isinstance(measure,list):
1837
+ measure=measure[0]
1660
1838
 
1661
1839
  print(" Searching for multiple security for",measure,"...")
1662
1840
  #屏蔽函数内print信息输出的类
@@ -2329,7 +2507,10 @@ def stock_dividend(ticker,start,end,facecolor='whitesmoke',fontcolor='black'):
2329
2507
  divdf['Weekdayiso']= divdf['Index Date'].apply(weekdayfmt)
2330
2508
  #wdlist=['Mon','Tue','Wed','Thu','Fri','Sat','Sun']
2331
2509
  #wdlist=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
2332
- wdlist=['星期一','星期二','星期三','星期四','星期五','星期六','星期日']
2510
+ #wdlist=['星期一','星期二','星期三','星期四','星期五','星期六','星期日']
2511
+ wdlist=[text_lang('星期一','Mon'),text_lang('星期二','Tue'),text_lang('星期三','Wed'), \
2512
+ text_lang('星期四','Thu'),text_lang('星期五','Fri'),text_lang('星期六','Sat'),text_lang('星期日','Sun')]
2513
+
2333
2514
  wdfmt=lambda x : wdlist[x-1]
2334
2515
  divdf['Weekday']= divdf['Weekdayiso'].apply(wdfmt)
2335
2516
 
@@ -2343,20 +2524,13 @@ def stock_dividend(ticker,start,end,facecolor='whitesmoke',fontcolor='black'):
2343
2524
  fromdatey2md=startdt.strftime('%y/%m/%d')
2344
2525
  todatey2md=enddt.strftime('%y/%m/%d')
2345
2526
 
2346
- if lang == 'English':
2347
- titletxt=texttranslate("股票分红历史")+': '+tname
2348
- periodtxt=texttranslate("历史期间:")+' '+fromdatey2md+"-"+todatey2md
2349
- sourcetxt=texttranslate("数据来源: 雅虎财经,")
2350
-
2351
- #修改列命为英文
2352
- divprt.columns = [texttranslate('序号'),texttranslate('日期'),texttranslate('星期'),texttranslate('股息')]
2353
- else:
2354
- titletxt="股票分红历史:"+tname
2355
- periodtxt="期间: "+fromdatey2md+"-"+todatey2md
2356
- sourcetxt="数据来源: 雅虎,"
2357
-
2358
- #修改列命为中文
2359
- divprt.columns = ['序号','日期','星期','每股派息']
2527
+ titletxt=text_lang("股票分红历史","Stock Dividend")+': '+tname
2528
+ periodtxt=text_lang("历史期间:","Period:")+' '+fromdatey2md+"-"+todatey2md
2529
+ sourcetxt=text_lang("数据来源: 雅虎财经,","Data source: Yahoo Finance,")
2530
+
2531
+ #修改列命为英文
2532
+ divprt.columns = [text_lang('序号','No.'),text_lang('日期','Date'),text_lang('星期','Weekday'),text_lang('股息','Dividend')]
2533
+
2360
2534
  """
2361
2535
  print(divprt.to_string(index=False))
2362
2536
  """
@@ -2454,7 +2628,8 @@ def stock_split(ticker,start,end,facecolor='whitesmoke',fontcolor='black'):
2454
2628
  weekdayfmt=lambda x : x.isoweekday()
2455
2629
  divdf['Weekdayiso']= divdf['Index Date'].apply(weekdayfmt)
2456
2630
  #wdlist=['Mon','Tue','Wed','Thu','Fri','Sat','Sun']
2457
- wdlist=['星期一','星期二','星期三','星期四','星期五','星期六','星期日']
2631
+ wdlist=[text_lang('星期一','Mon'),text_lang('星期二','Tue'),text_lang('星期三','Wed'), \
2632
+ text_lang('星期四','Thu'),text_lang('星期五','Fri'),text_lang('星期六','Sat'),text_lang('星期日','Sun')]
2458
2633
  wdfmt=lambda x : wdlist[x-1]
2459
2634
  divdf['Weekday']= divdf['Weekdayiso'].apply(wdfmt)
2460
2635
 
@@ -2495,25 +2670,25 @@ def stock_split(ticker,start,end,facecolor='whitesmoke',fontcolor='black'):
2495
2670
  fromdatey2md=startdt.strftime('%y/%m/%d')
2496
2671
  todatey2md=enddt.strftime('%y/%m/%d')
2497
2672
 
2498
- if lang == 'English':
2499
- titletxt=texttranslate("股票分拆历史")+': '+tname
2500
- periodtxt=texttranslate("历史期间:")+' '+fromdatey2md+"-"+todatey2md
2501
- sourcetxt=texttranslate("数据来源: 雅虎财经,")
2502
-
2503
- #修改列命为英文
2504
- divprt.columns = [texttranslate('序号'),texttranslate('日期'),texttranslate('星期'),texttranslate('股息')]
2505
- else:
2506
- titletxt="股票分拆历史:"+tname
2507
- periodtxt="期间: "+fromdatey2md+"-"+todatey2md
2508
- sourcetxt="数据来源: 雅虎,"
2509
-
2510
- #修改列命为中文
2511
- divprt.columns = ['序号','日期','星期','分拆比例']
2673
+ titletxt=text_lang("股票分拆历史","Stock Split")+': '+tname
2674
+ periodtxt=text_lang("历史期间:","Period:")+' '+fromdatey2md+"-"+todatey2md
2675
+
2676
+ import datetime; todaydt=datetime.date.today(); todayy2md=str(todaydt.strftime('%y/%m/%d'))
2677
+ #sourcetxt=text_lang("数据来源: 雅虎财经, ","Data source: Yahoo Finance, ")+todayy2md
2678
+ sourcetxt=text_lang("数据来源: 雅虎财经","Data source: Yahoo Finance")
2679
+ footnote=periodtxt+'\n'+ sourcetxt
2680
+
2681
+ #修改列命为英文
2682
+ divprt.columns = [text_lang('序号','No.'),text_lang('日期','Date'),text_lang('星期','Weekday'),text_lang('分拆比例','Split Ratio')]
2512
2683
  """
2513
2684
  print(divprt.to_string(index=False))
2514
2685
  """
2515
2686
  print(' ') #空一行
2516
2687
 
2688
+ df_display_CSS(divprt,titletxt=titletxt,footnote=footnote,facecolor='papayawhip',decimals=2, \
2689
+ first_col_align='center',second_col_align='center', \
2690
+ last_col_align='right',other_col_align='center')
2691
+ """
2517
2692
  disph=divprt.style.hide() #不显示索引列
2518
2693
  dispp=disph.format(precision=4) #设置带有小数点的列精度调整为小数点后2位
2519
2694
  #设置标题/列名
@@ -2534,6 +2709,7 @@ def stock_split(ticker,start,end,facecolor='whitesmoke',fontcolor='black'):
2534
2709
  import datetime; todaydt=datetime.date.today(); todayy2md=todaydt.strftime('%y/%m/%d')
2535
2710
  #print('\n*** '+sourcetxt,today)
2536
2711
  print(sourcetxt,todayy2md)
2712
+ """
2537
2713
 
2538
2714
  return divdf
2539
2715
 
siat/translate.py CHANGED
@@ -58,9 +58,9 @@ def ectranslate_c(eword):
58
58
  ['Quarterly Ret%','季度收益率%'],['Quarterly Adj Ret','季度调整收益率'],
59
59
  ['Quarterly Adj Ret%','季度调整收益率%'],['Annual Ret','年收益率'],
60
60
  ['Annual Ret%','年收益率%'],['Annual Adj Ret','年调整收益率'],
61
- ['Annual Adj Ret%','年调整收益率%'],['Exp Ret','投资收益率'],
62
- ['Exp Ret%','投资收益率%'],['Exp Adj Ret','持有调整收益率'],
63
- ['Exp Adj Ret%','持有调整收益率%'],
61
+ ['Annual Adj Ret%','年调整收益率%'],['Exp Ret','持有期资本利得率'],
62
+ ['Exp Ret%','持有期资本利得%'],['Exp Adj Ret','持有期收益率'],
63
+ ['Exp Adj Ret%','持有期收益率%'],
64
64
 
65
65
  ['Weekly Price Volatility','周股价波动风险'],
66
66
  ['Weekly Adj Price Volatility','周调整股价波动风险'],
@@ -70,8 +70,8 @@ def ectranslate_c(eword):
70
70
  ['Quarterly Adj Price Volatility','季调整股价波动风险'],
71
71
  ['Annual Price Volatility','年股价波动风险'],
72
72
  ['Annual Adj Price Volatility','年调整股价波动风险'],
73
- ['Exp Price Volatility','持有股价波动风险'],
74
- ['Exp Adj Price Volatility','持有调整股价波动风险'],
73
+ ['Exp Price Volatility','持有期股价波动风险'],
74
+ ['Exp Adj Price Volatility','持有期复权价波动风险'],
75
75
 
76
76
  ['Weekly Ret Volatility','周收益率波动风险'],
77
77
  ['Weekly Ret Volatility%','周收益率波动风险%'],
@@ -89,31 +89,31 @@ def ectranslate_c(eword):
89
89
  ['Annual Ret Volatility%','年收益率波动风险%'],
90
90
  ['Annual Adj Ret Volatility','年调整收益率波动风险'],
91
91
  ['Annual Adj Ret Volatility%','年调整收益率波动风险%'],
92
- ['Exp Ret Volatility','投资收益率波动风险'],
93
- ['Exp Ret Volatility%','投资收益率波动风险%'],
94
- ['Exp Adj Ret Volatility','调整投资收益率波动风险'],
95
- ['Exp Adj Ret Volatility%','调整投资收益率波动风险%'],
96
-
97
- ['Weekly Ret LPSD','周收益率波动损失风险'],
98
- ['Weekly Ret LPSD%','周收益率波动损失风险%'],
99
- ['Weekly Adj Ret LPSD','周调整收益率波动损失风险'],
100
- ['Weekly Adj Ret LPSD%','周调整收益率波动损失风险%'],
101
- ['Monthly Ret LPSD','月收益率波动损失风险'],
102
- ['Monthly Ret LPSD%','月收益率波动损失风险%'],
103
- ['Monthly Adj Ret LPSD','月调整收益波动损失风险'],
104
- ['Monthly Adj Ret LPSD%','月调整收益波动损失风险%'],
105
- ['Quarterly Ret LPSD','季收益率波动损失风险'],
106
- ['Quarterly Ret LPSD%','季收益率波动损失风险%'],
107
- ['Quarterly Adj Ret LPSD','季调整收益率波动损失风险'],
108
- ['Quarterly Adj Ret LPSD%','季调整收益率波动损失风险%'],
109
- ['Annual Ret LPSD','年收益率波动损失风险'],
110
- ['Annual Ret LPSD%','年收益率波动损失风险%'],
111
- ['Annual Adj Ret LPSD','年调整收益率波动损失风险'],
112
- ['Annual Adj Ret LPSD%','年调整收益率波动损失风险%'],
113
- ['Exp Ret LPSD','投资损失风险'],
114
- ['Exp Ret LPSD%','投资损失风险%'],
115
- ['Exp Adj Ret LPSD','调整投资损失风险'],
116
- ['Exp Adj Ret LPSD%','调整投资损失风险%'],
92
+ ['Exp Ret Volatility','持有期资本利得风险'],
93
+ ['Exp Ret Volatility%','持有期资本利得风险%'],
94
+ ['Exp Adj Ret Volatility','持有期收益率风险'],
95
+ ['Exp Adj Ret Volatility%','持有期收益率风险%'],
96
+
97
+ ['Weekly Ret LPSD','周收益损失风险'],
98
+ ['Weekly Ret LPSD%','周收益损失风险%'],
99
+ ['Weekly Adj Ret LPSD','周复权收益损失风险'],
100
+ ['Weekly Adj Ret LPSD%','周复权收益损失风险%'],
101
+ ['Monthly Ret LPSD','月收益损失风险'],
102
+ ['Monthly Ret LPSD%','月收益损失风险%'],
103
+ ['Monthly Adj Ret LPSD','月复权收益损失风险'],
104
+ ['Monthly Adj Ret LPSD%','月复权收益损失风险%'],
105
+ ['Quarterly Ret LPSD','季收益损失风险'],
106
+ ['Quarterly Ret LPSD%','季收益损失风险%'],
107
+ ['Quarterly Adj Ret LPSD','季复权收益损失风险'],
108
+ ['Quarterly Adj Ret LPSD%','季复权收益损失风险%'],
109
+ ['Annual Ret LPSD','年收益损失风险'],
110
+ ['Annual Ret LPSD%','年收益损失风险%'],
111
+ ['Annual Adj Ret LPSD','年复权收益损失风险'],
112
+ ['Annual Adj Ret LPSD%','年复权收益损失风险%'],
113
+ ['Exp Ret LPSD','持有期资本损失风险'],
114
+ ['Exp Ret LPSD%','持有期资本损失风险%'],
115
+ ['Exp Adj Ret LPSD','持有期收益损失风险'],
116
+ ['Exp Adj Ret LPSD%','持有期收益损失风险%'],
117
117
 
118
118
  ['roll_spread','罗尔价差比率'],['amihud_illiquidity','阿米胡德非流动性'],
119
119
  ['ps_liquidity','P-S流动性'],
@@ -353,9 +353,9 @@ def ectranslate_e(eword):
353
353
  ['Quarterly Ret%','Quarterly Return%'],['Quarterly Adj Ret','Quarterly Adjusted Return'],
354
354
  ['Quarterly Adj Ret%','Quarterly Adjusted Return%'],['Annual Ret','Annual Return'],
355
355
  ['Annual Ret%','Annual Return%'],['Annual Adj Ret','Annual Adjusted Return'],
356
- ['Annual Adj Ret%','Annual Adjusted Return%'],['Exp Ret','Holding Return'],
357
- ['Exp Ret%','Holding Return%'],['Exp Adj Ret','Holding Adjusted Return'],
358
- ['Exp Adj Ret%','Holding Adjusted Return%'],
356
+ ['Annual Adj Ret%','Annual Adjusted Return%'],['Exp Ret','Holding Period Capital Gain Rate'],
357
+ ['Exp Ret%','Holding Period Capital Gain%'],['Exp Adj Ret','Holding Period Return'],
358
+ ['Exp Adj Ret%','Holding Period Return%'],
359
359
 
360
360
  ['Weekly Price Volatility','Weekly Price Volatility'],
361
361
  ['Weekly Adj Price Volatility','Weekly Adjusted Price Volatility'],
@@ -384,31 +384,31 @@ def ectranslate_e(eword):
384
384
  ['Annual Ret Volatility%','Annual Return Volatility%'],
385
385
  ['Annual Adj Ret Volatility','Annual Adjusted Return Volatility'],
386
386
  ['Annual Adj Ret Volatility%','Annual Adjusted Return Volatility%'],
387
- ['Exp Ret Volatility','Holding Return Volatility'],
388
- ['Exp Ret Volatility%','Holding Return Volatility%'],
389
- ['Exp Adj Ret Volatility','Holding Adjusted Return Volatility'],
390
- ['Exp Adj Ret Volatility%','Holding Adjusted Return Volatility%'],
391
-
392
- ['Weekly Ret LPSD','Weekly Return LPSD'],
393
- ['Weekly Ret LPSD%','Weekly Return LPSD%'],
394
- ['Weekly Adj Ret LPSD','Weekly Adjusted Return LPSD'],
395
- ['Weekly Adj Ret LPSD%','Weekly Adjusted Return LPSD%'],
396
- ['Monthly Ret LPSD','Monthly Return LPSD'],
397
- ['Monthly Ret LPSD%','Monthly Return LPSD%'],
398
- ['Monthly Adj Ret LPSD','Monthly Adjusted Return LPSD'],
399
- ['Monthly Adj Ret LPSD%','Monthly Adjusted Return LPSD%'],
400
- ['Quarterly Ret LPSD','Quarterly Return LPSD'],
401
- ['Quarterly Ret LPSD%','Quarterly Return LPSD%'],
402
- ['Quarterly Adj Ret LPSD','Quarterly Adjusted Return LPSD'],
403
- ['Quarterly Adj Ret LPSD%','Quarterly Adjusted Return LPSD%'],
404
- ['Annual Ret LPSD','Annual Return LPSD'],
405
- ['Annual Ret LPSD%','Annual Return LPSD%'],
406
- ['Annual Adj Ret LPSD','Annual Adjusted Return LPSD'],
407
- ['Annual Adj Ret LPSD%','Annual Adjusted Return LPSD%'],
408
- ['Exp Ret LPSD','Holding Return LPSD'],
409
- ['Exp Ret LPSD%','Holding Return LPSD%'],
410
- ['Exp Adj Ret LPSD','Holding Adjusted Return LPSD'],
411
- ['Exp Adj Ret LPSD%','Holding Adjusted Return LPSD%'],
387
+ ['Exp Ret Volatility','Holding Period Capital Gain Volatility'],
388
+ ['Exp Ret Volatility%','Holding Period Capital Gain Volatility%'],
389
+ ['Exp Adj Ret Volatility','Holding Period Return Volatility'],
390
+ ['Exp Adj Ret Volatility%','Holding Period Return Volatility%'],
391
+
392
+ ['Weekly Ret LPSD','Weekly Loss Risk'],
393
+ ['Weekly Ret LPSD%','Weekly Loss Risk%'],
394
+ ['Weekly Adj Ret LPSD','Weekly Adjusted Loss Risk'],
395
+ ['Weekly Adj Ret LPSD%','Weekly Adjusted Loss Risk%'],
396
+ ['Monthly Ret LPSD','Monthly Loss Risk'],
397
+ ['Monthly Ret LPSD%','Monthly Loss Risk%'],
398
+ ['Monthly Adj Ret LPSD','Monthly Adjusted Loss Risk'],
399
+ ['Monthly Adj Ret LPSD%','Monthly Adjusted Loss Risk%'],
400
+ ['Quarterly Ret LPSD','Quarterly Loss Risk'],
401
+ ['Quarterly Ret LPSD%','Quarterly Loss Risk%'],
402
+ ['Quarterly Adj Ret LPSD','Quarterly Adjusted Loss Risk'],
403
+ ['Quarterly Adj Ret LPSD%','Quarterly Adjusted Loss Risk%'],
404
+ ['Annual Ret LPSD','Annual Loss Risk'],
405
+ ['Annual Ret LPSD%','Annual Loss Risk%'],
406
+ ['Annual Adj Ret LPSD','Annual Adjusted Loss Risk'],
407
+ ['Annual Adj Ret LPSD%','Annual Adjusted Loss Risk%'],
408
+ ['Exp Ret LPSD','Holding Period Capital Loss Risk'],
409
+ ['Exp Ret LPSD%','Holding Period Capital Loss Risk%'],
410
+ ['Exp Adj Ret LPSD','Holding Period Loss Risk'],
411
+ ['Exp Adj Ret LPSD%','Holding Period Loss Risk%'],
412
412
 
413
413
  ['roll_spread','Roll Spread'],['amihud_illiquidity','Amihud Illiquidity'],
414
414
  ['ps_liquidity','P-S Liquidity'],
@@ -607,8 +607,12 @@ def codetranslate(codelist):
607
607
  #==============================================================================
608
608
  if __name__=='__main__':
609
609
  codelist=['601398.SS','01398.HK']
610
+ codelist='PDD'
611
+
610
612
  code='601398.SS'
611
613
  code='01398.HK'
614
+
615
+ codetranslate_e(codelist)
612
616
 
613
617
  #在common中定义
614
618
  #SUFFIX_LIST_CN=['SS','SZ','BJ','NQ']
@@ -1813,7 +1817,7 @@ def codetranslate1(code):
1813
1817
  ['EBAY','eBay'],['eBay','eBay'],['META','META'],['ZM','ZOOM'],
1814
1818
  ['GOOG','Google'],['TWTR','Twitter'],
1815
1819
  ['VIPS','Vipshop'],['Vipshop','Vipshop'],
1816
- ['PDD','Pinduoduo'],['Pinduoduo','Pinduoduo'],
1820
+ ['PDD','PDD(US)'],['Pinduoduo','Pinduoduo'],
1817
1821
  ['BABA','Alibaba(US)'],['Alibaba','Alibaba'],
1818
1822
  ['JD','JD(US)'],
1819
1823
  ['SINA','Sina'],['BIDU','Baidu'],['NTES','Netease'],
@@ -1967,9 +1971,10 @@ def codetranslate1(code):
1967
1971
  ['000022.SS','SSE Corpbond Index'],['000061.SS','SSE Entbond30 Index'],
1968
1972
  ['000116.SS','SSE Creditbond100 Index'],['000101.SS','SSE 5-year Creditbond Index'],
1969
1973
 
1970
- ['002594.SZ','BYD Auto (A)'],['01211.HK','BYD Auto (HK)'],['81211.HK','BYD Auto (HK RMB)'],
1974
+ ['002594.SZ','BYD Auto(A)'],['01211.HK','BYD Auto(HK)'],['81211.HK','BYD Auto(HK RMB)'],
1971
1975
  ['600941.SS','China Mobile'],['00941.HK','China Mobile (HK)'],['80941.HK','China Mobile (HK RMB)'],
1972
1976
  ['ULVR.UK','Unilever (UK)'],['605011.SS','Hangzou Power'],['000723.SZ','Meijin Energy'],
1977
+ ['EL','Estee Lauder'],['LOR.DE','L\'Oreal(DE)'],
1973
1978
 
1974
1979
  ['^GSPC','S&P500 Index'],['^DJI','Dow Jones Index'],
1975
1980
  ['WISGP.SI','FTSE Singapore Index'], ['^STI','Straits Times Index'],
@@ -1977,6 +1982,7 @@ def codetranslate1(code):
1977
1982
  ['^N100','Euronext 100 Index'],['^FMIB','FTSE Italy Index'],
1978
1983
  ['^TSX','Toronto Composite Index'],['^MXX','Mexico IPC Index'],
1979
1984
  ['^SNX','India SENSEX 30 Index'],['^FTM','UK FTSE 250 Index'],
1985
+ ['^KLCI','Kuala Lumpur Composite Index'],['^KLSE','Kuala Lumpur Composite Index'],
1980
1986
 
1981
1987
  ['FVTT.FGI','FTSE Viernam Index'],['^RUT','Russell 2000 Index'],
1982
1988
  ['^HSI','Hang Seng Index'],['^N225','Nikkei 225 Index'],
@@ -2218,6 +2224,8 @@ def get_names(symbol):
2218
2224
  if __name__=='__main__':
2219
2225
  symbol='00700.HK'
2220
2226
  symbol='001979.SZ'
2227
+ symbol='PDD'
2228
+
2221
2229
  get_names0(symbol)
2222
2230
 
2223
2231
  def get_names0(symbol):
@@ -2755,7 +2763,7 @@ def texttranslate(code):
2755
2763
  ['数据来源: 新浪/stooq,','Source: sina/stooq,'],['数据来源: 雅虎财经,','Source: Yahoo Finance,'],
2756
2764
  ["证券快照:","证券快照:"],
2757
2765
  ["证券价格走势图:","证券价格走势图:"],
2758
- ["证券收益率波动损失风险走势图:","证券收益率波动损失风险走势图:"],
2766
+ ["证券收益率损失风险走势图:","证券收益率损失风险走势图:"],
2759
2767
  ["证券指标走势对比图:","证券指标走势对比图:"],
2760
2768
  ["证券价格走势蜡烛图演示:","证券价格走势蜡烛图演示:"],
2761
2769
  ["股票分红历史","Stock Dividend History"],
@@ -3213,6 +3221,7 @@ if __name__=='__main__':
3213
3221
  ticker='010107.SS' #债券/基金重码
3214
3222
  ticker='sh010303' #国债/基金重码
3215
3223
  ticker='sh018001' #金融债
3224
+ ticker='PDD'
3216
3225
 
3217
3226
  ticker_type='auto'
3218
3227
  ticker_type='bond'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: siat
3
- Version: 3.2.42
3
+ Version: 3.2.46
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
@@ -33,6 +33,7 @@ Requires-Dist: luddite
33
33
  Requires-Dist: pendulum
34
34
  Requires-Dist: itables
35
35
  Requires-Dist: py-trans
36
+ Requires-Dist: bottleneck
36
37
 
37
38
  # Welcome to the Magic World of siat
38
39
 
@@ -18,7 +18,7 @@ siat/capm_beta.py,sha256=cxXdRVBQBllhbfz1LeTJAIWvyRYhW54nhtNUXv4HwS0,29063
18
18
  siat/capm_beta2.py,sha256=07y3q4nJdkM-anpZepj4gK0gvTKj-BB0ppDDI5-TCcY,26904
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=_PkuAzT9fNJazC1p3NIQDqLduzfBFcLsV3KPteo377I,149963
21
+ siat/common.py,sha256=bag64Mm_b09lxtnlvtQnIMeTtjNFZlzjShRxr5m3OwI,150142
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
@@ -60,13 +60,13 @@ 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=yQF04A_a0I5D14hj3UjpsK-9pc48474OpN5n7MSBaY0,87137
63
+ siat/grafix.py,sha256=W5I4IdOm9q7CdDHFSv6xFmfk9sPZXItXC4cCvp2q6mU,87137
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
67
67
  siat/local_debug_test.py,sha256=CDAOffW1Rvs-TcNN5giWVvHMlch1w4dp-w5SIV9jXL0,3936
68
68
  siat/luchy_draw.py,sha256=CESMhLYcsC6UtYfTZOfYnVQ84zz1MnXRN81P7OZHEgE,20516
69
- siat/market_china.py,sha256=hKoTLUyHuzsuG2L3_IuLx_utTKqS-__mZ63wrElh65U,45943
69
+ siat/market_china.py,sha256=EOO-RvdnzJThTrgNHWW3TlWhx4k4rfdjbooOnQsYdQU,50299
70
70
  siat/markowitz.py,sha256=glHikhabFAF6Hb6df1pYfhkxid2IZXBYAVQng5wd9Wk,97526
71
71
  siat/markowitz2-20240620.py,sha256=irZAPnjaatFsKQmFRMENP-cO6bEUl2narYtkU5NKTWI,108019
72
72
  siat/markowitz2.py,sha256=csHIjqTbIsHMYQ_LEur9K0Jg8pOm8deEVdQfAGCOG5o,111461
@@ -98,14 +98,14 @@ siat/sector_china.py,sha256=nP6kfYsnaQWZj8dK-zklwSDW8FDS-obZWp_zL0ec2Ig,118603
98
98
  siat/sector_china_test.py,sha256=1wq7ef8Bb_L8F0h0W6FvyBrIcBTEbrTV7hljtpj49U4,5843
99
99
  siat/security_price.py,sha256=2oHskgiw41KMGfqtnA0i2YjNNV6cYgtlUK0j3YeuXWs,29185
100
100
  siat/security_price2.py,sha256=NKlk5VRA-WeSK8dU960PRfWUOzj4BQ4HbUw3t4j9cv8,25955
101
- siat/security_prices.py,sha256=ChiVcubRiPzUvYm8a5X5qjxWtawRQdYHFQXLIevGFC4,105328
101
+ siat/security_prices.py,sha256=E4lYVHKtepPS_oymYHUKn2tZj-LyFa-hMMPNgdbvTj0,105569
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
105
  siat/security_trend2.py,sha256=WOygSyWSynNmk5gpOA8n1738-nWqfDzuyMjwriB3eP4,25284
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=lk3Cvbm2ieFk-ISoy2nX0rEoqnnAGuX3lNiT6iskTjg,143914
108
+ siat/stock.py,sha256=klgcv0v54uDN7iEg1NXhM08qDOS1G54wyquTQBJodFM,150367
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
@@ -131,14 +131,14 @@ siat/transaction_test.py,sha256=Z8g1LJCN4-mnUByXMUMoFmN0t105cbmsz2QmvSuIkbU,1858
131
131
  siat/translate-20230125.py,sha256=NPPSXhT38s5t9fzMvl_fvi4ckSB73ThLmZetVI-xGdU,117953
132
132
  siat/translate-20230206.py,sha256=-vtI125WyaJhmPotOpDAmclt_XnYVaWU9ByLWZ6FyYE,118133
133
133
  siat/translate-20230215.py,sha256=TJgtPE3n8IjljmZ4Pefy8dmHoNdFF-1zpML6BhA9FKE,121657
134
- siat/translate.py,sha256=YoC7OzzGUxT-7EEIU-GYWz0A9CBQ4aIQjlparfVJYSQ,216156
134
+ siat/translate.py,sha256=5o7hSMeNOdyenqiyB5oZwFvIpFvt3yGgp25KZNbqy9o,216309
135
135
  siat/translate_20240606.py,sha256=63IyHWEU3Uz9mjwyuAX3fqY4nUMdwh0ICQAgmgPXP7Y,215121
136
136
  siat/universal_test.py,sha256=CDAOffW1Rvs-TcNN5giWVvHMlch1w4dp-w5SIV9jXL0,3936
137
137
  siat/valuation.py,sha256=NKfeZMdDJOW42oLVHob6eSVBXUqlN1OCnnzwyGAst8c,48855
138
138
  siat/valuation_china.py,sha256=EkZQaVkoBjM0c4MCNbaX-bMnlG0e3FXeaWczZDnkptU,67784
139
139
  siat/valuation_market_china_test.py,sha256=gbJ0ioauuo4koTPH6WKUkqcXiQPafnbhU5eKJ6lpdLA,1571
140
140
  siat/var_model_validation.py,sha256=R0caWnuZarrRg9939hxh3vJIIpIyPfvelYmzFNZtPbo,14910
141
- siat-3.2.42.dist-info/METADATA,sha256=o8tnZNRpv0vMzDbsUAvLEyrFxLcFSWk_sOZhxEhV49w,7283
142
- siat-3.2.42.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
143
- siat-3.2.42.dist-info/top_level.txt,sha256=r1cVyL7AIKqeAmEJjNR8FMT20OmEzufDstC2gv3NvEY,5
144
- siat-3.2.42.dist-info/RECORD,,
141
+ siat-3.2.46.dist-info/METADATA,sha256=gZ8jTNIstNWw0UbcwTQ9S41tm9_aUi65_Pqhiu9pH8M,7310
142
+ siat-3.2.46.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
143
+ siat-3.2.46.dist-info/top_level.txt,sha256=r1cVyL7AIKqeAmEJjNR8FMT20OmEzufDstC2gv3NvEY,5
144
+ siat-3.2.46.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.38.4)
2
+ Generator: bdist_wheel (0.41.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5