siat 1.3.0.6__tar.gz → 3.1.15__tar.gz

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.
Files changed (159) hide show
  1. siat-3.1.15/MANIFEST.in +3 -0
  2. siat-3.1.15/PKG-INFO +17 -0
  3. siat-3.1.15/setup.py +60 -0
  4. siat-3.1.15/siat/__init__.py +47 -0
  5. siat-3.1.15/siat/allin.py +122 -0
  6. siat-3.1.15/siat/alpha_vantage_test.py +24 -0
  7. {siat-1.3.0.6 → siat-3.1.15}/siat/assets_liquidity.py +107 -48
  8. {siat-1.3.0.6 → siat-3.1.15}/siat/assets_liquidity_test.py +8 -0
  9. siat-3.1.15/siat/barrons_scraping_test.py +270 -0
  10. {siat-1.3.0.6 → siat-3.1.15}/siat/beta_adjustment.py +132 -230
  11. siat-3.1.15/siat/beta_adjustment_china.py +548 -0
  12. {siat-1.3.0.6 → siat-3.1.15}/siat/beta_adjustment_test.py +11 -2
  13. {siat-1.3.0.6 → siat-3.1.15}/siat/blockchain.py +1 -1
  14. siat-3.1.15/siat/bond.py +2709 -0
  15. siat-3.1.15/siat/bond_base.py +991 -0
  16. siat-3.1.15/siat/bond_china.py +99 -0
  17. {siat-1.3.0.6 → siat-3.1.15}/siat/bond_test.py +21 -0
  18. siat-3.1.15/siat/bond_zh_sina.py +143 -0
  19. {siat-1.3.0.6 → siat-3.1.15}/siat/capm_beta.py +74 -40
  20. siat-3.1.15/siat/capm_beta2.py +679 -0
  21. {siat-1.3.0.6 → siat-3.1.15}/siat/capm_beta_test.py +7 -3
  22. siat-3.1.15/siat/cmat_commons.py +961 -0
  23. siat-3.1.15/siat/common.py +3829 -0
  24. siat-3.1.15/siat/compare_cross.py +642 -0
  25. siat-3.1.15/siat/compare_cross_test.py +117 -0
  26. siat-3.1.15/siat/concepts_iwencai.py +86 -0
  27. siat-3.1.15/siat/concepts_kpl.py +93 -0
  28. {siat-1.3.0.6 → siat-3.1.15}/siat/cryptocurrency.py +102 -30
  29. {siat-1.3.0.6 → siat-3.1.15}/siat/cryptocurrency_test.py +4 -0
  30. siat-1.3.0.6/siat/economy.py → siat-3.1.15/siat/economy-20230125.py +212 -74
  31. siat-3.1.15/siat/economy.py +1210 -0
  32. {siat-1.3.0.6 → siat-3.1.15}/siat/economy_test.py +42 -0
  33. {siat-1.3.0.6 → siat-3.1.15}/siat/esg.py +4 -1
  34. siat-3.1.15/siat/exchange_bond_china.pickle +0 -0
  35. {siat-1.3.0.6 → siat-3.1.15}/siat/fama_french.py +259 -31
  36. siat-3.1.15/siat/fama_french_test.py +115 -0
  37. {siat-1.3.0.6 → siat-3.1.15}/siat/financial_base.py +15 -2
  38. {siat-1.3.0.6 → siat-3.1.15}/siat/financial_statements.py +126 -19
  39. {siat-1.3.0.6 → siat-3.1.15}/siat/financials.py +488 -112
  40. siat-3.1.15/siat/financials2.py +1013 -0
  41. siat-3.1.15/siat/financials_china.py +4387 -0
  42. siat-3.1.15/siat/financials_china2.py +2167 -0
  43. siat-3.1.15/siat/financials_china2_test.py +67 -0
  44. siat-3.1.15/siat/financials_china2_test2.py +88 -0
  45. siat-3.1.15/siat/financials_china_test.py +475 -0
  46. siat-3.1.15/siat/financials_china_test2.py +197 -0
  47. siat-3.1.15/siat/financials_china_test2_fin_indicator.py +197 -0
  48. {siat-1.3.0.6 → siat-3.1.15}/siat/financials_test.py +405 -4
  49. siat-3.1.15/siat/fred_test.py +40 -0
  50. siat-3.1.15/siat/fund.py +629 -0
  51. siat-3.1.15/siat/fund_china.pickle +0 -0
  52. siat-3.1.15/siat/fund_china.py +2715 -0
  53. siat-3.1.15/siat/fund_china_test.py +175 -0
  54. siat-3.1.15/siat/fund_test.py +40 -0
  55. {siat-1.3.0.6 → siat-3.1.15}/siat/future_china.py +60 -17
  56. {siat-1.3.0.6 → siat-3.1.15}/siat/future_china_test.py +3 -1
  57. siat-3.1.15/siat/global_index_test.py +66 -0
  58. siat-3.1.15/siat/google_authenticator.py +47 -0
  59. siat-3.1.15/siat/grafix.py +2194 -0
  60. {siat-1.3.0.6 → siat-3.1.15}/siat/grafix_test.py +10 -2
  61. {siat-1.3.0.6 → siat-3.1.15}/siat/holding_risk.py +93 -37
  62. siat-3.1.15/siat/holding_risk_test.py +13 -0
  63. siat-3.1.15/siat/local_debug_test.py +100 -0
  64. siat-3.1.15/siat/market_china.py +910 -0
  65. siat-3.1.15/siat/markowitz.py +2354 -0
  66. siat-3.1.15/siat/markowitz2.py +2604 -0
  67. siat-3.1.15/siat/markowitz_ccb_test.py +37 -0
  68. siat-3.1.15/siat/markowitz_ef_test.py +136 -0
  69. siat-1.3.0.6/siat/markowitz.py → siat-3.1.15/siat/markowitz_old.py +165 -69
  70. siat-3.1.15/siat/markowitz_simple.py +373 -0
  71. siat-3.1.15/siat/markowitz_test.py +164 -0
  72. siat-3.1.15/siat/markowitz_test2.py +69 -0
  73. siat-3.1.15/siat/ml_cases.py +2291 -0
  74. siat-3.1.15/siat/ml_cases_example.py +60 -0
  75. siat-3.1.15/siat/ml_cases_example1.py +60 -0
  76. siat-3.1.15/siat/option_china.py +2805 -0
  77. siat-3.1.15/siat/option_china_test.py +447 -0
  78. {siat-1.3.0.6 → siat-3.1.15}/siat/option_pricing.py +105 -52
  79. {siat-1.3.0.6 → siat-3.1.15}/siat/option_pricing_test.py +5 -2
  80. siat-3.1.15/siat/option_sina_api_test.py +112 -0
  81. {siat-1.3.0.6 → siat-3.1.15}/siat/risk_adjusted_return.py +582 -476
  82. siat-3.1.15/siat/risk_adjusted_return2.py +1468 -0
  83. {siat-1.3.0.6 → siat-3.1.15}/siat/risk_adjusted_return_test.py +8 -1
  84. {siat-1.3.0.6 → siat-3.1.15}/siat/risk_evaluation.py +435 -127
  85. siat-3.1.15/siat/risk_evaluation_test.py +96 -0
  86. {siat-1.3.0.6 → siat-3.1.15}/siat/risk_free_rate.py +6 -3
  87. siat-3.1.15/siat/sector_china.py +3190 -0
  88. {siat-1.3.0.6 → siat-3.1.15}/siat/sector_china_test.py +54 -1
  89. siat-3.1.15/siat/security_price2.py +650 -0
  90. siat-3.1.15/siat/security_prices.py +2871 -0
  91. {siat-1.3.0.6 → siat-3.1.15}/siat/security_prices_test.py +141 -5
  92. siat-3.1.15/siat/security_trend.py +402 -0
  93. siat-3.1.15/siat/security_trend2.py +491 -0
  94. siat-3.1.15/siat/setup.py +41 -0
  95. siat-3.1.15/siat/shenwan index history test.py +41 -0
  96. {siat-1.3.0.6 → siat-3.1.15}/siat/stock.py +1583 -247
  97. siat-3.1.15/siat/stock_advice_linear.py +934 -0
  98. siat-3.1.15/siat/stock_base.py +26 -0
  99. siat-3.1.15/siat/stock_china.py +2010 -0
  100. {siat-1.3.0.6 → siat-3.1.15}/siat/stock_china_test.py +6 -6
  101. siat-3.1.15/siat/stock_info.pickle +0 -0
  102. siat-3.1.15/siat/stock_list_china_test.py +33 -0
  103. siat-3.1.15/siat/stock_prices_kneighbors.py +910 -0
  104. siat-3.1.15/siat/stock_prices_linear.py +386 -0
  105. siat-3.1.15/siat/stock_profile.py +706 -0
  106. siat-3.1.15/siat/stock_technical.py +2674 -0
  107. {siat-1.3.0.6 → siat-3.1.15}/siat/stock_test.py +191 -1
  108. siat-3.1.15/siat/stooq.py +72 -0
  109. siat-3.1.15/siat/test2_graphviz.py +484 -0
  110. siat-3.1.15/siat/test_graphviz.py +411 -0
  111. siat-3.1.15/siat/test_markowitz_simple.py +198 -0
  112. siat-3.1.15/siat/test_markowitz_simple_revised.py +215 -0
  113. siat-3.1.15/siat/test_markowitz_simple_revised2.py +218 -0
  114. {siat-1.3.0.6 → siat-3.1.15}/siat/transaction.py +29 -127
  115. {siat-1.3.0.6 → siat-3.1.15}/siat/transaction_test.py +4 -4
  116. siat-3.1.15/siat/translate.py +4215 -0
  117. siat-3.1.15/siat/translate_20240606.py +4206 -0
  118. siat-3.1.15/siat/universal_test.py +100 -0
  119. siat-3.1.15/siat/valuation.py +1315 -0
  120. siat-3.1.15/siat/valuation_china.py +1728 -0
  121. siat-3.1.15/siat/valuation_market_china_test.py +36 -0
  122. {siat-1.3.0.6 → siat-3.1.15}/siat/var_model_validation.py +90 -0
  123. siat-3.1.15/siat.egg-info/PKG-INFO +17 -0
  124. siat-3.1.15/siat.egg-info/SOURCES.txt +133 -0
  125. {siat-1.3.0.6 → siat-3.1.15}/siat.egg-info/requires.txt +11 -2
  126. siat-1.3.0.6/MANIFEST.in +0 -1
  127. siat-1.3.0.6/PKG-INFO +0 -15
  128. siat-1.3.0.6/setup.py +0 -43
  129. siat-1.3.0.6/siat/__init__.py +0 -14
  130. siat-1.3.0.6/siat/allin.py +0 -79
  131. siat-1.3.0.6/siat/bond.py +0 -1569
  132. siat-1.3.0.6/siat/bond_base.py +0 -448
  133. siat-1.3.0.6/siat/common.py +0 -789
  134. siat-1.3.0.6/siat/fama_french_test.py +0 -21
  135. siat-1.3.0.6/siat/fund_china.py +0 -1263
  136. siat-1.3.0.6/siat/fund_china_test.py +0 -101
  137. siat-1.3.0.6/siat/grafix.py +0 -796
  138. siat-1.3.0.6/siat/markowitz_test.py +0 -68
  139. siat-1.3.0.6/siat/option_china.py +0 -334
  140. siat-1.3.0.6/siat/option_china_test.py +0 -37
  141. siat-1.3.0.6/siat/risk_evaluation_test.py +0 -18
  142. siat-1.3.0.6/siat/sector_china.py +0 -593
  143. siat-1.3.0.6/siat/security_prices.py +0 -1407
  144. siat-1.3.0.6/siat/stock_china.py +0 -799
  145. siat-1.3.0.6/siat/stock_info.pickle +0 -0
  146. siat-1.3.0.6/siat/translate.py +0 -1071
  147. siat-1.3.0.6/siat/universal_test.py +0 -10
  148. siat-1.3.0.6/siat.egg-info/PKG-INFO +0 -15
  149. siat-1.3.0.6/siat.egg-info/SOURCES.txt +0 -70
  150. {siat-1.3.0.6 → siat-3.1.15}/setup.cfg +0 -0
  151. {siat-1.3.0.6 → siat-3.1.15}/siat/copyrights.py +0 -0
  152. {siat-1.3.0.6 → siat-3.1.15}/siat/esg_test.py +0 -0
  153. {siat-1.3.0.6 → siat-3.1.15}/siat/financial_statements_test.py +0 -0
  154. {siat-1.3.0.6 → siat-3.1.15}/siat/proxy_test.py +0 -0
  155. {siat-1.3.0.6 → siat-3.1.15}/siat/quandl_test.py +0 -0
  156. {siat-1.3.0.6 → siat-3.1.15}/siat/risk_free_rate_test.py +0 -0
  157. {siat-1.3.0.6 → siat-3.1.15}/siat/stock_info_test.py +0 -0
  158. {siat-1.3.0.6 → siat-3.1.15}/siat.egg-info/dependency_links.txt +0 -0
  159. {siat-1.3.0.6 → siat-3.1.15}/siat.egg-info/top_level.txt +0 -0
