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 +10 -2
- siat/grafix.py +2 -2
- siat/market_china.py +103 -40
- siat/security_prices.py +7 -7
- siat/stock.py +227 -51
- siat/translate.py +70 -61
- {siat-3.2.42.dist-info → siat-3.2.46.dist-info}/METADATA +2 -1
- {siat-3.2.42.dist-info → siat-3.2.46.dist-info}/RECORD +10 -10
- {siat-3.2.42.dist-info → siat-3.2.46.dist-info}/WHEEL +1 -1
- {siat-3.2.42.dist-info → siat-3.2.46.dist-info}/top_level.txt +0 -0
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'] = ['
|
75
|
-
mpfrc={'font.family': '
|
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):
|
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,
|
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,
|
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,
|
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,
|
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 >=
|
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,
|
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,
|
1712
|
+
df1b=price_volatility2(df1a,ticker1,fromdate1,todate,graph=False,ticker_type=ticker_type1)
|
1538
1713
|
#加入收益率波动指标
|
1539
|
-
df1c=ret_volatility2(df1b,ticker1,
|
1714
|
+
df1c=ret_volatility2(df1b,ticker1,fromdate1,todate,graph=False,ticker_type=ticker_type1)
|
1540
1715
|
#加入收益率下偏标准差指标
|
1541
|
-
df1d=ret_lpsd2(df1c,ticker1,
|
1716
|
+
df1d=ret_lpsd2(df1c,ticker1,fromdate1,todate,graph=False,ticker_type=ticker_type1)
|
1542
1717
|
#去掉开始日期以前的数据
|
1543
|
-
pltdf1=df1d[df1d.index >=
|
1718
|
+
pltdf1=df1d[df1d.index >= fromdate1]
|
1544
1719
|
|
1545
1720
|
#证券ticker2:
|
1546
|
-
df2a=stock_ret(ticker2,
|
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,
|
1549
|
-
df2c=ret_volatility2(df2b,ticker2,
|
1550
|
-
df2d=ret_lpsd2(df2c,ticker2,
|
1551
|
-
pltdf2=df2d[df2d.index >=
|
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
|
1658
|
-
|
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
|
-
|
2347
|
-
|
2348
|
-
|
2349
|
-
|
2350
|
-
|
2351
|
-
|
2352
|
-
|
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
|
-
|
2499
|
-
|
2500
|
-
|
2501
|
-
|
2502
|
-
|
2503
|
-
|
2504
|
-
|
2505
|
-
|
2506
|
-
|
2507
|
-
|
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%','
|
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
|
357
|
-
['Exp Ret%','Holding
|
358
|
-
['Exp Adj Ret%','Holding
|
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
|
388
|
-
['Exp Ret Volatility%','Holding
|
389
|
-
['Exp Adj Ret Volatility','Holding
|
390
|
-
['Exp Adj Ret Volatility%','Holding
|
391
|
-
|
392
|
-
['Weekly Ret LPSD','Weekly
|
393
|
-
['Weekly Ret LPSD%','Weekly
|
394
|
-
['Weekly Adj Ret LPSD','Weekly Adjusted
|
395
|
-
['Weekly Adj Ret LPSD%','Weekly Adjusted
|
396
|
-
['Monthly Ret LPSD','Monthly
|
397
|
-
['Monthly Ret LPSD%','Monthly
|
398
|
-
['Monthly Adj Ret LPSD','Monthly Adjusted
|
399
|
-
['Monthly Adj Ret LPSD%','Monthly Adjusted
|
400
|
-
['Quarterly Ret LPSD','Quarterly
|
401
|
-
['Quarterly Ret LPSD%','Quarterly
|
402
|
-
['Quarterly Adj Ret LPSD','Quarterly Adjusted
|
403
|
-
['Quarterly Adj Ret LPSD%','Quarterly Adjusted
|
404
|
-
['Annual Ret LPSD','Annual
|
405
|
-
['Annual Ret LPSD%','Annual
|
406
|
-
['Annual Adj Ret LPSD','Annual Adjusted
|
407
|
-
['Annual Adj Ret LPSD%','Annual Adjusted
|
408
|
-
['Exp Ret LPSD','Holding
|
409
|
-
['Exp Ret LPSD%','Holding
|
410
|
-
['Exp Adj Ret LPSD','Holding
|
411
|
-
['Exp Adj Ret LPSD%','Holding
|
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','
|
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
|
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.
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
142
|
-
siat-3.2.
|
143
|
-
siat-3.2.
|
144
|
-
siat-3.2.
|
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,,
|
File without changes
|