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/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="数据来源: 乐咕乐股,"+str(today)
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
1
+ Metadata-Version: 2.2
2
2
  Name: siat
3
- Version: 3.8.28
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=1wEYdfsgTxTy6FtXXOoCfd4v6xWQYUXLDR7GJSOHwGg,75147
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=Qw17Gq2jjh8ftWpAM0TfWP7bojGlS48hMpOUSJar5HM,117447
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=izg7EhnkZkHQQuVmkLTvPdOETJgQ8epAeEmQVBOEg1g,70607
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.28.dist-info/LICENSE,sha256=NTEMMROY9_4U1szoKC3N2BLHcDd_o5uTgqdVH8tbApw,1071
148
- siat-3.8.28.dist-info/METADATA,sha256=-znpXFY93SnCc5fC9dnEraPjh_vwbitlZSkqjwkGpTo,8144
149
- siat-3.8.28.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
150
- siat-3.8.28.dist-info/top_level.txt,sha256=r1cVyL7AIKqeAmEJjNR8FMT20OmEzufDstC2gv3NvEY,5
151
- siat-3.8.28.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.6.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
File without changes