@@ -0,0 +1,3 @@
1
+ include siat/stock_info.pickle
2
+ include siat/exchange_bond_china.pickle
3
+ include siat/fund_china.pickle
siat-3.1.15/PKG-INFO ADDED
@@ -0,0 +1,17 @@
1
+ Metadata-Version: 2.1
2
+ Name: siat
3
+ Version: 3.1.15
4
+ Summary: Securities Investment Analysis Tools (siat)
5
+ Home-page: https://pypi.org/project/siat/
6
+ Author: Prof. WANG Dehong, International Business School, Beijing Foreign Studies University
7
+ Author-email: wdehong2000@163.com
8
+ License: Copyright (C) WANG Dehong, 2024. For educational purpose only!
9
+
10
+
11
+ Security Investment Analysis Toolkit (siat) is designed to use for making case studies in learning security investment,
12
+ where cases can be replayed, updated and re-created in different securities,
13
+ different time lines and different measurements.
14
+ The plug-in is only licensed for teaching and learning purposes, not for commercial use.
15
+ The author is not responsible for any results of applying this plug-in in real
16
+ investment activities.
17
+
siat-3.1.15/setup.py ADDED
@@ -0,0 +1,60 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ @author: WANG Dehong (Peter), IBS BFSU
4
+ """
5
+
6
+ #from __future__ import print_function
7
+ from setuptools import setup, find_packages
8
+ #import sys
9
+
10
+ setup(
11
+ name="siat",
12
+ version="3.1.15",
13
+ #author="Prof. WANG Dehong, Business School, BFSU (北京外国语大学 国际商学院 王德宏)",
14
+ author="Prof. WANG Dehong, International Business School, Beijing Foreign Studies University",
15
+ author_email="wdehong2000@163.com",
16
+ description="Securities Investment Analysis Tools (siat)",
17
+ url = "https://pypi.org/project/siat/",
18
+ long_description="""
19
+ Security Investment Analysis Toolkit (siat) is designed to use for making case studies in learning security investment,
20
+ where cases can be replayed, updated and re-created in different securities,
21
+ different time lines and different measurements.
22
+ The plug-in is only licensed for teaching and learning purposes, not for commercial use.
23
+ The author is not responsible for any results of applying this plug-in in real
24
+ investment activities.
25
+ """,
26
+ license="Copyright (C) WANG Dehong, 2024. For educational purpose only!",
27
+ packages = find_packages(),
28
+ install_requires=[
29
+ 'pandas_datareader',
30
+ 'yfinance',
31
+ #'pandas_alive','tqdm',
32
+ 'plotly_express',
33
+ #'akshare==1.3.95',#为与urllib3兼容
34
+ #'akshare==1.4.57',#为其他兼容考虑
35
+ #'akshare==1.10.3',
36
+ 'akshare',
37
+ #'urllib3==1.25.11',#为其他兼容考虑
38
+ 'urllib3',
39
+ #'urllib3',
40
+ 'mplfinance',
41
+ 'statsmodels',
42
+ 'yahoo_earnings_calendar',
43
+ #'yahooquery==2.2.14',#为其他兼容考虑
44
+ 'yahooquery',
45
+ 'pypinyin',
46
+ 'seaborn',
47
+ 'numpy',
48
+ 'scipy',
49
+ #'pandas==1.5.3',#为其他兼容考虑
50
+ 'pandas',
51
+ 'scikit-learn',
52
+ 'baostock',
53
+ 'pyproject.toml',
54
+ #'ta-lib',
55
+ 'pathlib','ruamel-yaml','prettytable','graphviz','luddite',
56
+ 'pendulum',
57
+ ],
58
+ #zip_sage=False,
59
+ include_package_data=True, # 打包包含静态文件标识
60
+ )
@@ -0,0 +1,47 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ 功能:一次性引入SIAT的所有模块
4
+ 作者:王德宏,北京外国语大学国际商学院
5
+ 版权:2021-2024(C) 仅限教学使用,商业使用需要授权
6
+ 联络:wdehong2000@163.com
7
+ """
8
+
9
+ #==============================================================================
10
+ #屏蔽所有警告性信息
11
+ import warnings; warnings.filterwarnings('ignore')
12
+ #==============================================================================
13
+ from siat.allin import *
14
+ #==============================================================================
15
+ #同一命令行多个输出,主要用于Jupyter Notebook
16
+ from IPython.core.interactiveshell import InteractiveShell
17
+ InteractiveShell.ast_node_interactivity='all'
18
+ #==============================================================================
19
+ # 检查是否存在新版本
20
+ try:
21
+ import pkg_resources
22
+ current_version=pkg_resources.get_distribution("siat").version
23
+ print("Successfully imported siat version",current_version)
24
+
25
+ import luddite
26
+ latest_version=luddite.get_version_pypi("siat")
27
+
28
+ if latest_version != current_version:
29
+ print("The latest version of siat is",latest_version,'\n')
30
+ print("*** If you expect to upgrade siat in Anaconda Prompt, use the instruction below:")
31
+ print(" pip install siat --upgrade")
32
+ print("*** If you expect to upgrade in Jupyter, add a \'!\' right before the instruction above",'\n')
33
+
34
+ print("*** If you encounter incompatible plug-in, try to uninstall siat first and reinstall it:")
35
+ print(" pip uninstall siat")
36
+ print(" pip install siat",'\n')
37
+
38
+ print("*** If you have a slow internet connection, use an option after the instruction above:")
39
+ print(" -i https://mirrors.aliyun.com/pypi/simple/",'\n')
40
+
41
+ print("If you have done any of the above, restart the Python (eg. restarting the kernel)")
42
+ print("Provided you still need additional help, please contact wdehong2000@163.com")
43
+ except:
44
+ pass
45
+
46
+
47
+ #==============================================================================
@@ -0,0 +1,122 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ 功能:一次性引入SIAT的所有模块
4
+ 作者:王德宏,北京外国语大学国际商学院
5
+ 版权:2022(C) 仅限教学使用,商业使用需要授权
6
+ 联络:wdehong2000@163.com
7
+ """
8
+
9
+ # 资产流动性
10
+ from siat.assets_liquidity import *
11
+
12
+ # 贝塔系数调整方法
13
+ from siat.beta_adjustment import *
14
+ from siat.beta_adjustment_china import *
15
+
16
+ # 债券
17
+ from siat.bond import *
18
+
19
+ # 资本资产定价模型
20
+ from siat.capm_beta import *
21
+ from siat.capm_beta2 import *
22
+
23
+ # 数字货币
24
+ from siat.cryptocurrency import *
25
+
26
+ # 宏观经济
27
+ from siat.economy import *
28
+
29
+ # ESG
30
+ from siat.esg import *
31
+
32
+ # 资产定价-多因子模型
33
+ from siat.fama_french import *
34
+
35
+ # 财务报表:雅虎源
36
+ from siat.financial_statements import *
37
+
38
+ # 财务分析:雅虎源
39
+ from siat.financials import *
40
+
41
+ # 财务分析:雅虎源
42
+ from siat.financials2 import *
43
+
44
+ # 财务分析:中国
45
+ from siat.financials_china import *
46
+
47
+ # 财务分析:中国,资产负债结构分析
48
+ from siat.financials_china2 import *
49
+
50
+ # 中国的基金
51
+ from siat.fund_china import *
52
+
53
+ # 中国的期货(内盘与部分外盘)
54
+ from siat.future_china import *
55
+
56
+ # 中国的期权
57
+ from siat.option_china import *
58
+
59
+ # 资产的持有风险
60
+ from siat.holding_risk import *
61
+
62
+ # 投资组合理论
63
+ #from siat.markowitz import *
64
+ from siat.markowitz2 import *
65
+
66
+ # 投资组合理论自助式示意图
67
+ #from siat.markowitz_simple import *
68
+
69
+ # 期权定价
70
+ from siat.option_pricing import *
71
+
72
+ # 风险调整收益
73
+ from siat.risk_adjusted_return import *
74
+ from siat.risk_adjusted_return2 import *
75
+
76
+ # 风险评估
77
+ from siat.risk_evaluation import *
78
+
79
+ # 中国的行业分析
80
+ from siat.sector_china import *
81
+
82
+ # 股票/行业指数估值:美股,港股,A股,波兰股,指数
83
+ from siat.valuation import *
84
+
85
+ # 中国股票/市场估值
86
+ from siat.valuation_china import *
87
+
88
+ # 获取证券价格与计算
89
+ from siat.security_prices import *
90
+ from siat.security_price2 import *
91
+
92
+ # 股票分析
93
+ from siat.stock import *
94
+
95
+ # 股票趋势分析,集成函数
96
+ from siat.security_trend2 import *
97
+
98
+ # 中国的股票
99
+ from siat.stock_china import *
100
+
101
+ # 中国股票市场概况
102
+ from siat.market_china import *
103
+
104
+ # 证券交易-套壳
105
+ from siat.transaction import *
106
+
107
+ # 持有资产风险-模型验证
108
+ from siat.var_model_validation import *
109
+
110
+ # 跨种类比较分析
111
+ from siat.compare_cross import *
112
+
113
+ # 机器学习-课程案例
114
+ #from siat.ml_cases import *
115
+ #from siat.stock_advice_linear import *
116
+
117
+ # 股票技术分析
118
+ from siat.stock_technical import *
119
+
120
+ # 2FA: Google Authenticator
121
+ from siat.google_authenticator import *
122
+
@@ -0,0 +1,24 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ """
4
+ 功能:测试新的插件,仅限测试使用
5
+ 作者:王德宏,北京外国语大学国际商学院
6
+ 版权:2022(C) 仅限教学使用,商业使用需要授权
7
+ 联络:wdehong2000@163.com
8
+ """
9
+
10
+ # 绝对引用指定目录中的模块
11
+ import sys
12
+ sys.path.insert(0,r'S:\siat\siat')
13
+
14
+
15
+ #========================================================================
16
+ from alpha_vantage.timeseries import TimeSeries
17
+ ts = TimeSeries(key='J4L80CM3ATCKNONG', output_format='pandas', indexing_type='date')
18
+ data, meta_data = ts.get_daily('GOOGL', outputsize='full')
19
+ data, meta_data = ts.get_daily('FCHI', outputsize='full')
20
+
21
+
22
+
23
+ #========================================================================
24
+
@@ -19,6 +19,7 @@ from siat.common import *
19
19
  from siat.translate import *
20
20
  from siat.grafix import *
21
21
  from siat.security_prices import *
22
+ from siat.security_price2 import *
22
23
  #==============================================================================
23
24
  import matplotlib.pyplot as plt
24
25
 
@@ -90,13 +91,13 @@ def roll_spread_portfolio(portfolio,start,end,printout=True):
90
91
  #检查日期和期间的合理性
91
92
  flag,start2,end2=check_period(start,end)
92
93
  if not flag:
93
- print("#Error(roll_spread_portfolio): invalid period for,", start, end)
94
+ print(" #Error(roll_spread_portfolio): invalid period for,", start, end)
94
95
  return None
95
96
 
96
97
  #抓取股票价格,构建投资组合价格
97
98
  sp=get_portfolio_prices(portfolio,start2,end2)
98
99
  if sp is None:
99
- print("#Error(roll_spread_portfolio): portfolio info not available.")
100
+ print(" #Error(roll_spread_portfolio): portfolio info not available.")
100
101
  return None
101
102
 
102
103
  #计算罗尔价差指标
@@ -109,7 +110,13 @@ def roll_spread_portfolio(portfolio,start,end,printout=True):
109
110
  date_end=str(sp.index[-1].year)+'-'+str(sp.index[-1].month)+ \
110
111
  '-'+str(sp.index[-1].day)
111
112
  print("\n===== 投资组合的流动性风险 =====")
112
- print("投资组合:",portfolio)
113
+
114
+ _,_,tickerlist,sharelist=decompose_portfolio(portfolio)
115
+ if len(tickerlist)==1:
116
+ product=str(ticker_name(tickerlist,'bond'))
117
+ else:
118
+ product=str(ticker_name(tickerlist))+' by '+str(sharelist)
119
+ print("投资组合:",product)
113
120
  print("计算期间:",date_start,"to",date_end, \
114
121
  "(可用日期)")
115
122
  print("罗尔价差%:",rs_pct)
@@ -168,7 +175,7 @@ def amihud_illiquidity_portfolio(portfolio,start,end,printout=True):
168
175
  #检查日期和期间的合理性
169
176
  flag,start2,end2=check_period(start,end)
170
177
  if not flag:
171
- print("#Error(amihud_illiquidity_portfolio): invalid period for,", start, end)
178
+ print(" #Error(amihud_illiquidity_portfolio): invalid period for,", start, end)
172
179
  return None
173
180
 
174
181
  #抓取股票价格,构建投资组合价格
@@ -184,7 +191,13 @@ def amihud_illiquidity_portfolio(portfolio,start,end,printout=True):
184
191
  date_end=str(sp.index[-1].year)+'-'+str(sp.index[-1].month)+ \
185
192
  '-'+str(sp.index[-1].day)
186
193
  print("\n===== 投资组合的流动性风险 =====")
187
- print("投资组合:",portfolio)
194
+
195
+ _,_,tickerlist,sharelist=decompose_portfolio(portfolio)
196
+ if len(tickerlist)==1:
197
+ product=str(ticker_name(tickerlist,'bond'))
198
+ else:
199
+ product=str(ticker_name(tickerlist))+' by '+str(sharelist)
200
+ print("投资组合:",product)
188
201
  print("计算期间:",date_start,"至",date_end, \
189
202
  "(可用日期)")
190
203
  print("阿米胡德非流动性:",amihud,"(对数算法)")
@@ -232,7 +245,7 @@ def calc_ps_liquidity(pfdf):
232
245
  try:
233
246
  [alpha,beta,psl]=results.params
234
247
  except:
235
- print("#Error(calc_ps_liquidity): failed to extract reg parms",results.params)
248
+ print(" #Error(calc_ps_liquidity): failed to extract reg parms",results.params)
236
249
  return None
237
250
 
238
251
  return round(psl,4)
@@ -308,7 +321,7 @@ def ps_liquidity_portfolio(portfolio,start,end,printout=True):
308
321
  #检查日期和期间的合理性
309
322
  flag,start2,end2=check_period(start,end)
310
323
  if not flag:
311
- print("#Error(amihud_illiquidity_portfolio): invalid period for,", start, end)
324
+ print(" #Error(amihud_illiquidity_portfolio): invalid period for,", start, end)
312
325
  return None
313
326
 
314
327
  #抓取股票价格,构建投资组合价格
@@ -324,7 +337,13 @@ def ps_liquidity_portfolio(portfolio,start,end,printout=True):
324
337
  date_end=str(sp.index[-1].year)+'-'+str(sp.index[-1].month)+ \
325
338
  '-'+str(sp.index[-1].day)
326
339
  print("\n===== 投资组合的流动性风险 =====")
327
- print("投资组合:",portfolio)
340
+
341
+ _,_,tickerlist,sharelist=decompose_portfolio(portfolio)
342
+ if len(tickerlist)==1:
343
+ product=str(ticker_name(tickerlist,'bond'))
344
+ else:
345
+ product=str(ticker_name(tickerlist))+' by '+str(sharelist)
346
+ print("投资组合:",product)
328
347
  print("计算期间:",date_start,"to",date_end, \
329
348
  "(可用日期)")
330
349
  print("Pastor-Stambaugh流动性:",psl,"(对数算法)")
@@ -354,29 +373,29 @@ def plot_liquidity_monthly(portfolio,start,end,liquidity_type):
354
373
  #检查日期和期间的合理性
355
374
  flag,start2,end2=check_period(start,end)
356
375
  if not flag:
357
- print("#Error(plot_liquidity_monthly): invalid period for,", start, end)
376
+ print(" #Error(plot_liquidity_monthly): invalid period for,", start, end)
358
377
  return None
359
378
 
360
379
  #检查:支持的liquidity_type
361
380
  liquidity_list=['roll_spread','amihud_illiquidity','ps_liquidity']
362
381
  if liquidity_type not in liquidity_list:
363
- print("#Error(plot_liquidity_monthly): not supported liquidity type")
364
- print("Supported liquidity type:",liquidity_list)
382
+ print(" #Error(plot_liquidity_monthly): not supported liquidity type")
383
+ print(" Supported liquidity type:",liquidity_list)
365
384
  return None
366
385
 
367
386
  #抓取投资组合信息
368
- print("\n... Searching for portfolio information ...")
387
+ print("\n Searching for portfolio information ...")
369
388
  df=get_portfolio_prices(portfolio,start,end)
370
389
 
371
390
  #拆分start/end之间的各个年份和月份
372
391
  mdlist=calc_monthly_date_range(start,end)
373
392
  if len(mdlist) == 0:
374
- print("#Error(plot_liquidity_monthly): start/end dates inappropriate")
393
+ print(" #Error(plot_liquidity_monthly): start/end dates inappropriate")
375
394
  return None
376
395
 
377
396
  #用于保存流动性指标
378
397
  import pandas as pd
379
- print("... Calculating monthly",liquidity_type,"...")
398
+ print(" Calculating monthly",liquidity_type,"...")
380
399
  rarfunc='calc_'+liquidity_type
381
400
  rars=pd.DataFrame(columns=('YM','rar'))
382
401
  zeroline=False
@@ -391,7 +410,10 @@ def plot_liquidity_monthly(portfolio,start,end,liquidity_type):
391
410
 
392
411
  if rar < 0: zeroline=True
393
412
  row=pd.Series({'YM':YM,'rar':rar})
394
- rars=rars.append(row,ignore_index=True)
413
+ try:
414
+ rars=rars.append(row,ignore_index=True)
415
+ except:
416
+ rars=rars._append(row,ignore_index=True)
395
417
  #print("completed.")
396
418
  rars.set_index('YM',inplace=True)
397
419
 
@@ -403,11 +425,11 @@ def plot_liquidity_monthly(portfolio,start,end,liquidity_type):
403
425
 
404
426
  _,_,tickerlist,sharelist=decompose_portfolio(portfolio)
405
427
  if len(tickerlist)==1:
406
- product=str(tickerlist)
428
+ product=str(ticker_name(tickerlist,'bond'))
407
429
  else:
408
- product=str(tickerlist)+' in '+str(sharelist)
430
+ product=str(ticker_name(tickerlist))+' by '+str(sharelist)
409
431
  import datetime as dt; today=dt.date.today()
410
- footnote="证券="+product+"\n数据来源:雅虎财经, "+str(today)
432
+ footnote="证券="+product+"\n数据来源:新浪/stooq, "+str(today)
411
433
  datatag=False
412
434
  power=4
413
435
  plot_line(rars,colname,collabel,ylabeltxt,titletxt,footnote,datatag, \
@@ -451,28 +473,28 @@ def plot_liquidity_annual(portfolio,start,end,liquidity_type):
451
473
  #检查日期和期间的合理性
452
474
  flag,start2,end2=check_period(start,end)
453
475
  if not flag:
454
- print("#Error(plot_liquidity_annual): invalid period for,", start, end)
476
+ print(" #Error(plot_liquidity_annual): invalid period for,", start, end)
455
477
  return None
456
478
 
457
479
  #检查:支持的liquidity_type
458
480
  liquidity_list=['roll_spread','amihud_illiquidity','ps_liquidity']
459
481
  if liquidity_type not in liquidity_list:
460
- print("#Error(plot_liquidity_annual): not supported liquidity type")
461
- print("Supported liquidity type:",liquidity_list)
482
+ print(" #Error(plot_liquidity_annual): not supported liquidity type")
483
+ print(" Supported liquidity type:",liquidity_list)
462
484
  return None
463
485
 
464
486
  #抓取投资组合信息
465
- print("\n... Searching for portfolio information ...")
487
+ print("\n Searching for portfolio information ...")
466
488
  df=get_portfolio_prices(portfolio,start,end)
467
489
 
468
490
  #拆分start/end之间的各个年份和月份
469
491
  mdlist=calc_yearly_date_range(start,end)
470
492
  if len(mdlist) == 0:
471
- print("#Error(plot_liquidity_annual): start/end dates inappropriate")
493
+ print(" #Error(plot_liquidity_annual): start/end dates inappropriate")
472
494
  return None
473
495
 
474
496
  #用于保存指标
475
- print("... Calculating annual",liquidity_type,"...")
497
+ print(" Calculating annual",liquidity_type,"...")
476
498
  rarfunc='calc_'+liquidity_type
477
499
  import pandas as pd
478
500
  rars=pd.DataFrame(columns=('YR','liquidity'))
@@ -487,7 +509,10 @@ def plot_liquidity_annual(portfolio,start,end,liquidity_type):
487
509
  if rar is not None:
488
510
  if rar < 0: zeroline=True
489
511
  row=pd.Series({'YR':YR,'liquidity':rar})
490
- rars=rars.append(row,ignore_index=True)
512
+ try:
513
+ rars=rars.append(row,ignore_index=True)
514
+ except:
515
+ rars=rars._append(row,ignore_index=True)
491
516
  rars.set_index('YR',inplace=True)
492
517
 
493
518
  #绘图
@@ -498,9 +523,9 @@ def plot_liquidity_annual(portfolio,start,end,liquidity_type):
498
523
 
499
524
  _,_,tickerlist,sharelist=decompose_portfolio(portfolio)
500
525
  if len(tickerlist)==1:
501
- product=str(tickerlist)
526
+ product=str(ticker_name(tickerlist,'bond'))
502
527
  else:
503
- product=str(tickerlist)+' in '+str(sharelist)
528
+ product=str(ticker_name(tickerlist,'bond'))+' by '+str(sharelist)
504
529
 
505
530
  import datetime as dt; today=dt.date.today()
506
531
  footnote="证券="+product+"\n数据来源:雅虎财经, "+str(today)
@@ -542,12 +567,12 @@ def draw_liquidity(liqs):
542
567
 
543
568
  _,_,tickerlist,sharelist=decompose_portfolio(portfolio)
544
569
  if len(tickerlist)==1:
545
- product=str(tickerlist)
570
+ product=str(ticker_name(tickerlist))
546
571
  else:
547
- product=str(tickerlist)+' in '+str(sharelist)
572
+ product=str(ticker_name(tickerlist,'bond'))+' by '+str(sharelist)
548
573
 
549
574
  import datetime as dt; today=dt.date.today()
550
- footnote="证券="+product+"\n数据来源:雅虎财经, "+str(today)
575
+ footnote="证券="+product+"\n数据来源:新浪/stooq, "+str(today)
551
576
  datatag=False
552
577
  power=4
553
578
 
@@ -574,25 +599,25 @@ def liquidity_rolling(portfolio,start,end,liquidity_type, \
574
599
  #检查日期和期间的合理性
575
600
  flag,start2,end2=check_period(start,end)
576
601
  if not flag:
577
- print("#Error(liquidity_rolling): invalid period for,", start, end)
602
+ print(" #Error(liquidity_rolling): invalid period for,", start, end)
578
603
  return None
579
604
 
580
605
  #检查:支持的liquidity_type
581
606
  liquidity_list=['roll_spread','amihud_illiquidity','ps_liquidity']
582
607
  if liquidity_type not in liquidity_list:
583
- print("#Error(liquidity_rolling): not supported liquidity type")
584
- print("Supported liquidity type:",liquidity_list)
608
+ print(" #Error(liquidity_rolling): not supported liquidity type")
609
+ print(" Supported liquidity type:",liquidity_list)
585
610
  return None
586
611
 
587
612
  #抓取投资组合信息
588
- print("\n... Searching information for portfolio:",portfolio)
613
+ print("\n Searching information for portfolio:",portfolio)
589
614
  reg=get_portfolio_prices(portfolio,start,end)
590
615
  if reg is None:
591
- print("#Error(liquidity_rolling): failed to get portfolio info")
616
+ print(" #Error(liquidity_rolling): failed to get portfolio info")
592
617
  return None
593
618
 
594
619
  #滚动计算
595
- print("... Calculating its rolling ratios:",liquidity_type)
620
+ print(" Calculating its rolling ratios:",liquidity_type)
596
621
  import pandas as pd; import numpy as np
597
622
  datelist=reg.index.to_list()
598
623
  calc_func='calc_'+liquidity_type
@@ -613,7 +638,10 @@ def liquidity_rolling(portfolio,start,end,liquidity_type, \
613
638
 
614
639
  #记录计算结果
615
640
  row=pd.Series({'Portfolio':portfolio,'Date':datelist[i1-1],'Ratio':liq,'Type':liquidity_type})
616
- liqs=liqs.append(row,ignore_index=True)
641
+ try:
642
+ liqs=liqs.append(row,ignore_index=True)
643
+ except:
644
+ liqs=liqs._append(row,ignore_index=True)
617
645
 
618
646
  liqs.set_index(['Date'],inplace=True)
619
647
 
@@ -635,16 +663,31 @@ if __name__=='__main__':
635
663
 
636
664
 
637
665
  #==============================================================================
666
+ #==============================================================================
667
+ def compare_liquidity(portfolio1,portfolio2,start,end,liquidity_type,window=30):
668
+ """
669
+ 功能:套壳函数compare_liquidity_rolling,无差异,保持兼容性
670
+ """
671
+
672
+ compare_liquidity_rolling(portfolio1=portfolio1,portfolio2=portfolio2, \
673
+ start=start,end=end,liquidity_type=liquidity_type, \
674
+ window=window)
675
+
676
+ return
677
+
638
678
  #==============================================================================
639
679
  def compare_liquidity_rolling(portfolio1,portfolio2,start,end,liquidity_type,window=30):
640
680
  """
