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.
- siat-3.1.15/MANIFEST.in +3 -0
- siat-3.1.15/PKG-INFO +17 -0
- siat-3.1.15/setup.py +60 -0
- siat-3.1.15/siat/__init__.py +47 -0
- siat-3.1.15/siat/allin.py +122 -0
- siat-3.1.15/siat/alpha_vantage_test.py +24 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/assets_liquidity.py +107 -48
- {siat-1.3.0.6 → siat-3.1.15}/siat/assets_liquidity_test.py +8 -0
- siat-3.1.15/siat/barrons_scraping_test.py +270 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/beta_adjustment.py +132 -230
- siat-3.1.15/siat/beta_adjustment_china.py +548 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/beta_adjustment_test.py +11 -2
- {siat-1.3.0.6 → siat-3.1.15}/siat/blockchain.py +1 -1
- siat-3.1.15/siat/bond.py +2709 -0
- siat-3.1.15/siat/bond_base.py +991 -0
- siat-3.1.15/siat/bond_china.py +99 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/bond_test.py +21 -0
- siat-3.1.15/siat/bond_zh_sina.py +143 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/capm_beta.py +74 -40
- siat-3.1.15/siat/capm_beta2.py +679 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/capm_beta_test.py +7 -3
- siat-3.1.15/siat/cmat_commons.py +961 -0
- siat-3.1.15/siat/common.py +3829 -0
- siat-3.1.15/siat/compare_cross.py +642 -0
- siat-3.1.15/siat/compare_cross_test.py +117 -0
- siat-3.1.15/siat/concepts_iwencai.py +86 -0
- siat-3.1.15/siat/concepts_kpl.py +93 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/cryptocurrency.py +102 -30
- {siat-1.3.0.6 → siat-3.1.15}/siat/cryptocurrency_test.py +4 -0
- siat-1.3.0.6/siat/economy.py → siat-3.1.15/siat/economy-20230125.py +212 -74
- siat-3.1.15/siat/economy.py +1210 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/economy_test.py +42 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/esg.py +4 -1
- siat-3.1.15/siat/exchange_bond_china.pickle +0 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/fama_french.py +259 -31
- siat-3.1.15/siat/fama_french_test.py +115 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/financial_base.py +15 -2
- {siat-1.3.0.6 → siat-3.1.15}/siat/financial_statements.py +126 -19
- {siat-1.3.0.6 → siat-3.1.15}/siat/financials.py +488 -112
- siat-3.1.15/siat/financials2.py +1013 -0
- siat-3.1.15/siat/financials_china.py +4387 -0
- siat-3.1.15/siat/financials_china2.py +2167 -0
- siat-3.1.15/siat/financials_china2_test.py +67 -0
- siat-3.1.15/siat/financials_china2_test2.py +88 -0
- siat-3.1.15/siat/financials_china_test.py +475 -0
- siat-3.1.15/siat/financials_china_test2.py +197 -0
- siat-3.1.15/siat/financials_china_test2_fin_indicator.py +197 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/financials_test.py +405 -4
- siat-3.1.15/siat/fred_test.py +40 -0
- siat-3.1.15/siat/fund.py +629 -0
- siat-3.1.15/siat/fund_china.pickle +0 -0
- siat-3.1.15/siat/fund_china.py +2715 -0
- siat-3.1.15/siat/fund_china_test.py +175 -0
- siat-3.1.15/siat/fund_test.py +40 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/future_china.py +60 -17
- {siat-1.3.0.6 → siat-3.1.15}/siat/future_china_test.py +3 -1
- siat-3.1.15/siat/global_index_test.py +66 -0
- siat-3.1.15/siat/google_authenticator.py +47 -0
- siat-3.1.15/siat/grafix.py +2194 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/grafix_test.py +10 -2
- {siat-1.3.0.6 → siat-3.1.15}/siat/holding_risk.py +93 -37
- siat-3.1.15/siat/holding_risk_test.py +13 -0
- siat-3.1.15/siat/local_debug_test.py +100 -0
- siat-3.1.15/siat/market_china.py +910 -0
- siat-3.1.15/siat/markowitz.py +2354 -0
- siat-3.1.15/siat/markowitz2.py +2604 -0
- siat-3.1.15/siat/markowitz_ccb_test.py +37 -0
- siat-3.1.15/siat/markowitz_ef_test.py +136 -0
- siat-1.3.0.6/siat/markowitz.py → siat-3.1.15/siat/markowitz_old.py +165 -69
- siat-3.1.15/siat/markowitz_simple.py +373 -0
- siat-3.1.15/siat/markowitz_test.py +164 -0
- siat-3.1.15/siat/markowitz_test2.py +69 -0
- siat-3.1.15/siat/ml_cases.py +2291 -0
- siat-3.1.15/siat/ml_cases_example.py +60 -0
- siat-3.1.15/siat/ml_cases_example1.py +60 -0
- siat-3.1.15/siat/option_china.py +2805 -0
- siat-3.1.15/siat/option_china_test.py +447 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/option_pricing.py +105 -52
- {siat-1.3.0.6 → siat-3.1.15}/siat/option_pricing_test.py +5 -2
- siat-3.1.15/siat/option_sina_api_test.py +112 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/risk_adjusted_return.py +582 -476
- siat-3.1.15/siat/risk_adjusted_return2.py +1468 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/risk_adjusted_return_test.py +8 -1
- {siat-1.3.0.6 → siat-3.1.15}/siat/risk_evaluation.py +435 -127
- siat-3.1.15/siat/risk_evaluation_test.py +96 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/risk_free_rate.py +6 -3
- siat-3.1.15/siat/sector_china.py +3190 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/sector_china_test.py +54 -1
- siat-3.1.15/siat/security_price2.py +650 -0
- siat-3.1.15/siat/security_prices.py +2871 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/security_prices_test.py +141 -5
- siat-3.1.15/siat/security_trend.py +402 -0
- siat-3.1.15/siat/security_trend2.py +491 -0
- siat-3.1.15/siat/setup.py +41 -0
- siat-3.1.15/siat/shenwan index history test.py +41 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/stock.py +1583 -247
- siat-3.1.15/siat/stock_advice_linear.py +934 -0
- siat-3.1.15/siat/stock_base.py +26 -0
- siat-3.1.15/siat/stock_china.py +2010 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/stock_china_test.py +6 -6
- siat-3.1.15/siat/stock_info.pickle +0 -0
- siat-3.1.15/siat/stock_list_china_test.py +33 -0
- siat-3.1.15/siat/stock_prices_kneighbors.py +910 -0
- siat-3.1.15/siat/stock_prices_linear.py +386 -0
- siat-3.1.15/siat/stock_profile.py +706 -0
- siat-3.1.15/siat/stock_technical.py +2674 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/stock_test.py +191 -1
- siat-3.1.15/siat/stooq.py +72 -0
- siat-3.1.15/siat/test2_graphviz.py +484 -0
- siat-3.1.15/siat/test_graphviz.py +411 -0
- siat-3.1.15/siat/test_markowitz_simple.py +198 -0
- siat-3.1.15/siat/test_markowitz_simple_revised.py +215 -0
- siat-3.1.15/siat/test_markowitz_simple_revised2.py +218 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/transaction.py +29 -127
- {siat-1.3.0.6 → siat-3.1.15}/siat/transaction_test.py +4 -4
- siat-3.1.15/siat/translate.py +4215 -0
- siat-3.1.15/siat/translate_20240606.py +4206 -0
- siat-3.1.15/siat/universal_test.py +100 -0
- siat-3.1.15/siat/valuation.py +1315 -0
- siat-3.1.15/siat/valuation_china.py +1728 -0
- siat-3.1.15/siat/valuation_market_china_test.py +36 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/var_model_validation.py +90 -0
- siat-3.1.15/siat.egg-info/PKG-INFO +17 -0
- siat-3.1.15/siat.egg-info/SOURCES.txt +133 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat.egg-info/requires.txt +11 -2
- siat-1.3.0.6/MANIFEST.in +0 -1
- siat-1.3.0.6/PKG-INFO +0 -15
- siat-1.3.0.6/setup.py +0 -43
- siat-1.3.0.6/siat/__init__.py +0 -14
- siat-1.3.0.6/siat/allin.py +0 -79
- siat-1.3.0.6/siat/bond.py +0 -1569
- siat-1.3.0.6/siat/bond_base.py +0 -448
- siat-1.3.0.6/siat/common.py +0 -789
- siat-1.3.0.6/siat/fama_french_test.py +0 -21
- siat-1.3.0.6/siat/fund_china.py +0 -1263
- siat-1.3.0.6/siat/fund_china_test.py +0 -101
- siat-1.3.0.6/siat/grafix.py +0 -796
- siat-1.3.0.6/siat/markowitz_test.py +0 -68
- siat-1.3.0.6/siat/option_china.py +0 -334
- siat-1.3.0.6/siat/option_china_test.py +0 -37
- siat-1.3.0.6/siat/risk_evaluation_test.py +0 -18
- siat-1.3.0.6/siat/sector_china.py +0 -593
- siat-1.3.0.6/siat/security_prices.py +0 -1407
- siat-1.3.0.6/siat/stock_china.py +0 -799
- siat-1.3.0.6/siat/stock_info.pickle +0 -0
- siat-1.3.0.6/siat/translate.py +0 -1071
- siat-1.3.0.6/siat/universal_test.py +0 -10
- siat-1.3.0.6/siat.egg-info/PKG-INFO +0 -15
- siat-1.3.0.6/siat.egg-info/SOURCES.txt +0 -70
- {siat-1.3.0.6 → siat-3.1.15}/setup.cfg +0 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/copyrights.py +0 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/esg_test.py +0 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/financial_statements_test.py +0 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/proxy_test.py +0 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/quandl_test.py +0 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/risk_free_rate_test.py +0 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat/stock_info_test.py +0 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat.egg-info/dependency_links.txt +0 -0
- {siat-1.3.0.6 → siat-3.1.15}/siat.egg-info/top_level.txt +0 -0
siat-3.1.15/MANIFEST.in
ADDED
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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("
|
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
|
-
|
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)+'
|
430
|
+
product=str(ticker_name(tickerlist))+' by '+str(sharelist)
|
409
431
|
import datetime as dt; today=dt.date.today()
|
410
|
-
footnote="证券="+product+"\n
|
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
|
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("
|
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
|
-
|
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)+'
|
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)+'
|
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
|
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
|
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("
|
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
|
-
|
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
|
-
|
690
|
-
|
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,
|
694
|
-
liqs2,
|
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}
|