siat 3.10.131__py3-none-any.whl → 3.10.132__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.
- build/lib/build/lib/siat/__init__.py +75 -0
- build/lib/build/lib/siat/allin.py +137 -0
- build/lib/build/lib/siat/assets_liquidity.py +915 -0
- build/lib/build/lib/siat/beta_adjustment.py +1058 -0
- build/lib/build/lib/siat/beta_adjustment_china.py +548 -0
- build/lib/build/lib/siat/blockchain.py +143 -0
- build/lib/build/lib/siat/bond.py +2900 -0
- build/lib/build/lib/siat/bond_base.py +992 -0
- build/lib/build/lib/siat/bond_china.py +100 -0
- build/lib/build/lib/siat/bond_zh_sina.py +143 -0
- build/lib/build/lib/siat/capm_beta.py +783 -0
- build/lib/build/lib/siat/capm_beta2.py +887 -0
- build/lib/build/lib/siat/common.py +5360 -0
- build/lib/build/lib/siat/compare_cross.py +642 -0
- build/lib/build/lib/siat/copyrights.py +18 -0
- build/lib/build/lib/siat/cryptocurrency.py +667 -0
- build/lib/build/lib/siat/economy.py +1471 -0
- build/lib/build/lib/siat/economy2.py +1853 -0
- build/lib/build/lib/siat/esg.py +536 -0
- build/lib/build/lib/siat/event_study.py +815 -0
- build/lib/build/lib/siat/fama_french.py +1521 -0
- build/lib/build/lib/siat/fin_stmt2_yahoo.py +982 -0
- build/lib/build/lib/siat/financial_base.py +1160 -0
- build/lib/build/lib/siat/financial_statements.py +598 -0
- build/lib/build/lib/siat/financials.py +2339 -0
- build/lib/build/lib/siat/financials2.py +1278 -0
- build/lib/build/lib/siat/financials_china.py +4433 -0
- build/lib/build/lib/siat/financials_china2.py +2212 -0
- build/lib/build/lib/siat/fund.py +629 -0
- build/lib/build/lib/siat/fund_china.py +3307 -0
- build/lib/build/lib/siat/future_china.py +551 -0
- build/lib/build/lib/siat/google_authenticator.py +47 -0
- build/lib/build/lib/siat/grafix.py +3636 -0
- build/lib/build/lib/siat/holding_risk.py +867 -0
- build/lib/build/lib/siat/luchy_draw.py +638 -0
- build/lib/build/lib/siat/market_china.py +1168 -0
- build/lib/build/lib/siat/markowitz.py +2363 -0
- build/lib/build/lib/siat/markowitz2.py +3150 -0
- build/lib/build/lib/siat/markowitz2_20250704.py +2969 -0
- build/lib/build/lib/siat/markowitz2_20250705.py +3158 -0
- build/lib/build/lib/siat/markowitz_simple.py +373 -0
- build/lib/build/lib/siat/ml_cases.py +2291 -0
- build/lib/build/lib/siat/ml_cases_example.py +60 -0
- build/lib/build/lib/siat/option_china.py +3069 -0
- build/lib/build/lib/siat/option_pricing.py +1925 -0
- build/lib/build/lib/siat/other_indexes.py +409 -0
- build/lib/build/lib/siat/risk_adjusted_return.py +1576 -0
- build/lib/build/lib/siat/risk_adjusted_return2.py +1900 -0
- build/lib/build/lib/siat/risk_evaluation.py +2218 -0
- build/lib/build/lib/siat/risk_free_rate.py +351 -0
- build/lib/build/lib/siat/sector_china.py +4140 -0
- build/lib/build/lib/siat/security_price2.py +727 -0
- build/lib/build/lib/siat/security_prices.py +3408 -0
- build/lib/build/lib/siat/security_trend.py +402 -0
- build/lib/build/lib/siat/security_trend2.py +646 -0
- build/lib/build/lib/siat/stock.py +4284 -0
- build/lib/build/lib/siat/stock_advice_linear.py +934 -0
- build/lib/build/lib/siat/stock_base.py +26 -0
- build/lib/build/lib/siat/stock_china.py +2095 -0
- build/lib/build/lib/siat/stock_prices_kneighbors.py +910 -0
- build/lib/build/lib/siat/stock_prices_linear.py +386 -0
- build/lib/build/lib/siat/stock_profile.py +707 -0
- build/lib/build/lib/siat/stock_technical.py +3305 -0
- build/lib/build/lib/siat/stooq.py +74 -0
- build/lib/build/lib/siat/transaction.py +347 -0
- build/lib/build/lib/siat/translate.py +5183 -0
- build/lib/build/lib/siat/valuation.py +1378 -0
- build/lib/build/lib/siat/valuation_china.py +2076 -0
- build/lib/build/lib/siat/var_model_validation.py +444 -0
- build/lib/build/lib/siat/yf_name.py +811 -0
- build/lib/siat/__init__.py +75 -0
- build/lib/siat/allin.py +137 -0
- build/lib/siat/assets_liquidity.py +915 -0
- build/lib/siat/beta_adjustment.py +1058 -0
- build/lib/siat/beta_adjustment_china.py +548 -0
- build/lib/siat/blockchain.py +143 -0
- build/lib/siat/bond.py +2900 -0
- build/lib/siat/bond_base.py +992 -0
- build/lib/siat/bond_china.py +100 -0
- build/lib/siat/bond_zh_sina.py +143 -0
- build/lib/siat/capm_beta.py +783 -0
- build/lib/siat/capm_beta2.py +887 -0
- build/lib/siat/common.py +5360 -0
- build/lib/siat/compare_cross.py +642 -0
- build/lib/siat/copyrights.py +18 -0
- build/lib/siat/cryptocurrency.py +667 -0
- build/lib/siat/economy.py +1471 -0
- build/lib/siat/economy2.py +1853 -0
- build/lib/siat/esg.py +536 -0
- build/lib/siat/event_study.py +815 -0
- build/lib/siat/fama_french.py +1521 -0
- build/lib/siat/fin_stmt2_yahoo.py +982 -0
- build/lib/siat/financial_base.py +1160 -0
- build/lib/siat/financial_statements.py +598 -0
- build/lib/siat/financials.py +2339 -0
- build/lib/siat/financials2.py +1278 -0
- build/lib/siat/financials_china.py +4433 -0
- build/lib/siat/financials_china2.py +2212 -0
- build/lib/siat/fund.py +629 -0
- build/lib/siat/fund_china.py +3307 -0
- build/lib/siat/future_china.py +551 -0
- build/lib/siat/google_authenticator.py +47 -0
- build/lib/siat/grafix.py +3636 -0
- build/lib/siat/holding_risk.py +867 -0
- build/lib/siat/luchy_draw.py +638 -0
- build/lib/siat/market_china.py +1168 -0
- build/lib/siat/markowitz.py +2363 -0
- build/lib/siat/markowitz2.py +3150 -0
- build/lib/siat/markowitz2_20250704.py +2969 -0
- build/lib/siat/markowitz2_20250705.py +3158 -0
- build/lib/siat/markowitz_simple.py +373 -0
- build/lib/siat/ml_cases.py +2291 -0
- build/lib/siat/ml_cases_example.py +60 -0
- build/lib/siat/option_china.py +3069 -0
- build/lib/siat/option_pricing.py +1925 -0
- build/lib/siat/other_indexes.py +409 -0
- build/lib/siat/risk_adjusted_return.py +1576 -0
- build/lib/siat/risk_adjusted_return2.py +1900 -0
- build/lib/siat/risk_evaluation.py +2218 -0
- build/lib/siat/risk_free_rate.py +351 -0
- build/lib/siat/sector_china.py +4140 -0
- build/lib/siat/security_price2.py +727 -0
- build/lib/siat/security_prices.py +3408 -0
- build/lib/siat/security_trend.py +402 -0
- build/lib/siat/security_trend2.py +646 -0
- build/lib/siat/stock.py +4284 -0
- build/lib/siat/stock_advice_linear.py +934 -0
- build/lib/siat/stock_base.py +26 -0
- build/lib/siat/stock_china.py +2095 -0
- build/lib/siat/stock_prices_kneighbors.py +910 -0
- build/lib/siat/stock_prices_linear.py +386 -0
- build/lib/siat/stock_profile.py +707 -0
- build/lib/siat/stock_technical.py +3305 -0
- build/lib/siat/stooq.py +74 -0
- build/lib/siat/transaction.py +347 -0
- build/lib/siat/translate.py +5183 -0
- build/lib/siat/valuation.py +1378 -0
- build/lib/siat/valuation_china.py +2076 -0
- build/lib/siat/var_model_validation.py +444 -0
- build/lib/siat/yf_name.py +811 -0
- siat/__init__.py +0 -0
- siat/allin.py +0 -0
- siat/assets_liquidity.py +0 -0
- siat/beta_adjustment.py +0 -0
- siat/beta_adjustment_china.py +0 -0
- siat/blockchain.py +0 -0
- siat/bond.py +0 -0
- siat/bond_base.py +0 -0
- siat/bond_china.py +0 -0
- siat/bond_zh_sina.py +0 -0
- siat/capm_beta.py +0 -0
- siat/capm_beta2.py +0 -0
- siat/common.py +136 -3
- siat/compare_cross.py +0 -0
- siat/copyrights.py +0 -0
- siat/cryptocurrency.py +0 -0
- siat/economy.py +0 -0
- siat/economy2.py +0 -0
- siat/esg.py +0 -0
- siat/event_study.py +0 -0
- siat/exchange_bond_china.pickle +0 -0
- siat/fama_french.py +0 -0
- siat/fin_stmt2_yahoo.py +0 -0
- siat/financial_base.py +0 -0
- siat/financial_statements.py +0 -0
- siat/financials.py +0 -0
- siat/financials2.py +0 -0
- siat/financials_china.py +0 -0
- siat/financials_china2.py +0 -0
- siat/fund.py +0 -0
- siat/fund_china.pickle +0 -0
- siat/fund_china.py +0 -0
- siat/future_china.py +0 -0
- siat/google_authenticator.py +0 -0
- siat/grafix.py +1 -1
- siat/holding_risk.py +0 -0
- siat/luchy_draw.py +0 -0
- siat/market_china.py +1 -1
- siat/markowitz.py +0 -0
- siat/markowitz2.py +240 -39
- siat/markowitz2_20250704.py +2969 -0
- siat/markowitz2_20250705.py +3158 -0
- siat/markowitz_simple.py +0 -0
- siat/ml_cases.py +0 -0
- siat/ml_cases_example.py +0 -0
- siat/option_china.py +0 -0
- siat/option_pricing.py +0 -0
- siat/other_indexes.py +0 -0
- siat/risk_adjusted_return.py +0 -0
- siat/risk_adjusted_return2.py +0 -0
- siat/risk_evaluation.py +0 -0
- siat/risk_free_rate.py +0 -0
- siat/sector_china.py +0 -0
- siat/security_price2.py +0 -0
- siat/security_prices.py +3 -1
- siat/security_trend.py +0 -0
- siat/security_trend2.py +1 -1
- siat/stock.py +4 -2
- siat/stock_advice_linear.py +0 -0
- siat/stock_base.py +0 -0
- siat/stock_china.py +0 -0
- siat/stock_info.pickle +0 -0
- siat/stock_prices_kneighbors.py +0 -0
- siat/stock_prices_linear.py +0 -0
- siat/stock_profile.py +0 -0
- siat/stock_technical.py +0 -0
- siat/stooq.py +0 -0
- siat/transaction.py +0 -0
- siat/translate.py +11 -11
- siat/valuation.py +0 -0
- siat/valuation_china.py +0 -0
- siat/var_model_validation.py +0 -0
- siat/yf_name.py +0 -0
- {siat-3.10.131.dist-info → siat-3.10.132.dist-info}/METADATA +235 -227
- siat-3.10.132.dist-info/RECORD +218 -0
- {siat-3.10.131.dist-info → siat-3.10.132.dist-info}/WHEEL +1 -1
- {siat-3.10.131.dist-info → siat-3.10.132.dist-info/licenses}/LICENSE +0 -0
- siat-3.10.132.dist-info/top_level.txt +4 -0
- siat-3.10.131.dist-info/RECORD +0 -76
- siat-3.10.131.dist-info/top_level.txt +0 -1
@@ -0,0 +1,707 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
"""
|
3
|
+
本模块功能:
|
4
|
+
所属工具包:提供全球股票基本信息,初版
|
5
|
+
SIAT:Security Investment Analysis Tool
|
6
|
+
创建日期:2020年1月16日
|
7
|
+
最新修订日期:2020年2月4日
|
8
|
+
作者:王德宏 (WANG Dehong, Peter)
|
9
|
+
作者单位:北京外国语大学国际商学院
|
10
|
+
作者邮件:wdehong2000@163.com
|
11
|
+
版权所有:王德宏
|
12
|
+
用途限制:仅限研究与教学使用,不可商用!商用需要额外授权。
|
13
|
+
特别声明:作者不对使用本工具进行证券投资导致的任何损益负责!
|
14
|
+
"""
|
15
|
+
|
16
|
+
#==============================================================================
|
17
|
+
#屏蔽所有警告性信息
|
18
|
+
import warnings; warnings.filterwarnings('ignore')
|
19
|
+
#==============================================================================
|
20
|
+
#以下使用雅虎财经数据源
|
21
|
+
#==============================================================================
|
22
|
+
if __name__ =="__main__":
|
23
|
+
ticker='AAPL'
|
24
|
+
ticker='1398.HK'
|
25
|
+
ticker='601398.SS'
|
26
|
+
ticker='000002.SZ'
|
27
|
+
|
28
|
+
option='basic'
|
29
|
+
option='financial'
|
30
|
+
option='market'
|
31
|
+
|
32
|
+
|
33
|
+
def profile(ticker,option="basic"):
|
34
|
+
"""
|
35
|
+
功能:显示企业基本信息
|
36
|
+
输入:股票代码
|
37
|
+
输出:企业基本信息
|
38
|
+
"""
|
39
|
+
print(".....Searching for company profile of",ticker,".....")
|
40
|
+
|
41
|
+
if not(option in ["basic","financial","market"]):
|
42
|
+
print(".....Valid options: basic, financial, market")
|
43
|
+
return None
|
44
|
+
|
45
|
+
import datetime as dt
|
46
|
+
today=dt.date.today()
|
47
|
+
|
48
|
+
import yfinance as yf
|
49
|
+
firm=yf.Ticker(ticker)
|
50
|
+
|
51
|
+
# get stock info
|
52
|
+
try:
|
53
|
+
i=firm.info
|
54
|
+
except:
|
55
|
+
print("Stock code not found:",ticker)
|
56
|
+
return None
|
57
|
+
|
58
|
+
if option == "basic":
|
59
|
+
print("\n=== Corporate Profile - Basics ===")
|
60
|
+
print("Today:",today)
|
61
|
+
|
62
|
+
print('Company Name:',i['shortName'])
|
63
|
+
print('Stock Code:',i['symbol'])
|
64
|
+
print('Trading Currency:',i['currency'])
|
65
|
+
|
66
|
+
print('Sector:',i['sector'])
|
67
|
+
print('Industry:',i['industry'])
|
68
|
+
|
69
|
+
print('Company Location:',i['city']+', '+i['country'])
|
70
|
+
try: addr2=i['address2']
|
71
|
+
except: addr2=""
|
72
|
+
print('Company Address:',i['address1']+', '+addr2)
|
73
|
+
try:
|
74
|
+
print('Head Office Phone:',i['phone'])
|
75
|
+
except: pass
|
76
|
+
print('Website:',i['website'])
|
77
|
+
|
78
|
+
try:
|
79
|
+
print('Full Time Employees:',format(i['fullTimeEmployees'],'0,d'))
|
80
|
+
except: pass
|
81
|
+
|
82
|
+
try:
|
83
|
+
print('Green Finance(ESG Population):',i['isEsgPopulated'])
|
84
|
+
except: pass
|
85
|
+
|
86
|
+
print('Exchange Code:',i['exchange'])
|
87
|
+
print('Exchange City:',i['exchangeTimezoneName'])
|
88
|
+
|
89
|
+
if option == "financial":
|
90
|
+
print("\n=== Corporate Profile - Financials ===")
|
91
|
+
print("Today:",today)
|
92
|
+
print('Company Name:',i['shortName'])
|
93
|
+
#print('Dividend Yield:',i['dividendYield'])
|
94
|
+
#print('Trailing Annual Dividend Yield:',i['trailingAnnualDividendYield'])
|
95
|
+
#print('5-year Avg Dividend Yield:',i['fiveYearAvgDividendYield'])
|
96
|
+
|
97
|
+
print('Dividend Rate('+i['currency']+'):',i['dividendRate'])
|
98
|
+
print('Trailing Annual Dividend Rate:',i['trailingAnnualDividendRate'])
|
99
|
+
|
100
|
+
"""
|
101
|
+
注意:百分比的两种不同打印方法
|
102
|
+
{:.2%}无需事先乘以100
|
103
|
+
{:.2f}%需事先乘以100
|
104
|
+
"""
|
105
|
+
print('Dividend Yield: {:.2%}'.format(i['dividendYield']))
|
106
|
+
print('Trailing Annual Dividend Yield: {:.2%}'.format(i['trailingAnnualDividendYield']))
|
107
|
+
print('5-year Average Dividend Yield: {:.2f}%'.format(i['fiveYearAvgDividendYield']))
|
108
|
+
|
109
|
+
print('Payout Ratio: {:.2%}'.format(i['payoutRatio']))
|
110
|
+
|
111
|
+
print('Trailing PE:',round(i['trailingPE'],2))
|
112
|
+
print('Forward PE:',round(i['forwardPE'],2))
|
113
|
+
|
114
|
+
print('Trailing EPS:',round(i['trailingEps'],2))
|
115
|
+
print('Forward EPS:',round(i['forwardEps'],2))
|
116
|
+
|
117
|
+
print('Profit Margins: {:.2%}'.format(i['profitMargins']))
|
118
|
+
print('Earnings Quarterly Growth: {:.2%}'.format(i['earningsQuarterlyGrowth']))
|
119
|
+
|
120
|
+
print('Price To Sales TTM:',round(i['priceToSalesTrailing12Months'],2))
|
121
|
+
|
122
|
+
evr=i['enterpriseToRevenue']
|
123
|
+
if not ((evr < 0) or (evr == None)):
|
124
|
+
print('Enterprise To Revenue:',round(evr,2))
|
125
|
+
|
126
|
+
evebitda=i['enterpriseToEbitda']
|
127
|
+
if not (evebitda is None):
|
128
|
+
print('Enterprise To EBITDA:',round(evebitda,2))
|
129
|
+
print('Price To Book:',round(i['priceToBook'],2))
|
130
|
+
|
131
|
+
nitc=int(i['netIncomeToCommon']/1000000)
|
132
|
+
print('Net Income to Common(million):',format(nitc,'0,d'))
|
133
|
+
|
134
|
+
if option == "market":
|
135
|
+
print("\n=== Corporate Profile - Market ===")
|
136
|
+
print("Today:",today)
|
137
|
+
print('Company Name:',i['shortName'])
|
138
|
+
print('Stock Code:',i['symbol'])
|
139
|
+
print('Currency:',i['currency'])
|
140
|
+
|
141
|
+
som=int(i['sharesOutstanding']/1000000)
|
142
|
+
print('Shares Outstanding(million):',format(som,'0,d'))
|
143
|
+
|
144
|
+
"""
|
145
|
+
Float shares=Shares outstanding - Shares held by company insiders and
|
146
|
+
controlling shareholders
|
147
|
+
"""
|
148
|
+
#fsm=int(i['floatShares']/1000000)
|
149
|
+
#print('Float Shares(million):',fsm)
|
150
|
+
|
151
|
+
#mktcap=int(i['marketCap']/1000000)
|
152
|
+
#print('Market Capitalization(million):',format(mktcap,'0,d'))
|
153
|
+
|
154
|
+
try:
|
155
|
+
print('Beta:',round(i['beta'],2))
|
156
|
+
except: pass
|
157
|
+
print('Previous Close Price:',i['previousClose'])
|
158
|
+
print('50-day Average Price:',round(i['fiftyDayAverage'],2))
|
159
|
+
print('200-day Average Price:',round(i['twoHundredDayAverage'],2))
|
160
|
+
|
161
|
+
print('52-week High:',i['fiftyTwoWeekHigh'])
|
162
|
+
print('52-week Low:',i['fiftyTwoWeekLow'])
|
163
|
+
if not (i['heldPercentInstitutions'] is None):
|
164
|
+
print('Held by Institutions: {:.4%}'.format(i['heldPercentInstitutions']))
|
165
|
+
if not (i['heldPercentInsiders'] is None):
|
166
|
+
print('Held by Insiders: {:.4%}'.format(i['heldPercentInsiders']))
|
167
|
+
#print('Short% Of Float:',i['shortPercentOfFloat'])
|
168
|
+
|
169
|
+
return i
|
170
|
+
|
171
|
+
if __name__ =="__main__":
|
172
|
+
info=profile("600519.SS")
|
173
|
+
info=profile("MSFT",option="market")
|
174
|
+
info=profile("MSFT",option="financial")
|
175
|
+
info=profile("600519.SS",option="financial")
|
176
|
+
info=profile("0700.HK",option="financial")
|
177
|
+
info=profile("TCS.NS",option="market")
|
178
|
+
info=profile("BMW.DE",option="financial")
|
179
|
+
|
180
|
+
#==============================================================================
|
181
|
+
def get_sustainability(stocklist):
|
182
|
+
"""
|
183
|
+
功能:根据股票代码列表,抓取企业最新的可持续性发展数据
|
184
|
+
输入参数:
|
185
|
+
stocklist:股票代码列表,例如单个股票["AAPL"], 多只股票["AAPL","MSFT","GOOG"]
|
186
|
+
输出参数:
|
187
|
+
企业最新的可持续性发展数据,数据框
|
188
|
+
"""
|
189
|
+
|
190
|
+
#引用插件
|
191
|
+
import yfinance as yf
|
192
|
+
tickerlist=stocklist.copy()
|
193
|
+
|
194
|
+
#测试数据,使用后请注释掉
|
195
|
+
"""
|
196
|
+
tickerlist=["PDD","MSFT","BABA","JD","GOOG"]
|
197
|
+
"""
|
198
|
+
|
199
|
+
#处理股票列表中的第一只股票,跳过无数据的项目
|
200
|
+
skiplist=[]
|
201
|
+
for t in tickerlist:
|
202
|
+
tp=yf.Ticker(t)
|
203
|
+
try:
|
204
|
+
print("...Searching data for",t,"...",end='')
|
205
|
+
sst=tp.sustainability
|
206
|
+
sst.rename(columns={'Value':t},inplace=True)
|
207
|
+
sstt=sst.T
|
208
|
+
except: #本项目无数据,进入下一次循环
|
209
|
+
print(", not found:-(")
|
210
|
+
skiplist=skiplist+[t]
|
211
|
+
continue
|
212
|
+
skiplist=skiplist+[t]
|
213
|
+
print(", done!")
|
214
|
+
break
|
215
|
+
|
216
|
+
#仅保留尚未处理的项目
|
217
|
+
for t in skiplist: tickerlist.remove(t)
|
218
|
+
|
219
|
+
#处理股票列表中的其他股票
|
220
|
+
for t in tickerlist:
|
221
|
+
#print("---stock:",t)
|
222
|
+
tp=yf.Ticker(t)
|
223
|
+
try:
|
224
|
+
print("...Searching data for",t,"...",end='')
|
225
|
+
sst1=tp.sustainability
|
226
|
+
sst1.rename(columns={'Value':t},inplace=True)
|
227
|
+
except:
|
228
|
+
print(", not found:-(")
|
229
|
+
continue #未抓取到数据
|
230
|
+
sst1t=sst1.T
|
231
|
+
try:
|
232
|
+
sstt=sstt.append([sst1t])
|
233
|
+
except:
|
234
|
+
sstt=sstt._append([sst1t])
|
235
|
+
print(", done!")
|
236
|
+
|
237
|
+
#只保留需要的列
|
238
|
+
sust=sstt[['totalEsg','percentile','esgPerformance','environmentScore', \
|
239
|
+
'environmentPercentile','socialScore','socialPercentile', \
|
240
|
+
'governanceScore','governancePercentile','peerGroup','peerCount']].copy()
|
241
|
+
sust.rename(columns={'totalEsg':'ESGscore','percentile':'ESGpercentile', \
|
242
|
+
'esgPerformance':'ESGperformance','environmentScore':'EPscore', \
|
243
|
+
'environmentPercentile':'EPpercentile','socialScore':'CSRscore', \
|
244
|
+
'socialPercentile':'CSRpercentile','governanceScore':'CGscore', \
|
245
|
+
'governancePercentile':'CGpercentile', \
|
246
|
+
'peerGroup':'Peer Group','peerCount':'Count'},inplace=True)
|
247
|
+
|
248
|
+
return sust
|
249
|
+
|
250
|
+
if __name__ =="__main__":
|
251
|
+
stocklist=["PDD","BABA","JD","GOOG","WMT"]
|
252
|
+
sust=get_sustainability(stocklist)
|
253
|
+
|
254
|
+
|
255
|
+
#==============================================================================
|
256
|
+
def print_sustainability(sustainability,option="ESG"):
|
257
|
+
"""
|
258
|
+
功能:显示企业的可持续性发展数据
|
259
|
+
输入参数:
|
260
|
+
sustainability:抓取到的企业可持续性数据框
|
261
|
+
输出参数:无
|
262
|
+
"""
|
263
|
+
|
264
|
+
if not (option in ['ESG','EP','CSR','CG']):
|
265
|
+
print("...Error 01(print_sustainability): only ESG/EP/CSR/CG are valid")
|
266
|
+
return
|
267
|
+
|
268
|
+
import datetime as dt
|
269
|
+
today=dt.date.today()
|
270
|
+
s=sustainability.copy()
|
271
|
+
|
272
|
+
#显示分数和分位数
|
273
|
+
if option=="ESG":
|
274
|
+
s=s.sort_values(['ESGscore'],ascending=False)
|
275
|
+
print("\n=== Corporate Sustainability Performance ===")
|
276
|
+
esg=s[['ESGscore','ESGpercentile','ESGperformance','Peer Group','Count']]
|
277
|
+
print(esg)
|
278
|
+
print("\nSource: Yahoo Finance,",str(today))
|
279
|
+
|
280
|
+
if option=="EP":
|
281
|
+
s=s.sort_values(['EPscore'],ascending=False)
|
282
|
+
print("\n=== Corporate Environment Protection Performance ===")
|
283
|
+
ep=s[['EPscore','EPpercentile','Peer Group','Count']]
|
284
|
+
print(ep)
|
285
|
+
print("\nSource: Yahoo Finance,",str(today))
|
286
|
+
|
287
|
+
if option=="CSR":
|
288
|
+
s=s.sort_values(['CSRscore'],ascending=False)
|
289
|
+
print("\n=== Corporate Social Responsibility Performance ===")
|
290
|
+
print(s[['CSRscore','CSRpercentile','Peer Group','Count']])
|
291
|
+
print("\nSource: Yahoo Finance,",str(today))
|
292
|
+
|
293
|
+
if option=="CG":
|
294
|
+
s=s.sort_values(['CGscore'],ascending=False)
|
295
|
+
print("\n=== Corporate Governance Performance ===")
|
296
|
+
print(s[['CGscore','CGpercentile','Peer Group','Count']])
|
297
|
+
print("\nSource: Yahoo Finance,",str(today))
|
298
|
+
|
299
|
+
return
|
300
|
+
|
301
|
+
if __name__ =="__main__":
|
302
|
+
print_sustainability(sust,option="ESG")
|
303
|
+
print_sustainability(sust,option="EP")
|
304
|
+
print_sustainability(sust,option="CSR")
|
305
|
+
print_sustainability(sust,option="CG")
|
306
|
+
print_sustainability(sust,option="ABC")
|
307
|
+
|
308
|
+
#==============================================================================
|
309
|
+
def ploth_sustainability(sustainability,option="ESG"):
|
310
|
+
"""
|
311
|
+
功能:显示企业的可持续性发展数据
|
312
|
+
输入参数:
|
313
|
+
sustainability:抓取到的企业可持续性数据框
|
314
|
+
输出参数:无
|
315
|
+
"""
|
316
|
+
|
317
|
+
if not (option in ['ESG','EP','CSR','CG']):
|
318
|
+
print("...Error 01(plot_sustainability): only ESG/EP/CSR/CG are valid")
|
319
|
+
return
|
320
|
+
|
321
|
+
s=sustainability.copy()
|
322
|
+
import matplotlib.pyplot as plt
|
323
|
+
import datetime as dt
|
324
|
+
today=dt.date.today()
|
325
|
+
n=len(s)
|
326
|
+
|
327
|
+
#绘制分数图
|
328
|
+
if option=="ESG":
|
329
|
+
#排序
|
330
|
+
s=s.sort_values(['ESGscore'],ascending=True)
|
331
|
+
|
332
|
+
titletxt="Corporate Sustainability Performance"
|
333
|
+
plt.title(titletxt,fontsize=16,fontweight='bold')
|
334
|
+
|
335
|
+
xlabeltxt1="Score"
|
336
|
+
xlabeltxt=xlabeltxt1+'\n('+"Source: Yahoo Finance, "+str(today)+")"
|
337
|
+
font1 = {'family':'Times New Roman','weight':'normal','size':14,}
|
338
|
+
plt.xlabel(xlabeltxt,font1)
|
339
|
+
|
340
|
+
if n < 6:
|
341
|
+
graf=plt.barh(s.index,s['ESGscore'],facecolor='b',height=0.6,alpha=0.8)
|
342
|
+
else:
|
343
|
+
graf=plt.barh(s.index,s['ESGscore'],facecolor='b',alpha=0.8)
|
344
|
+
|
345
|
+
plt.gca().set_facecolor('whitesmoke')
|
346
|
+
plt.show()
|
347
|
+
|
348
|
+
if option=="EP":
|
349
|
+
s=s.sort_values(['EPscore'],ascending=True)
|
350
|
+
|
351
|
+
titletxt="Corporate Environment Protection Performance"
|
352
|
+
plt.title(titletxt,fontsize=13,fontweight='bold')
|
353
|
+
|
354
|
+
xlabeltxt1="Score"
|
355
|
+
xlabeltxt=xlabeltxt1+'\n('+"Source: Yahoo Finance, "+str(today)+")"
|
356
|
+
font1 = {'family':'Times New Roman','weight':'normal','size':14,}
|
357
|
+
plt.xlabel(xlabeltxt,font1)
|
358
|
+
|
359
|
+
if n < 6:
|
360
|
+
graf=plt.barh(s.index,s['EPscore'],facecolor='g',height=0.6,alpha=0.8)
|
361
|
+
else:
|
362
|
+
graf=plt.barh(s.index,s['EPscore'],facecolor='g',alpha=0.8)
|
363
|
+
|
364
|
+
plt.gca().set_facecolor('whitesmoke')
|
365
|
+
plt.show()
|
366
|
+
|
367
|
+
if option=="CSR":
|
368
|
+
s=s.sort_values(['CSRscore'],ascending=True)
|
369
|
+
|
370
|
+
titletxt="Corporate Social Responsibility Performance"
|
371
|
+
plt.title(titletxt,fontsize=13,fontweight='bold')
|
372
|
+
|
373
|
+
xlabeltxt1="Score"
|
374
|
+
xlabeltxt=xlabeltxt1+'\n('+"Source: Yahoo Finance, "+str(today)+")"
|
375
|
+
font1 = {'family':'Times New Roman','weight':'normal','size':14,}
|
376
|
+
plt.xlabel(xlabeltxt,font1)
|
377
|
+
|
378
|
+
if n < 6:
|
379
|
+
graf=plt.barh(s.index,s['CSRscore'],facecolor='tan',height=0.6,alpha=0.8)
|
380
|
+
else:
|
381
|
+
graf=plt.barh(s.index,s['CSRscore'],facecolor='tan',alpha=0.8)
|
382
|
+
|
383
|
+
plt.gca().set_facecolor('whitesmoke')
|
384
|
+
plt.show()
|
385
|
+
|
386
|
+
if option=="CG":
|
387
|
+
s=s.sort_values(['CGscore'],ascending=True)
|
388
|
+
|
389
|
+
titletxt="Corporate Governance Performance"
|
390
|
+
plt.title(titletxt,fontsize=16,fontweight='bold')
|
391
|
+
|
392
|
+
xlabeltxt1="Score"
|
393
|
+
xlabeltxt=xlabeltxt1+'\n('+"Source: Yahoo Finance, "+str(today)+")"
|
394
|
+
font1 = {'family':'Times New Roman','weight':'normal','size':14,}
|
395
|
+
plt.xlabel(xlabeltxt,font1)
|
396
|
+
|
397
|
+
if n < 6:
|
398
|
+
graf=plt.barh(s.index,s['CGscore'],facecolor='y',height=0.6,alpha=0.9)
|
399
|
+
else:
|
400
|
+
graf=plt.barh(s.index,s['CGscore'],facecolor='y',alpha=0.9)
|
401
|
+
|
402
|
+
plt.gca().set_facecolor('whitesmoke')
|
403
|
+
plt.show()
|
404
|
+
|
405
|
+
#绘制分位数图
|
406
|
+
if option=="ESG":
|
407
|
+
#排序
|
408
|
+
s=s.sort_values(['ESGpercentile'],ascending=True)
|
409
|
+
|
410
|
+
titletxt="Corporate Sustainability Performance"
|
411
|
+
plt.title(titletxt,fontsize=16,fontweight='bold')
|
412
|
+
|
413
|
+
xlabeltxt1="Percentile in industrial sector"
|
414
|
+
xlabeltxt=xlabeltxt1+'\n('+"Source: Yahoo Finance, "+str(today)+")"
|
415
|
+
font1 = {'family':'Times New Roman','weight':'normal','size':14,}
|
416
|
+
plt.xlabel(xlabeltxt,font1)
|
417
|
+
|
418
|
+
if n < 6:
|
419
|
+
graf=plt.barh(s.index,s['ESGpercentile'],facecolor='b',height=0.6,alpha=0.8)
|
420
|
+
else:
|
421
|
+
graf=plt.barh(s.index,s['ESGpercentile'],facecolor='b',alpha=0.8)
|
422
|
+
|
423
|
+
plt.gca().set_facecolor('whitesmoke')
|
424
|
+
plt.show()
|
425
|
+
|
426
|
+
if option=="EP":
|
427
|
+
s=s.sort_values(['EPpercentile'],ascending=True)
|
428
|
+
|
429
|
+
titletxt="Corporate Environment Protection Performance"
|
430
|
+
plt.title(titletxt,fontsize=13,fontweight='bold')
|
431
|
+
|
432
|
+
xlabeltxt1="Percentile in industrial sector"
|
433
|
+
xlabeltxt=xlabeltxt1+'\n('+"Source: Yahoo Finance, "+str(today)+")"
|
434
|
+
font1 = {'family':'Times New Roman','weight':'normal','size':14,}
|
435
|
+
plt.xlabel(xlabeltxt,font1)
|
436
|
+
|
437
|
+
if n < 6:
|
438
|
+
graf=plt.barh(s.index,s['EPpercentile'],facecolor='g',height=0.6,alpha=0.8)
|
439
|
+
else:
|
440
|
+
graf=plt.barh(s.index,s['EPpercentile'],facecolor='g',alpha=0.8)
|
441
|
+
|
442
|
+
plt.gca().set_facecolor('whitesmoke')
|
443
|
+
plt.show()
|
444
|
+
|
445
|
+
if option=="CSR":
|
446
|
+
s=s.sort_values(['CSRpercentile'],ascending=True)
|
447
|
+
|
448
|
+
titletxt="Corporate Social Responsibility Performance"
|
449
|
+
plt.title(titletxt,fontsize=13,fontweight='bold')
|
450
|
+
|
451
|
+
xlabeltxt1="Percentile in industrial sector"
|
452
|
+
xlabeltxt=xlabeltxt1+'\n('+"Source: Yahoo Finance, "+str(today)+")"
|
453
|
+
font1 = {'family':'Times New Roman','weight':'normal','size':14,}
|
454
|
+
plt.xlabel(xlabeltxt,font1)
|
455
|
+
|
456
|
+
if n < 6:
|
457
|
+
graf=plt.barh(s.index,s['CSRpercentile'],facecolor='tan',height=0.6,alpha=0.8)
|
458
|
+
else:
|
459
|
+
graf=plt.barh(s.index,s['CSRpercentile'],facecolor='tan',alpha=0.8)
|
460
|
+
|
461
|
+
plt.gca().set_facecolor('whitesmoke')
|
462
|
+
plt.show()
|
463
|
+
|
464
|
+
if option=="CG":
|
465
|
+
s=s.sort_values(['CGpercentile'],ascending=True)
|
466
|
+
|
467
|
+
titletxt="Corporate Governance Performance"
|
468
|
+
plt.title(titletxt,fontsize=16,fontweight='bold')
|
469
|
+
|
470
|
+
xlabeltxt1="Percentile in industrial sector"
|
471
|
+
xlabeltxt=xlabeltxt1+'\n('+"Source: Yahoo Finance, "+str(today)+")"
|
472
|
+
font1 = {'family':'Times New Roman','weight':'normal','size':14,}
|
473
|
+
plt.xlabel(xlabeltxt,font1)
|
474
|
+
|
475
|
+
if n < 6:
|
476
|
+
graf=plt.barh(s.index,s['CGpercentile'],facecolor='y',height=0.6,alpha=0.9)
|
477
|
+
else:
|
478
|
+
graf=plt.barh(s.index,s['CGpercentile'],facecolor='y',alpha=0.9)
|
479
|
+
|
480
|
+
plt.gca().set_facecolor('whitesmoke')
|
481
|
+
plt.show()
|
482
|
+
|
483
|
+
return
|
484
|
+
|
485
|
+
if __name__ =="__main__":
|
486
|
+
ploth_sustainability(sust,option="ESG")
|
487
|
+
ploth_sustainability(sust,option="EP")
|
488
|
+
ploth_sustainability(sust,option="CSR")
|
489
|
+
ploth_sustainability(sust,option="CG")
|
490
|
+
|
491
|
+
#==============================================================================
|
492
|
+
def plot_sustainability(sustainability,option="ESG"):
|
493
|
+
"""
|
494
|
+
功能:显示企业的可持续性发展数据,同时显示分数和分位数
|
495
|
+
输入参数:
|
496
|
+
sustainability:抓取到的企业可持续性数据框
|
497
|
+
输出参数:无
|
498
|
+
"""
|
499
|
+
|
500
|
+
if not (option in ['ESG','EP','CSR','CG']):
|
501
|
+
print("...Error 01(plot_sustainability): only ESG/EP/CSR/CG are valid")
|
502
|
+
return
|
503
|
+
|
504
|
+
s=sustainability.copy()
|
505
|
+
|
506
|
+
import numpy as np
|
507
|
+
import matplotlib.pyplot as plt
|
508
|
+
#from matplotlib.ticker import MultipleLocator
|
509
|
+
import datetime as dt
|
510
|
+
|
511
|
+
today=dt.date.today()
|
512
|
+
l=len(s.index)
|
513
|
+
n=np.arange(l)
|
514
|
+
if l < 6: width=0.45 #经验值,0.45*6=2.7
|
515
|
+
else: width=round(2.9/l,2)
|
516
|
+
#print("Firms:",s.index,", Width:",width)
|
517
|
+
|
518
|
+
#fig,ax=plt.subplots(figsize=(10,6))
|
519
|
+
fig,ax=plt.subplots(figsize=(12.8,6.4))
|
520
|
+
|
521
|
+
#绘制分数和分位数图
|
522
|
+
if option=="ESG":
|
523
|
+
s=s.sort_values(['ESGscore'],ascending=False)
|
524
|
+
|
525
|
+
b1=ax.bar(n-width/2,s['ESGscore'],width,tick_label=s.index,label='Score')
|
526
|
+
b2=ax.bar(n+width/2,s['ESGpercentile'],width,label='Percentile (%)')
|
527
|
+
|
528
|
+
plt.legend(loc='best')
|
529
|
+
|
530
|
+
for b in b1+b2:
|
531
|
+
h=b.get_height()
|
532
|
+
ax.text(b.get_x()+b.get_width()/2,h,h,ha='center',va='bottom')
|
533
|
+
|
534
|
+
fontlabel={'family':'Times New Roman','weight':'normal','size':16}
|
535
|
+
plt.ylabel('ESG Index',fontlabel)
|
536
|
+
plt.ylim(0,100)
|
537
|
+
xlabeltxt='\n'+"Source: Yahoo Finance, "+str(today)
|
538
|
+
plt.xlabel(xlabeltxt,fontlabel)
|
539
|
+
|
540
|
+
titletxt="Corporate Sustainability Performance (ESG)"
|
541
|
+
fonttitle={'family':'Times New Roman','weight':'normal','size':24}
|
542
|
+
plt.title(titletxt,fonttitle)
|
543
|
+
|
544
|
+
plt.gca().set_facecolor('whitesmoke')
|
545
|
+
plt.show()
|
546
|
+
|
547
|
+
if option=="EP":
|
548
|
+
s=s.sort_values(['EPscore'],ascending=False)
|
549
|
+
|
550
|
+
b1=ax.bar(n-width/2,s['EPscore'],width,tick_label=s.index,label='Score')
|
551
|
+
b2=ax.bar(n+width/2,s['EPpercentile'],width,label='Percentile (%)')
|
552
|
+
plt.legend(loc='best')
|
553
|
+
|
554
|
+
for b in b1+b2:
|
555
|
+
h=b.get_height()
|
556
|
+
ax.text(b.get_x()+b.get_width()/2,h,h,ha='center',va='bottom')
|
557
|
+
|
558
|
+
fontlabel={'family':'Times New Roman','weight':'normal','size':16}
|
559
|
+
plt.ylabel('EP Index',fontlabel)
|
560
|
+
plt.ylim(0,100)
|
561
|
+
xlabeltxt='\n'+"Source: Yahoo Finance, "+str(today)
|
562
|
+
plt.xlabel(xlabeltxt,fontlabel)
|
563
|
+
|
564
|
+
titletxt="Corporate Environment Protection Performance (EP)"
|
565
|
+
fonttitle={'family':'Times New Roman','weight':'normal','size':22}
|
566
|
+
plt.title(titletxt,fonttitle)
|
567
|
+
|
568
|
+
plt.gca().set_facecolor('whitesmoke')
|
569
|
+
plt.show()
|
570
|
+
|
571
|
+
if option=="CSR":
|
572
|
+
s=s.sort_values(['CSRscore'],ascending=False)
|
573
|
+
|
574
|
+
b1=ax.bar(n-width/2,s['CSRscore'],width,tick_label=s.index,label='Score')
|
575
|
+
b2=ax.bar(n+width/2,s['CSRpercentile'],width,label='Percentile (%)')
|
576
|
+
plt.legend(loc='best')
|
577
|
+
|
578
|
+
for b in b1+b2:
|
579
|
+
h=b.get_height()
|
580
|
+
ax.text(b.get_x()+b.get_width()/2,h,h,ha='center',va='bottom')
|
581
|
+
|
582
|
+
fontlabel={'family':'Times New Roman','weight':'normal','size':16}
|
583
|
+
plt.ylabel('CSR Index',fontlabel)
|
584
|
+
plt.ylim(0,100)
|
585
|
+
xlabeltxt='\n'+"Source: Yahoo Finance, "+str(today)
|
586
|
+
plt.xlabel(xlabeltxt,fontlabel)
|
587
|
+
|
588
|
+
titletxt="Corporate Social Responsibility Performance (CSR)"
|
589
|
+
fonttitle={'family':'Times New Roman','weight':'normal','size':22}
|
590
|
+
plt.title(titletxt,fonttitle)
|
591
|
+
|
592
|
+
plt.gca().set_facecolor('whitesmoke')
|
593
|
+
plt.show()
|
594
|
+
|
595
|
+
if option=="CG":
|
596
|
+
s=s.sort_values(['CGscore'],ascending=False)
|
597
|
+
|
598
|
+
b1=ax.bar(n-width/2,s['CGscore'],width,tick_label=s.index,label='Score')
|
599
|
+
b2=ax.bar(n+width/2,s['CGpercentile'],width,label='Percentile (%)')
|
600
|
+
plt.legend(loc='best')
|
601
|
+
|
602
|
+
for b in b1+b2:
|
603
|
+
h=b.get_height()
|
604
|
+
ax.text(b.get_x()+b.get_width()/2,h,h,ha='center',va='bottom')
|
605
|
+
|
606
|
+
fontlabel={'family':'Times New Roman','weight':'normal','size':16}
|
607
|
+
plt.ylabel('CG Index',fontlabel)
|
608
|
+
plt.ylim(0,100)
|
609
|
+
xlabeltxt='\n'+"Source: Yahoo Finance, "+str(today)
|
610
|
+
plt.xlabel(xlabeltxt,fontlabel)
|
611
|
+
|
612
|
+
titletxt="Corporate Governance Performance (CG)"
|
613
|
+
fonttitle={'family':'Times New Roman','weight':'normal','size':24}
|
614
|
+
plt.title(titletxt,fonttitle)
|
615
|
+
|
616
|
+
plt.gca().set_facecolor('whitesmoke')
|
617
|
+
plt.show()
|
618
|
+
|
619
|
+
return
|
620
|
+
|
621
|
+
if __name__ =="__main__":
|
622
|
+
plot_sustainability(sust,option="ESG")
|
623
|
+
plot_sustainability(sust,option="EP")
|
624
|
+
plot_sustainability(sust,option="CSR")
|
625
|
+
plot_sustainability(sust,option="CG")
|
626
|
+
|
627
|
+
stocklist2=["AMZN","EBAY","BABA","JD","VIPS","WMT"]
|
628
|
+
sust2=get_sustainability(stocklist2)
|
629
|
+
plot_sustainability(sust2)
|
630
|
+
#==============================================================================
|
631
|
+
def sustainability(stocklist):
|
632
|
+
"""
|
633
|
+
功能:抓取、打印和绘图企业的可持续性发展数据,演示用
|
634
|
+
输入参数:
|
635
|
+
stocklist:股票代码列表,例如单个股票["AAPL"], 多只股票["AAPL","MSFT","GOOG"]
|
636
|
+
输出参数:
|
637
|
+
企业最新的可持续性发展数据,数据框
|
638
|
+
"""
|
639
|
+
|
640
|
+
#抓取数据
|
641
|
+
sust=get_sustainability(stocklist)
|
642
|
+
|
643
|
+
#打印和绘图ESG
|
644
|
+
ploth_sustainability(sust,option="ESG")
|
645
|
+
print_sustainability(sust,option="ESG")
|
646
|
+
#打印和绘图EP
|
647
|
+
ploth_sustainability(sust,option="EP")
|
648
|
+
print_sustainability(sust,option="EP")
|
649
|
+
#打印和绘图CSR
|
650
|
+
ploth_sustainability(sust,option="CSR")
|
651
|
+
print_sustainability(sust,option="CSR")
|
652
|
+
#打印和绘图CG
|
653
|
+
ploth_sustainability(sust,option="CG")
|
654
|
+
print_sustainability(sust,option="CG")
|
655
|
+
|
656
|
+
return sust
|
657
|
+
|
658
|
+
if __name__ =="__main__":
|
659
|
+
stocklist1=["AMZN","EBAY","BABA"]
|
660
|
+
sust1=sustainability(stocklist1)
|
661
|
+
stocklist2=["AMZN","EBAY","BABA","JD","VIPS","WMT"]
|
662
|
+
sust2=sustainability(stocklist2)
|
663
|
+
|
664
|
+
#==============================================================================
|
665
|
+
#==============================================================================
|
666
|
+
def sustainability2(stocklist):
|
667
|
+
"""
|
668
|
+
功能:抓取、打印和绘图企业的可持续性发展数据,演示用
|
669
|
+
输入参数:
|
670
|
+
stocklist:股票代码列表,例如单个股票["AAPL"], 多只股票["AAPL","MSFT","GOOG"]
|
671
|
+
输出参数:
|
672
|
+
企业最新的可持续性发展数据,数据框
|
673
|
+
"""
|
674
|
+
|
675
|
+
#抓取数据
|
676
|
+
sust=get_sustainability(stocklist)
|
677
|
+
|
678
|
+
#打印和绘图ESG
|
679
|
+
plot_sustainability(sust,option="ESG")
|
680
|
+
print_sustainability(sust,option="ESG")
|
681
|
+
#打印和绘图EP
|
682
|
+
plot_sustainability(sust,option="EP")
|
683
|
+
print_sustainability(sust,option="EP")
|
684
|
+
#打印和绘图CSR
|
685
|
+
plot_sustainability(sust,option="CSR")
|
686
|
+
print_sustainability(sust,option="CSR")
|
687
|
+
#打印和绘图CG
|
688
|
+
plot_sustainability(sust,option="CG")
|
689
|
+
print_sustainability(sust,option="CG")
|
690
|
+
|
691
|
+
return sust
|
692
|
+
|
693
|
+
if __name__ =="__main__":
|
694
|
+
stocklist1=["AMZN","EBAY","BABA"]
|
695
|
+
sust1=sustainability2(stocklist1)
|
696
|
+
stocklist2=["AMZN","EBAY","BABA","JD","VIPS","WMT"]
|
697
|
+
sust2=sustainability2(stocklist2)
|
698
|
+
|
699
|
+
|
700
|
+
|
701
|
+
|
702
|
+
|
703
|
+
|
704
|
+
|
705
|
+
|
706
|
+
|
707
|
+
|