641
681
  功能:比较两个投资组合portfolio1和portfolio2在start至end期间的流动性指标liquidity_type
642
682
  """
643
683
  #投资组合1
684
+ pf1name=portfolio_name(portfolio1)
685
+ if pf1name == '投资组合':
686
+ pf1name == '组合1'
644
687
  liqs1=liquidity_rolling(portfolio1,start,end,liquidity_type, \
645
688
  window=window,graph=False)
646
689
  if liqs1 is None:
647
- print("#Error(compare_liquidity_rolling): portfolio info inaccesible for",portfolio1)
690
+ print(" #Error(compare_liquidity_rolling): portfolio info inaccesible for",portfolio1)
648
691
  return
649
692
 
650
693
  colname1='Ratio'
@@ -656,10 +699,14 @@ def compare_liquidity_rolling(portfolio1,portfolio2,start,end,liquidity_type,win
656
699
  if len(neg_liqs1) > 0: zeroline=True
657
700
 
658
701
  #投资组合2
702
+ pf2name=portfolio_name(portfolio2)
703
+ if pf2name == '投资组合':
704
+ pf2name == '组合2'
705
+
659
706
  liqs2=liquidity_rolling(portfolio2,start,end,liquidity_type, \
660
707
  window=window,graph=False)
661
708
  if liqs2 is None:
662
- print("#Error(compare_liquidity_rolling): portfolio info inaccesible for",portfolio2)
709
+ print(" #Error(compare_liquidity_rolling): portfolio info inaccesible for",portfolio2)
663
710
  return
664
711
 
665
712
  colname2='Ratio'
@@ -672,27 +719,39 @@ def compare_liquidity_rolling(portfolio1,portfolio2,start,end,liquidity_type,win
672
719
 
673
720
  #绘图
674
721
  ylabeltxt=ectranslate(liquidity_type)
675
- titletxt="证券流动性风险的滚动趋势比较"
722
+ titletxt="证券流动性风险走势比较"
676
723
 
677
724
  _,_,tickerlist1,sharelist1=decompose_portfolio(portfolio1)
678
725
  if len(tickerlist1)==1:
679
- product1=str(tickerlist1)
726
+ product1=str(ticker_name(tickerlist1,'bond'))
680
727
  else:
681
- product1=str(tickerlist1)+',持仓'+str(sharelist1)
728
+ product1=str(ticker_name(tickerlist1,'bond'))+',持仓'+str(sharelist1)
682
729
  _,_,tickerlist2,sharelist2=decompose_portfolio(portfolio2)
683
730
  if len(tickerlist2)==1:
684
- product2=str(tickerlist2)
731
+ product2=str(ticker_name(tickerlist2,'bond'))
685
732
  else:
686
- product2=str(tickerlist2)+',持仓'+str(sharelist2)
733
+ product2=str(ticker_name(tickerlist2,'bond'))+',持仓'+str(sharelist2)
687
734
 
688
735
  import datetime as dt; today=dt.date.today()
689
- footnote="证券1="+product1+"\n证券2="+product2+ \
690
- "\n数据来源:雅虎财经, "+str(today)
736
+ """
737
+ footnote=pf1name+":"+product1+"\n"+pf2name+":"+product2+ \
738
+ "\n数据来源:新浪/stooq, "+str(today)
739
+ """
740
+ if liquidity_type == 'amihud_illiquidity':
741
+ notes="注:图中阿米胡德指标采用对数算法\n"
742
+ else:
743
+ notes=''
744
+ footnote= notes+"数据来源:新浪/stooq, "+str(today)
691
745
  power=0 #不绘制趋势线
692
746
 
693
- plot_line2_coaxial(liqs1,"证券1",colname1,label1, \
694
- liqs2,"证券2",colname2,label2, \
747
+ plot_line2_coaxial(liqs1,pf1name,colname1,label1, \
748
+ liqs2,pf2name,colname2,label2, \
695
749
  ylabeltxt,titletxt,footnote,power,datatag1,datatag2,zeroline)
750
+
751
+ print("\n*** 投资组合的成分股与持仓比例")
752
+ print(pf1name+":"+product1)
753
+ print(pf2name+":"+product2)
754
+
696
755
  return
697
756
 
698
757
 
@@ -1,6 +1,14 @@
1
1
  # -*- coding: utf-8 -*-
2
2
 
3
3
  import os; os.chdir("S:\siat")
4
+ from siat import *
5
+ #==============================================================================
6
+ hn_cn={'Market':('China','000001.SS'),'601633.SS':1,'600104.SS':1,'002594.SZ':1}
7
+ rsp=roll_spread_portfolio(hn_cn,'2020-1-1','2021-11-30')
8
+ hb_cn={'Market':('China','000001.SS'),'600135.SS':2,'600559.SS':3,'600340.SS':1}
9
+ compare_liquidity_rolling(hn_cn,hb_cn,'2021-7-1','2021-11-30','roll_spread',30)
10
+
11
+ #==============================================================================
4
12
  from siat.assets_liquidity import *
5
13
 
6
14
  portfolio={'Market':('China','000001.SS'),'600011.SS':1}