siat 3.8.28__py3-none-any.whl → 3.8.35__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/economy2.py +132 -28
- siat/grafix.py +595 -37
- siat/valuation_china.py +289 -1
- {siat-3.8.28.dist-info → siat-3.8.35.dist-info}/METADATA +10 -2
- {siat-3.8.28.dist-info → siat-3.8.35.dist-info}/RECORD +8 -8
- {siat-3.8.28.dist-info → siat-3.8.35.dist-info}/WHEEL +1 -1
- {siat-3.8.28.dist-info → siat-3.8.35.dist-info}/LICENSE +0 -0
- {siat-3.8.28.dist-info → siat-3.8.35.dist-info}/top_level.txt +0 -0
siat/valuation_china.py
CHANGED
@@ -182,6 +182,294 @@ if __name__ =="__main__":
|
|
182
182
|
df=get_valuation_market_china(start,end,measure='pe',method='lyr',value='value',statistic='median')
|
183
183
|
|
184
184
|
#==============================================================================
|
185
|
+
if __name__ =="__main__":
|
186
|
+
start='2024-1-1'; end='2025-3-31'
|
187
|
+
indicator='pe'
|
188
|
+
method='ttm'
|
189
|
+
value='value'
|
190
|
+
statistic='median'
|
191
|
+
|
192
|
+
indicator=['pb','pe']
|
193
|
+
method=['lyr','ttm']
|
194
|
+
value=['value','quantile']
|
195
|
+
statistic=['median','equal-weighted']
|
196
|
+
|
197
|
+
twinx=False; loc1='best'; loc2='best'
|
198
|
+
power=0; twinx=False; average_value=True
|
199
|
+
annotate=False; annotate_value=False; plus_sign=True
|
200
|
+
mark_top=False; mark_bottom=False; mark_end=False
|
201
|
+
|
202
|
+
loc1='upper left'; loc2='lower right'
|
203
|
+
facecolor='whitesmoke'; maxticks=20
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
def valuation_china(start='MRY',end='today',indicator='pe', \
|
208
|
+
method='lyr',value='value',statistic='median', \
|
209
|
+
average_value=False,show_index=False, \
|
210
|
+
power=0,twinx=False, \
|
211
|
+
|
212
|
+
band_area='', \
|
213
|
+
attention_value='',attention_value_area='', \
|
214
|
+
attention_point='',attention_point_area='', \
|
215
|
+
|
216
|
+
annotate=False,annotate_value=False,plus_sign=True, \
|
217
|
+
mark_start=False,mark_top=False,mark_bottom=False,mark_end=False, \
|
218
|
+
|
219
|
+
loc1='upper left',loc2='lower right', \
|
220
|
+
facecolor='whitesmoke',maxticks=20):
|
221
|
+
"""
|
222
|
+
===========================================================================
|
223
|
+
功能:比较中国全A股市场的估值指标变化趋势
|
224
|
+
start: 开始日期,格式YYYY-MM-DD。
|
225
|
+
或者简写版,例如'MRY'近1年、'L3Y'表示近3年等。
|
226
|
+
end: 结束日期,默认今天。
|
227
|
+
|
228
|
+
indicator: 估值指标市盈率'pe'或市净率'pb',或其组合。不支持股息率
|
229
|
+
method: 滚动'ttm或静态取样'lyr',或其组合
|
230
|
+
value: 直接采用估值指标数值'value'或分位数'quantile',或其组合
|
231
|
+
statistic: 采用中位数'median'或等权均值'equal-weighted',或其组合
|
232
|
+
twinx:是否使用双轴绘图法,默认否False。
|
233
|
+
如果同时选择了市盈率'pe'或市净率'pb',建议打开该选项True。
|
234
|
+
loc1/loc2:图例1/2的位置,默认自动决定'best'。
|
235
|
+
如果自动位置不理想,可以手动设置位置。
|
236
|
+
"""
|
237
|
+
print(" Working on valuating China stock market ... ...")
|
238
|
+
|
239
|
+
import pandas as pd
|
240
|
+
#处理日期
|
241
|
+
start,end=start_end_preprocess(start,end)
|
242
|
+
|
243
|
+
# 情形1:双indicator:双指标,PE+PB
|
244
|
+
if isinstance(indicator,list) and len(indicator) >= 2:
|
245
|
+
indicator=indicator[:2]
|
246
|
+
if isinstance(method,list): method=method[0]
|
247
|
+
|
248
|
+
if isinstance(value,list): value=value[0]
|
249
|
+
if isinstance(statistic,list): statistic=statistic[0]
|
250
|
+
|
251
|
+
df=None
|
252
|
+
for i in indicator:
|
253
|
+
if 'pb' != i.lower():
|
254
|
+
dftmp=get_valuation_market_china(start,end,measure=i.lower(), \
|
255
|
+
method=method, \
|
256
|
+
value=value,statistic=statistic)
|
257
|
+
else:
|
258
|
+
# pb不支持ttm
|
259
|
+
dftmp=get_valuation_market_china(start,end,measure=i.lower(), \
|
260
|
+
method='lyr', \
|
261
|
+
value=value,statistic=statistic)
|
262
|
+
|
263
|
+
val_desc=dftmp['desc'].values[0]
|
264
|
+
method_desc=dftmp['method'].values[0]
|
265
|
+
"""
|
266
|
+
if method_desc == 'lyr': val_desc=val_desc+'静态'
|
267
|
+
elif method_desc == 'ttm':
|
268
|
+
#val_desc=val_desc+'动态'
|
269
|
+
val_desc=val_desc
|
270
|
+
if value == 'value': val_desc=val_desc+'数值'
|
271
|
+
elif value == 'quantile': val_desc=val_desc+'分位数'
|
272
|
+
"""
|
273
|
+
dftmp[val_desc]=dftmp['field']
|
274
|
+
dftmp2=dftmp[[val_desc]]
|
275
|
+
|
276
|
+
if df is None:
|
277
|
+
df=dftmp2
|
278
|
+
else:
|
279
|
+
df=pd.merge(df,dftmp2,left_index=True,right_index=True)
|
280
|
+
|
281
|
+
# 情形2:单indicator+双method:ttm+lyr(仅适用于pe;pb仅适用lyr);
|
282
|
+
elif isinstance(method,list) and len(method) >= 2:
|
283
|
+
method=method[:2]
|
284
|
+
if isinstance(indicator,list): indicator=indicator[0]
|
285
|
+
|
286
|
+
if isinstance(value,list): value=value[0]
|
287
|
+
if isinstance(statistic,list): statistic=statistic[0]
|
288
|
+
|
289
|
+
df=None
|
290
|
+
for i in method:
|
291
|
+
if (indicator.lower() == 'pe') or \
|
292
|
+
(indicator.lower() == 'pb' and i.lower() == 'lyr'):
|
293
|
+
dftmp=get_valuation_market_china(start,end,measure=indicator.lower(), \
|
294
|
+
method=i.lower(), \
|
295
|
+
value=value,statistic=statistic)
|
296
|
+
|
297
|
+
val_desc=dftmp['desc'].values[0]
|
298
|
+
method_desc=dftmp['method'].values[0]
|
299
|
+
"""
|
300
|
+
if method_desc == 'lyr': val_desc=val_desc+'静态'
|
301
|
+
elif method_desc == 'ttm':
|
302
|
+
#val_desc=val_desc+'动态'
|
303
|
+
val_desc=val_desc
|
304
|
+
if value == 'value': val_desc=val_desc+'数值'
|
305
|
+
elif value == 'quantile': val_desc=val_desc+'分位数'
|
306
|
+
"""
|
307
|
+
dftmp[val_desc]=dftmp['field']
|
308
|
+
dftmp2=dftmp[[val_desc]]
|
309
|
+
|
310
|
+
if df is None:
|
311
|
+
df=dftmp2
|
312
|
+
else:
|
313
|
+
df=pd.merge(df,dftmp2,left_index=True,right_index=True)
|
314
|
+
|
315
|
+
# 情形3:单indicator+单method+双value;
|
316
|
+
elif isinstance(value,list) and len(value) >= 2:
|
317
|
+
value=value[:2]
|
318
|
+
if isinstance(indicator,list): indicator=indicator[0]
|
319
|
+
if isinstance(method,list): method=method[0]
|
320
|
+
if indicator == 'pb': method='lyr'
|
321
|
+
|
322
|
+
if isinstance(statistic,list): statistic=statistic[0]
|
323
|
+
|
324
|
+
df=None
|
325
|
+
for i in value:
|
326
|
+
dftmp=get_valuation_market_china(start,end,measure=indicator.lower(), \
|
327
|
+
method=method.lower(), \
|
328
|
+
value=i.lower(),statistic=statistic)
|
329
|
+
|
330
|
+
val_desc=dftmp['desc'].values[0]
|
331
|
+
method_desc=dftmp['method'].values[0]
|
332
|
+
"""
|
333
|
+
if method_desc == 'lyr': val_desc=val_desc+'静态'
|
334
|
+
elif method_desc == 'ttm':
|
335
|
+
#val_desc=val_desc+'动态'
|
336
|
+
val_desc=val_desc
|
337
|
+
if value == 'value': val_desc=val_desc+'数值'
|
338
|
+
elif value == 'quantile': val_desc=val_desc+'分位数'
|
339
|
+
"""
|
340
|
+
dftmp[val_desc]=dftmp['field']
|
341
|
+
dftmp2=dftmp[[val_desc]]
|
342
|
+
|
343
|
+
if df is None:
|
344
|
+
df=dftmp2
|
345
|
+
else:
|
346
|
+
df=pd.merge(df,dftmp2,left_index=True,right_index=True)
|
347
|
+
|
348
|
+
# 数值与分位数差距较大,使用twinx=True
|
349
|
+
twinx=True
|
350
|
+
|
351
|
+
# 情形4:单indicator+单method+单value+双statistic;
|
352
|
+
elif isinstance(statistic,list) and len(statistic) >= 2:
|
353
|
+
statistic=statistic[:2]
|
354
|
+
if isinstance(indicator,list): indicator=indicator[0]
|
355
|
+
if isinstance(method,list): method=method[0]
|
356
|
+
if indicator == 'pb': method='lyr'
|
357
|
+
|
358
|
+
df=None
|
359
|
+
for i in statistic:
|
360
|
+
dftmp=get_valuation_market_china(start,end,measure=indicator.lower(), \
|
361
|
+
method=method.lower(), \
|
362
|
+
value=value.lower(),statistic=i.lower())
|
363
|
+
|
364
|
+
val_desc=dftmp['desc'].values[0]
|
365
|
+
method_desc=dftmp['method'].values[0]
|
366
|
+
"""
|
367
|
+
if method_desc == 'lyr': val_desc=val_desc+'静态'
|
368
|
+
elif method_desc == 'ttm':
|
369
|
+
#val_desc=val_desc+'动态'
|
370
|
+
val_desc=val_desc
|
371
|
+
if value == 'value': val_desc=val_desc+'数值'
|
372
|
+
elif value == 'quantile': val_desc=val_desc+'分位数'
|
373
|
+
"""
|
374
|
+
dftmp[val_desc]=dftmp['field']
|
375
|
+
dftmp2=dftmp[[val_desc]]
|
376
|
+
|
377
|
+
if df is None:
|
378
|
+
df=dftmp2
|
379
|
+
else:
|
380
|
+
df=pd.merge(df,dftmp2,left_index=True,right_index=True)
|
381
|
+
|
382
|
+
# 情形5:单indicator+单method+单value+单statistic;
|
383
|
+
else:
|
384
|
+
if isinstance(indicator,list): indicator=indicator[0]
|
385
|
+
if isinstance(method,list): method=method[0]
|
386
|
+
if indicator == 'pb': method='lyr'
|
387
|
+
|
388
|
+
if isinstance(value,list): value=value[0]
|
389
|
+
if isinstance(statistic,list): statistic=statistic[0]
|
390
|
+
|
391
|
+
dftmp=get_valuation_market_china(start,end,measure=indicator.lower(), \
|
392
|
+
method=method.lower(), \
|
393
|
+
value=value.lower(),statistic=statistic.lower())
|
394
|
+
|
395
|
+
val_desc=dftmp['desc'].values[0]
|
396
|
+
method_desc=dftmp['method'].values[0]
|
397
|
+
"""
|
398
|
+
if method_desc == 'lyr': val_desc=val_desc+'静态'
|
399
|
+
elif method_desc == 'ttm':
|
400
|
+
#val_desc=val_desc+'动态'
|
401
|
+
val_desc=val_desc
|
402
|
+
if value == 'value': val_desc=val_desc+'数值'
|
403
|
+
elif value == 'quantile': val_desc=val_desc+'分位数'
|
404
|
+
"""
|
405
|
+
dftmp[val_desc]=dftmp['field']
|
406
|
+
if show_index:
|
407
|
+
index_desc=dftmp['index name'].values[0]
|
408
|
+
dftmp[index_desc]=dftmp['index']
|
409
|
+
df=dftmp[[val_desc,index_desc]]
|
410
|
+
|
411
|
+
# 指数与指标差异大,设定twinx=True
|
412
|
+
twinx=True
|
413
|
+
else:
|
414
|
+
df=dftmp[[val_desc]]
|
415
|
+
|
416
|
+
# 绘图
|
417
|
+
import datetime; todaydt = datetime.date.today()
|
418
|
+
sourcetxt=text_lang("数据来源:legulegu","Data source: legulegu")
|
419
|
+
footnote=sourcetxt+', '+str(todaydt)
|
420
|
+
|
421
|
+
if show_index:
|
422
|
+
# 显示股票市场指数
|
423
|
+
twinx=True
|
424
|
+
|
425
|
+
titletxt=text_lang("中国A股市场估值趋势","China A-share Market Valuation")
|
426
|
+
ylabeltxt=text_lang("估值指标","Valuation Indicator")
|
427
|
+
|
428
|
+
if len(list(df)) == 1:
|
429
|
+
colname=collabel=list(df)[0]
|
430
|
+
#titletxt=titletxt+': '+colname
|
431
|
+
ylabeltxt=colname
|
432
|
+
plot_line(df,colname,collabel,ylabeltxt,titletxt,footnote, \
|
433
|
+
power=power, \
|
434
|
+
attention_value=attention_value,attention_value_area=attention_value_area, \
|
435
|
+
attention_point=attention_point,attention_point_area=attention_point_area, \
|
436
|
+
average_value=average_value, \
|
437
|
+
|
438
|
+
loc=loc1, \
|
439
|
+
mark_start=True,mark_top=True,mark_bottom=True,mark_end=mark_end, \
|
440
|
+
facecolor=facecolor,maxticks=maxticks)
|
441
|
+
|
442
|
+
#elif twinx and len(list(df)) >= 2:
|
443
|
+
elif twinx != False and len(list(df)) >= 2:
|
444
|
+
ticker1=ticker2=''
|
445
|
+
colname1=label1=list(df)[0]; df1=df[[colname1]]
|
446
|
+
colname2=label2=list(df)[1]; df2=df[[colname2]]
|
447
|
+
|
448
|
+
plot_line2(df1,ticker1,colname1,label1, \
|
449
|
+
df2,ticker2,colname2,label2, \
|
450
|
+
ylabeltxt,titletxt,footnote, \
|
451
|
+
power=power,datatag1=False,datatag2=False,yscalemax=5, \
|
452
|
+
zeroline=False, \
|
453
|
+
twinx=twinx, \
|
454
|
+
yline=999,attention_value_area='', \
|
455
|
+
xline=999,attention_point_area='', \
|
456
|
+
resample_freq='H',loc1=loc1,loc2=loc2, \
|
457
|
+
color1='red',color2='blue',facecolor='whitesmoke', \
|
458
|
+
maxticks=maxticks)
|
459
|
+
else:
|
460
|
+
x_label=footnote
|
461
|
+
axhline_value=0; axhline_label=''
|
462
|
+
draw_lines(df,ylabeltxt,x_label,axhline_value,axhline_label,titletxt, \
|
463
|
+
band_area=band_area,loc=loc1, \
|
464
|
+
attention_value=attention_value,attention_value_area=attention_value_area, \
|
465
|
+
attention_point=attention_point,attention_point_area=attention_point_area, \
|
466
|
+
annotate=annotate,annotate_value=annotate_value,plus_sign=False, \
|
467
|
+
mark_top=mark_top,mark_bottom=mark_bottom,mark_end=mark_end, \
|
468
|
+
facecolor=facecolor,maxticks_enable=True,maxticks=maxticks)
|
469
|
+
|
470
|
+
return df
|
471
|
+
|
472
|
+
|
185
473
|
if __name__ =="__main__":
|
186
474
|
start='2020-1-1'; end='2022-10-9'
|
187
475
|
measures=['pb','pe']; methods='lyr'; values='value'; statistics='median'
|
@@ -261,7 +549,7 @@ def valuation_market_china(start='MRY',end='today',measures=['pe','pb'], \
|
|
261
549
|
|
262
550
|
import datetime
|
263
551
|
today = datetime.date.today()
|
264
|
-
footnote="数据来源:
|
552
|
+
footnote="数据来源: legulegu,"+str(today)
|
265
553
|
|
266
554
|
#获取指标1
|
267
555
|
df1=get_valuation_market_china(start,end,measure=measures1,method=methods1,value=values1,statistic=statistics1)
|
@@ -1,6 +1,6 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.2
|
2
2
|
Name: siat
|
3
|
-
Version: 3.8.
|
3
|
+
Version: 3.8.35
|
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
|
@@ -40,6 +40,14 @@ Requires-Dist: translators
|
|
40
40
|
Requires-Dist: nbconvert
|
41
41
|
Requires-Dist: ipywidgets
|
42
42
|
Requires-Dist: playwright
|
43
|
+
Dynamic: author
|
44
|
+
Dynamic: author-email
|
45
|
+
Dynamic: description
|
46
|
+
Dynamic: description-content-type
|
47
|
+
Dynamic: home-page
|
48
|
+
Dynamic: license
|
49
|
+
Dynamic: requires-dist
|
50
|
+
Dynamic: summary
|
43
51
|
|
44
52
|
|
45
53
|
# What is siat?
|
@@ -30,7 +30,7 @@ siat/cryptocurrency_test.py,sha256=3AikTNJ7j-HwLGLIYEfyXZ3bLVuLeru9mwiwHQi2SdA,2
|
|
30
30
|
siat/derivative.py,sha256=qV8n09799eqLc26ojR6vN5n_X-xd7rGwdYjgq-wBih8,41483
|
31
31
|
siat/economy-20230125.py,sha256=vxZZlPnLkh7SpGMVEPLwxjt0yYLSVmdZrO-s2NYLyoM,73848
|
32
32
|
siat/economy.py,sha256=BFVQDxOTbuizyumpCgpZIauH6sqnwUXebpqRMmQCzys,84198
|
33
|
-
siat/economy2.py,sha256=
|
33
|
+
siat/economy2.py,sha256=tdfbDXfv_rI4FjeQEgMwcKnoGNRL_1U2vkrnAPgRmAs,81019
|
34
34
|
siat/economy_test.py,sha256=6vjNlPz7W125pJb7simCddobSEp3jmLIMvVkLRZ7zW8,13339
|
35
35
|
siat/esg.py,sha256=GMhaonIKtvOK83rhpQUH5aJt2OL3HQBSVfD__Yw-0oo,19040
|
36
36
|
siat/esg_test.py,sha256=Z9m6GUt8O7oHZSEG9aDYpGdvvrv2AiRJdHTiU6jqmZ0,2944
|
@@ -64,7 +64,7 @@ siat/future_china.py,sha256=F-HsIf2Op8Z22RzTjet1g8COzldgnMjFNSXsAkeGyWo,17595
|
|
64
64
|
siat/future_china_test.py,sha256=BrSzmDVaOHki6rntOtosmRn-6dkfOBuLulJNqh7MOpc,1163
|
65
65
|
siat/global_index_test.py,sha256=hnFp3wqqzzL-kAP8mgxDZ54Bd5Ijf6ENi5YJlGBgcXw,2402
|
66
66
|
siat/google_authenticator.py,sha256=ZUbZR8OW0IAKDbcYtlqGqIpZdERpFor9NccFELxg9yI,1637
|
67
|
-
siat/grafix.py,sha256=
|
67
|
+
siat/grafix.py,sha256=Noy_gIwVGjktPgfUIx-KZQJ-pjtwR3o7iBI030m4wzs,139126
|
68
68
|
siat/grafix_test.py,sha256=kXvcpLgQNO7wd30g_bWljLj5UH7bIVI0_dUtXbfiKR0,3150
|
69
69
|
siat/holding_risk.py,sha256=uWRtMMJqKr-puQn26g6Fq5N3mFB70c0B99zLQug8hAo,30774
|
70
70
|
siat/holding_risk_test.py,sha256=FRlw_9wFG98BYcg_cSj95HX5WZ1TvkGaOUdXD7-V86s,474
|
@@ -140,12 +140,12 @@ siat/translate_20240606.py,sha256=63IyHWEU3Uz9mjwyuAX3fqY4nUMdwh0ICQAgmgPXP7Y,21
|
|
140
140
|
siat/translate_241003_keep.py,sha256=un7Fqe1v35MXsja5exZgjmLzrZtt66NARZIGlyFuGGU,218747
|
141
141
|
siat/universal_test.py,sha256=CDAOffW1Rvs-TcNN5giWVvHMlch1w4dp-w5SIV9jXL0,3936
|
142
142
|
siat/valuation.py,sha256=K7epQC_UtELjRR5cyjJp4gskSyJMxXy-jHIAS0SUEj8,51801
|
143
|
-
siat/valuation_china.py,sha256=
|
143
|
+
siat/valuation_china.py,sha256=eSKIDckyjG8QkENlW_OKkqbQHno8pzDcomBO9iGNJVM,83079
|
144
144
|
siat/valuation_market_china_test.py,sha256=gbJ0ioauuo4koTPH6WKUkqcXiQPafnbhU5eKJ6lpdLA,1571
|
145
145
|
siat/var_model_validation.py,sha256=R0caWnuZarrRg9939hxh3vJIIpIyPfvelYmzFNZtPbo,14910
|
146
146
|
siat/yf_name.py,sha256=laNKMTZ9hdenGX3IZ7G0a2RLBKEWtUQJFY9CWuk_fp8,24058
|
147
|
-
siat-3.8.
|
148
|
-
siat-3.8.
|
149
|
-
siat-3.8.
|
150
|
-
siat-3.8.
|
151
|
-
siat-3.8.
|
147
|
+
siat-3.8.35.dist-info/LICENSE,sha256=NTEMMROY9_4U1szoKC3N2BLHcDd_o5uTgqdVH8tbApw,1071
|
148
|
+
siat-3.8.35.dist-info/METADATA,sha256=3q8Ct67TlVKt9RRhekzd2I5JXTdrtUqT-4G62BkeH-I,8321
|
149
|
+
siat-3.8.35.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
150
|
+
siat-3.8.35.dist-info/top_level.txt,sha256=r1cVyL7AIKqeAmEJjNR8FMT20OmEzufDstC2gv3NvEY,5
|
151
|
+
siat-3.8.35.dist-info/RECORD,,
|
File without changes
|
File without changes
|