siat 3.10.131__py3-none-any.whl → 3.10.132__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. build/lib/build/lib/siat/__init__.py +75 -0
  2. build/lib/build/lib/siat/allin.py +137 -0
  3. build/lib/build/lib/siat/assets_liquidity.py +915 -0
  4. build/lib/build/lib/siat/beta_adjustment.py +1058 -0
  5. build/lib/build/lib/siat/beta_adjustment_china.py +548 -0
  6. build/lib/build/lib/siat/blockchain.py +143 -0
  7. build/lib/build/lib/siat/bond.py +2900 -0
  8. build/lib/build/lib/siat/bond_base.py +992 -0
  9. build/lib/build/lib/siat/bond_china.py +100 -0
  10. build/lib/build/lib/siat/bond_zh_sina.py +143 -0
  11. build/lib/build/lib/siat/capm_beta.py +783 -0
  12. build/lib/build/lib/siat/capm_beta2.py +887 -0
  13. build/lib/build/lib/siat/common.py +5360 -0
  14. build/lib/build/lib/siat/compare_cross.py +642 -0
  15. build/lib/build/lib/siat/copyrights.py +18 -0
  16. build/lib/build/lib/siat/cryptocurrency.py +667 -0
  17. build/lib/build/lib/siat/economy.py +1471 -0
  18. build/lib/build/lib/siat/economy2.py +1853 -0
  19. build/lib/build/lib/siat/esg.py +536 -0
  20. build/lib/build/lib/siat/event_study.py +815 -0
  21. build/lib/build/lib/siat/fama_french.py +1521 -0
  22. build/lib/build/lib/siat/fin_stmt2_yahoo.py +982 -0
  23. build/lib/build/lib/siat/financial_base.py +1160 -0
  24. build/lib/build/lib/siat/financial_statements.py +598 -0
  25. build/lib/build/lib/siat/financials.py +2339 -0
  26. build/lib/build/lib/siat/financials2.py +1278 -0
  27. build/lib/build/lib/siat/financials_china.py +4433 -0
  28. build/lib/build/lib/siat/financials_china2.py +2212 -0
  29. build/lib/build/lib/siat/fund.py +629 -0
  30. build/lib/build/lib/siat/fund_china.py +3307 -0
  31. build/lib/build/lib/siat/future_china.py +551 -0
  32. build/lib/build/lib/siat/google_authenticator.py +47 -0
  33. build/lib/build/lib/siat/grafix.py +3636 -0
  34. build/lib/build/lib/siat/holding_risk.py +867 -0
  35. build/lib/build/lib/siat/luchy_draw.py +638 -0
  36. build/lib/build/lib/siat/market_china.py +1168 -0
  37. build/lib/build/lib/siat/markowitz.py +2363 -0
  38. build/lib/build/lib/siat/markowitz2.py +3150 -0
  39. build/lib/build/lib/siat/markowitz2_20250704.py +2969 -0
  40. build/lib/build/lib/siat/markowitz2_20250705.py +3158 -0
  41. build/lib/build/lib/siat/markowitz_simple.py +373 -0
  42. build/lib/build/lib/siat/ml_cases.py +2291 -0
  43. build/lib/build/lib/siat/ml_cases_example.py +60 -0
  44. build/lib/build/lib/siat/option_china.py +3069 -0
  45. build/lib/build/lib/siat/option_pricing.py +1925 -0
  46. build/lib/build/lib/siat/other_indexes.py +409 -0
  47. build/lib/build/lib/siat/risk_adjusted_return.py +1576 -0
  48. build/lib/build/lib/siat/risk_adjusted_return2.py +1900 -0
  49. build/lib/build/lib/siat/risk_evaluation.py +2218 -0
  50. build/lib/build/lib/siat/risk_free_rate.py +351 -0
  51. build/lib/build/lib/siat/sector_china.py +4140 -0
  52. build/lib/build/lib/siat/security_price2.py +727 -0
  53. build/lib/build/lib/siat/security_prices.py +3408 -0
  54. build/lib/build/lib/siat/security_trend.py +402 -0
  55. build/lib/build/lib/siat/security_trend2.py +646 -0
  56. build/lib/build/lib/siat/stock.py +4284 -0
  57. build/lib/build/lib/siat/stock_advice_linear.py +934 -0
  58. build/lib/build/lib/siat/stock_base.py +26 -0
  59. build/lib/build/lib/siat/stock_china.py +2095 -0
  60. build/lib/build/lib/siat/stock_prices_kneighbors.py +910 -0
  61. build/lib/build/lib/siat/stock_prices_linear.py +386 -0
  62. build/lib/build/lib/siat/stock_profile.py +707 -0
  63. build/lib/build/lib/siat/stock_technical.py +3305 -0
  64. build/lib/build/lib/siat/stooq.py +74 -0
  65. build/lib/build/lib/siat/transaction.py +347 -0
  66. build/lib/build/lib/siat/translate.py +5183 -0
  67. build/lib/build/lib/siat/valuation.py +1378 -0
  68. build/lib/build/lib/siat/valuation_china.py +2076 -0
  69. build/lib/build/lib/siat/var_model_validation.py +444 -0
  70. build/lib/build/lib/siat/yf_name.py +811 -0
  71. build/lib/siat/__init__.py +75 -0
  72. build/lib/siat/allin.py +137 -0
  73. build/lib/siat/assets_liquidity.py +915 -0
  74. build/lib/siat/beta_adjustment.py +1058 -0
  75. build/lib/siat/beta_adjustment_china.py +548 -0
  76. build/lib/siat/blockchain.py +143 -0
  77. build/lib/siat/bond.py +2900 -0
  78. build/lib/siat/bond_base.py +992 -0
  79. build/lib/siat/bond_china.py +100 -0
  80. build/lib/siat/bond_zh_sina.py +143 -0
  81. build/lib/siat/capm_beta.py +783 -0
  82. build/lib/siat/capm_beta2.py +887 -0
  83. build/lib/siat/common.py +5360 -0
  84. build/lib/siat/compare_cross.py +642 -0
  85. build/lib/siat/copyrights.py +18 -0
  86. build/lib/siat/cryptocurrency.py +667 -0
  87. build/lib/siat/economy.py +1471 -0
  88. build/lib/siat/economy2.py +1853 -0
  89. build/lib/siat/esg.py +536 -0
  90. build/lib/siat/event_study.py +815 -0
  91. build/lib/siat/fama_french.py +1521 -0
  92. build/lib/siat/fin_stmt2_yahoo.py +982 -0
  93. build/lib/siat/financial_base.py +1160 -0
  94. build/lib/siat/financial_statements.py +598 -0
  95. build/lib/siat/financials.py +2339 -0
  96. build/lib/siat/financials2.py +1278 -0
  97. build/lib/siat/financials_china.py +4433 -0
  98. build/lib/siat/financials_china2.py +2212 -0
  99. build/lib/siat/fund.py +629 -0
  100. build/lib/siat/fund_china.py +3307 -0
  101. build/lib/siat/future_china.py +551 -0
  102. build/lib/siat/google_authenticator.py +47 -0
  103. build/lib/siat/grafix.py +3636 -0
  104. build/lib/siat/holding_risk.py +867 -0
  105. build/lib/siat/luchy_draw.py +638 -0
  106. build/lib/siat/market_china.py +1168 -0
  107. build/lib/siat/markowitz.py +2363 -0
  108. build/lib/siat/markowitz2.py +3150 -0
  109. build/lib/siat/markowitz2_20250704.py +2969 -0
  110. build/lib/siat/markowitz2_20250705.py +3158 -0
  111. build/lib/siat/markowitz_simple.py +373 -0
  112. build/lib/siat/ml_cases.py +2291 -0
  113. build/lib/siat/ml_cases_example.py +60 -0
  114. build/lib/siat/option_china.py +3069 -0
  115. build/lib/siat/option_pricing.py +1925 -0
  116. build/lib/siat/other_indexes.py +409 -0
  117. build/lib/siat/risk_adjusted_return.py +1576 -0
  118. build/lib/siat/risk_adjusted_return2.py +1900 -0
  119. build/lib/siat/risk_evaluation.py +2218 -0
  120. build/lib/siat/risk_free_rate.py +351 -0
  121. build/lib/siat/sector_china.py +4140 -0
  122. build/lib/siat/security_price2.py +727 -0
  123. build/lib/siat/security_prices.py +3408 -0
  124. build/lib/siat/security_trend.py +402 -0
  125. build/lib/siat/security_trend2.py +646 -0
  126. build/lib/siat/stock.py +4284 -0
  127. build/lib/siat/stock_advice_linear.py +934 -0
  128. build/lib/siat/stock_base.py +26 -0
  129. build/lib/siat/stock_china.py +2095 -0
  130. build/lib/siat/stock_prices_kneighbors.py +910 -0
  131. build/lib/siat/stock_prices_linear.py +386 -0
  132. build/lib/siat/stock_profile.py +707 -0
  133. build/lib/siat/stock_technical.py +3305 -0
  134. build/lib/siat/stooq.py +74 -0
  135. build/lib/siat/transaction.py +347 -0
  136. build/lib/siat/translate.py +5183 -0
  137. build/lib/siat/valuation.py +1378 -0
  138. build/lib/siat/valuation_china.py +2076 -0
  139. build/lib/siat/var_model_validation.py +444 -0
  140. build/lib/siat/yf_name.py +811 -0
  141. siat/__init__.py +0 -0
  142. siat/allin.py +0 -0
  143. siat/assets_liquidity.py +0 -0
  144. siat/beta_adjustment.py +0 -0
  145. siat/beta_adjustment_china.py +0 -0
  146. siat/blockchain.py +0 -0
  147. siat/bond.py +0 -0
  148. siat/bond_base.py +0 -0
  149. siat/bond_china.py +0 -0
  150. siat/bond_zh_sina.py +0 -0
  151. siat/capm_beta.py +0 -0
  152. siat/capm_beta2.py +0 -0
  153. siat/common.py +136 -3
  154. siat/compare_cross.py +0 -0
  155. siat/copyrights.py +0 -0
  156. siat/cryptocurrency.py +0 -0
  157. siat/economy.py +0 -0
  158. siat/economy2.py +0 -0
  159. siat/esg.py +0 -0
  160. siat/event_study.py +0 -0
  161. siat/exchange_bond_china.pickle +0 -0
  162. siat/fama_french.py +0 -0
  163. siat/fin_stmt2_yahoo.py +0 -0
  164. siat/financial_base.py +0 -0
  165. siat/financial_statements.py +0 -0
  166. siat/financials.py +0 -0
  167. siat/financials2.py +0 -0
  168. siat/financials_china.py +0 -0
  169. siat/financials_china2.py +0 -0
  170. siat/fund.py +0 -0
  171. siat/fund_china.pickle +0 -0
  172. siat/fund_china.py +0 -0
  173. siat/future_china.py +0 -0
  174. siat/google_authenticator.py +0 -0
  175. siat/grafix.py +1 -1
  176. siat/holding_risk.py +0 -0
  177. siat/luchy_draw.py +0 -0
  178. siat/market_china.py +1 -1
  179. siat/markowitz.py +0 -0
  180. siat/markowitz2.py +240 -39
  181. siat/markowitz2_20250704.py +2969 -0
  182. siat/markowitz2_20250705.py +3158 -0
  183. siat/markowitz_simple.py +0 -0
  184. siat/ml_cases.py +0 -0
  185. siat/ml_cases_example.py +0 -0
  186. siat/option_china.py +0 -0
  187. siat/option_pricing.py +0 -0
  188. siat/other_indexes.py +0 -0
  189. siat/risk_adjusted_return.py +0 -0
  190. siat/risk_adjusted_return2.py +0 -0
  191. siat/risk_evaluation.py +0 -0
  192. siat/risk_free_rate.py +0 -0
  193. siat/sector_china.py +0 -0
  194. siat/security_price2.py +0 -0
  195. siat/security_prices.py +3 -1
  196. siat/security_trend.py +0 -0
  197. siat/security_trend2.py +1 -1
  198. siat/stock.py +4 -2
  199. siat/stock_advice_linear.py +0 -0
  200. siat/stock_base.py +0 -0
  201. siat/stock_china.py +0 -0
  202. siat/stock_info.pickle +0 -0
  203. siat/stock_prices_kneighbors.py +0 -0
  204. siat/stock_prices_linear.py +0 -0
  205. siat/stock_profile.py +0 -0
  206. siat/stock_technical.py +0 -0
  207. siat/stooq.py +0 -0
  208. siat/transaction.py +0 -0
  209. siat/translate.py +11 -11
  210. siat/valuation.py +0 -0
  211. siat/valuation_china.py +0 -0
  212. siat/var_model_validation.py +0 -0
  213. siat/yf_name.py +0 -0
  214. {siat-3.10.131.dist-info → siat-3.10.132.dist-info}/METADATA +235 -227
  215. siat-3.10.132.dist-info/RECORD +218 -0
  216. {siat-3.10.131.dist-info → siat-3.10.132.dist-info}/WHEEL +1 -1
  217. {siat-3.10.131.dist-info → siat-3.10.132.dist-info/licenses}/LICENSE +0 -0
  218. siat-3.10.132.dist-info/top_level.txt +4 -0
  219. siat-3.10.131.dist-info/RECORD +0 -76
  220. siat-3.10.131.dist-info/top_level.txt +0 -1
@@ -0,0 +1,598 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ 本模块功能:上市公司的财务报表分析,数据层
4
+ 所属工具包:证券投资分析工具SIAT
5
+ SIAT:Security Investment Analysis Tool
6
+ 创建日期:2020年9月10日
7
+ 最新修订日期:2020年9月14日
8
+ 作者:王德宏 (WANG Dehong, Peter)
9
+ 作者单位:北京外国语大学国际商学院
10
+ 版权所有:王德宏
11
+ 用途限制:仅限研究与教学使用,不可商用!商用需要额外授权。
12
+ 特别声明:作者不对使用本工具进行证券投资导致的任何损益负责!
13
+ """
14
+
15
+ #==============================================================================
16
+ #关闭所有警告
17
+ import warnings; warnings.filterwarnings('ignore')
18
+
19
+ from siat.common import *
20
+ import pandas as pd
21
+ #==============================================================================
22
+ #本模块使用yahooquery插件
23
+ #==============================================================================
24
+ if __name__=='__main__':
25
+ symbol='JD'
26
+ symbol='INTL'
27
+ symbol='MSFT'
28
+ symbol='600519.SS'
29
+ symbol='00700.HK'
30
+
31
+ symbol='601398.SS'
32
+ symbol='601328.SS'
33
+
34
+ fsdf=get_balance_sheet(symbol)
35
+
36
+ def get_balance_sheet(symbol):
37
+ """
38
+ 功能:获取雅虎财经上一只股票所有的年度和季度资产负债表
39
+ """
40
+ print(" Searching for balance info of {}, please wait...".format(symbol))
41
+
42
+ result,prefix,suffix=split_prefix_suffix(symbol)
43
+ if result & (suffix=='HK'):
44
+ if len(prefix)==5:
45
+ symbol=symbol[1:]
46
+
47
+ from yahooquery import Ticker
48
+ stock = Ticker(symbol)
49
+
50
+ import time
51
+ #获取年报
52
+ try:
53
+ stmta=stock.balance_sheet() # Defaults to Annual
54
+ except:
55
+ print(" #Warning(get_balance_sheet): no annual info available for",symbol)
56
+ return None
57
+
58
+ if isinstance(stmta,dict):
59
+ print(" #Warning(get_balance_sheet): Yahoo Finance currently unaccessable for",symbol)
60
+ return None
61
+
62
+ """
63
+ #判断是否抓取到了数据
64
+ import pandas as pd
65
+ if not isinstance(stmta,pd.DataFrame):
66
+ print("\n #Error(get_balance_sheet): no annual info available for",symbol)
67
+ return None
68
+ """
69
+ #获取季度报
70
+ try:
71
+ stmtq=stock.balance_sheet(frequency="q")
72
+ except:
73
+ print(" #Warning(get_balance_sheet): no quarterly info available for",symbol)
74
+ return None
75
+
76
+ if isinstance(stmtq,dict):
77
+ print(" #Warning(get_balance_sheet): Yahoo Finance currently unaccessable for",symbol)
78
+ return None
79
+
80
+ """
81
+ if (len(stmta)==0) and (len(stmtq)==0):
82
+ print(" #Error(get_balance_sheet): no reports available for",symbol)
83
+ return None
84
+ """
85
+ #合并年度和季度报表
86
+ if not (stmta is None) and not (stmtq is None):
87
+ stmt=pd.concat([stmta,stmtq])
88
+ elif not (stmta is None):
89
+ stmt=stmta
90
+ elif not (stmtq is None):
91
+ stmt=stmtq
92
+ else:
93
+ print(" #Error(get_balance_sheet): no reports available for",symbol)
94
+ return None
95
+
96
+ #字段缺失替代处理
97
+ #流动(有息)债务
98
+ if 'CurrentDebt' not in list(stmt):
99
+ stmt['CurrentDebt']=0.0
100
+ #流动负债(有息债务+应付)
101
+ if 'CurrentLiabilities' not in list(stmt):
102
+ stmt['CurrentLiabilities']=stmt['CurrentDebt']
103
+ #总(有息)债务
104
+ if 'TotalDebt' not in list(stmt):
105
+ stmt['TotalDebt']=0.0
106
+ #少数股东权益
107
+ if 'MinorityInterest' not in list(stmt):
108
+ if 'TotalEquityGrossMinorityInterest' in list(stmt):
109
+ stmt['MinorityInterest']= \
110
+ stmt['TotalEquityGrossMinorityInterest']-stmt['StockholdersEquity']
111
+ elif 'TotalLiabilitiesNetMinorityInterest' in list(stmt):
112
+ stmt['MinorityInterest']=stmt['TotalAssets']- \
113
+ stmt['TotalLiabilitiesNetMinorityInterest']- \
114
+ stmt['StockholersEquity']
115
+ else:
116
+ stmt['MinorityInterest']=0.0
117
+ #总负债
118
+ if 'TotalLiabilities' not in list(stmt):
119
+ if 'TotalLiabilitiesNetMinorityInterest' in list(stmt):
120
+ stmt['TotalLiabilities']=stmt['TotalLiabilitiesNetMinorityInterest']+ \
121
+ stmt['MinorityInterest']
122
+ else:
123
+ stmt['TotalLiabilities']=stmt['TotalDebt']+stmt['MinorityInterest']
124
+ #权益总额
125
+ if 'TotalEquities' not in list(stmt):
126
+ stmt['TotalEquities']=stmt['TotalEquityGrossMinorityInterest']- \
127
+ stmt['MinorityInterest']
128
+ #存货
129
+ if 'Inventory' not in list(stmt):
130
+ stmt['Inventory']=0.0
131
+
132
+ #流动资产
133
+ if 'Receivables' not in list(stmt):
134
+ stmt['Receivables']=0.0
135
+
136
+ if 'CurrentAssets' not in list(stmt):
137
+ stmt['CurrentAssets']=stmt['CashAndCashEquivalents']+ \
138
+ stmt['Receivables']+stmt['Inventory']
139
+ #应收账款
140
+ if 'AccountsReceivable' not in list(stmt):
141
+ stmt['AccountsReceivable']=stmt['Receivables']
142
+
143
+ #总检查:总资产=总负债+总权益是否成立
144
+ #stmt['TA-TL-TE']=stmt['TotalAssets']-stmt['TotalLiabilities']-stmt['TotalEquities']
145
+
146
+ #排序
147
+ stmt.sort_values(by=['asOfDate','periodType'],inplace=True)
148
+ #去掉重复记录: 保留年报数据项多,去掉数据项少的季报
149
+ stmt.drop_duplicates(subset=['asOfDate'],keep='first',inplace=True)
150
+
151
+ #print(", done")
152
+
153
+ return stmt
154
+
155
+ if __name__ == '__main__':
156
+ fs=get_balance_sheet('AAPL')
157
+ fs_msft=get_balance_sheet('MSFT')
158
+ fs_c=get_balance_sheet('C')
159
+ fs_maotai=get_balance_sheet('600519.SS')
160
+
161
+ #==============================================================================
162
+ if __name__=='__main__':
163
+ symbol='AAPL'
164
+ symbol='MST'
165
+
166
+ fsdf=get_income_statements(symbol)
167
+
168
+ def get_income_statements(symbol):
169
+ """
170
+ 功能:获取雅虎财经上一只股票所有的年度和季度利润表
171
+ """
172
+ print(" Searching for income info of",symbol,"\b, please wait...")
173
+
174
+ result,prefix,suffix=split_prefix_suffix(symbol)
175
+ if result & (suffix=='HK'):
176
+ if len(prefix)==5:
177
+ symbol=symbol[1:]
178
+
179
+ from yahooquery import Ticker
180
+ stock = Ticker(symbol)
181
+
182
+ import time
183
+ #获取年报
184
+ try:
185
+ stmta=stock.income_statement() # Defaults to Annual
186
+ except:
187
+ print(" #Warning(get_income_statements): no annual info available for",symbol)
188
+ return None
189
+
190
+ if isinstance(stmta,dict):
191
+ print(" #Warning(get_balance_sheet): Yahoo Finance currently unaccessable for",symbol)
192
+ return None
193
+
194
+ """
195
+ #判断是否抓取到了数据
196
+ import pandas as pd
197
+ if not isinstance(stmta,pd.DataFrame):
198
+ print(" #Error(get_income_statements): no annual info available for",symbol)
199
+ return None
200
+ """
201
+ #获取季度报
202
+ try:
203
+ stmtq=stock.income_statement(frequency="q")
204
+ except:
205
+ print(" #Warning(get_income_statements): no quarterly info available for",symbol)
206
+ return None
207
+
208
+ if isinstance(stmtq,dict):
209
+ print(" #Warning(get_balance_sheet): Yahoo Finance currently unaccessable for",symbol)
210
+ return None
211
+
212
+ """
213
+ if (len(stmta)==0) and (len(stmtq)==0):
214
+ print(" #Error(get_income_statements): no reports available for",symbol)
215
+ return None
216
+ """
217
+ #合并年度和季度报表
218
+ if not (stmta is None) and not (stmtq is None):
219
+ stmt=pd.concat([stmta,stmtq])
220
+ elif not (stmta is None):
221
+ stmt=stmta
222
+ elif not (stmtq is None):
223
+ stmt=stmtq
224
+ else:
225
+ print(" #Error(get_income_statements): no reports available for",symbol)
226
+ return None
227
+
228
+ #排序
229
+ stmt.sort_values(by=['asOfDate','periodType'],inplace=True)
230
+ #去掉重复记录: 保留年报数据项多,去掉数据项少的季报
231
+ stmt.drop_duplicates(subset=['asOfDate'],keep='first',inplace=True)
232
+
233
+ #把periodType中的TTM改成3M
234
+ stmt['periodType']=stmt['periodType'].apply(lambda x: '3M' if x=='TTM' else x)
235
+
236
+ #字段缺失处理
237
+ if 'InterestExpense' not in list(stmt):
238
+ #import numpy as np
239
+ #stmt['InterestExpense']=np.nan
240
+ stmt['InterestExpense']=0
241
+
242
+ # 服务型企业无此项
243
+ if 'CostOfRevenue' not in list(stmt):
244
+ stmt['CostOfRevenue']=0
245
+
246
+ if 'OperatingExpense' not in list(stmt):
247
+ stmt['OperatingExpense']=stmt['CostOfRevenue']
248
+
249
+ # 服务型企业
250
+ if 'OperatingIncome' not in list(stmt):
251
+ stmt['OperatingIncome']=stmt['OperatingRevenue']-stmt['OperatingExpense']
252
+
253
+ # 服务型企业
254
+ if 'GrossProfit' not in list(stmt):
255
+ stmt['GrossProfit']=stmt['PretaxIncome']
256
+
257
+
258
+ #print(", done")
259
+ return stmt
260
+
261
+ if __name__ == '__main__':
262
+ stmt=get_income_statements('AAPL')
263
+ stmt_msft=get_income_statements('MSFT')
264
+ stmt_c=get_income_statements('C')
265
+ stmt_maotai=get_income_statements('600519.SS')
266
+
267
+ #==============================================================================
268
+ if __name__=='__main__':
269
+ symbol='AAPL'
270
+
271
+ fsdf=get_cashflow_statements(symbol)
272
+
273
+ def get_cashflow_statements(symbol):
274
+ """
275
+ 功能:获取雅虎财经上一只股票所有的年度和季度现金流量表
276
+ """
277
+ print(" Searching for cashflow info of",symbol,"\b, please wait...")
278
+
279
+ result,prefix,suffix=split_prefix_suffix(symbol)
280
+ if result & (suffix=='HK'):
281
+ if len(prefix)==5:
282
+ symbol=symbol[1:]
283
+
284
+ from yahooquery import Ticker
285
+ stock = Ticker(symbol)
286
+
287
+ import time
288
+ #获取年报
289
+ try:
290
+ stmta=stock.cash_flow() # Defaults to Annual
291
+ except:
292
+ print(" #Warning(get_cashflow_statements): no annual info available for",symbol)
293
+ return None
294
+
295
+ if isinstance(stmta,dict):
296
+ print(" #Warning(get_balance_sheet): Yahoo Finance currently unaccessable for",symbol)
297
+ return None
298
+
299
+ """
300
+ #判断是否抓取到了数据
301
+ import pandas as pd
302
+ if not isinstance(stmta,pd.DataFrame):
303
+ print("\n #Error(get_cashflow_statements): no annual info available for",symbol)
304
+ return None
305
+ """
306
+ #获取季度报
307
+ try:
308
+ stmtq=stock.cash_flow(frequency="q")
309
+ except:
310
+ print(" #Warning(get_cashflow_statements): no quarterly info available for",symbol)
311
+ return None
312
+
313
+ if isinstance(stmtq,dict):
314
+ print(" #Warning(get_balance_sheet): Yahoo Finance currently unaccessable for",symbol)
315
+ return None
316
+
317
+ """
318
+ if (len(stmta)==0) and (len(stmtq)==0):
319
+ print(" #Error(get_cashflow_statements): no reports available for",symbol)
320
+ return None
321
+ """
322
+ #合并年度和季度报表
323
+ if not (stmta is None) and not (stmtq is None):
324
+ stmt=pd.concat([stmta,stmtq])
325
+ elif not (stmta is None):
326
+ stmt=stmta
327
+ elif not (stmtq is None):
328
+ stmt=stmtq
329
+ else:
330
+ print(" #Error(get_cashflow_statements): no reports available for",symbol)
331
+ return None
332
+
333
+ #排序
334
+ stmt.sort_values(by=['asOfDate','periodType'],inplace=True)
335
+ #去掉重复记录: 保留年报数据项多,去掉数据项少的季报
336
+ stmt.drop_duplicates(subset=['asOfDate'],keep='first',inplace=True)
337
+
338
+ #把periodType中的TTM改成3M
339
+ stmt['periodType']=stmt['periodType'].apply(lambda x: '3M' if x=='TTM' else x)
340
+
341
+ #字段缺失处理
342
+ if 'CashDividendsPaid' not in list(stmt):
343
+ #import numpy as np
344
+ #stmt['CashDividendsPaid']=np.nan
345
+ stmt['CashDividendsPaid']=0
346
+
347
+ #print(", done")
348
+ return stmt
349
+
350
+ if __name__ == '__main__':
351
+ stmt=get_cashflow_statements('AAPL')
352
+ stmt_msft=get_cashflow_statements('MSFT')
353
+ stmt_c=get_cashflow_statements('C')
354
+ stmt_maotai=get_cashflow_statements('600519.SS')
355
+
356
+ #==============================================================================
357
+ if __name__=='__main__':
358
+ ticker='AAPL'
359
+ ticker='00700.HK'
360
+
361
+ fsdf=get_financial_statements(ticker)
362
+
363
+ def get_financial_statements(ticker):
364
+ """
365
+ 功能:获取雅虎财经上一只股票所有的年度和季度财务报表
366
+ """
367
+
368
+ # 变换港股代码5位-->4位
369
+ result,prefix,suffix=split_prefix_suffix(ticker)
370
+ if result & (suffix=='HK'):
371
+ if len(prefix)==5:
372
+ ticker=ticker[1:]
373
+
374
+ print(" Searching for financial statements of",ticker,"\b, please wait")
375
+ #获取资产负债表
376
+ try:
377
+ fbs = get_balance_sheet(ticker)
378
+ except:
379
+ print(" #Error(get_financial_statements): balance sheet not available for",ticker)
380
+ return None
381
+ if fbs is None:
382
+ print(" #Error(get_financial_statements): financial statements not available for",ticker)
383
+ return None
384
+
385
+ #获取利润表
386
+ try:
387
+ fis = get_income_statements(ticker)
388
+ except:
389
+ print(" #Error(get_financial_statements): income info not available for",ticker)
390
+ return None
391
+ if fis is None:
392
+ print(" #Error(get_financial_statements): financial statements not available for",ticker)
393
+ return None
394
+
395
+ #获取现金流量表
396
+ try:
397
+ fcf = get_cashflow_statements(ticker)
398
+ except:
399
+ print(" #Error(get_financial_statements): cash flow info not available for",ticker)
400
+ return None
401
+ if fcf is None:
402
+ print(" #Error(get_financial_statements): financial statements not available for",ticker)
403
+ return None
404
+
405
+ #合并1:资产负债表+利润表
406
+ import pandas as pd
407
+ #fbs_fis=pd.merge(fbs,fis,on=['asOfDate','periodType'])
408
+ fbs_fis=pd.merge(fbs,fis,how='left',on=['asOfDate'],suffixes=('', '_y'))
409
+
410
+ #合并2:+现金流量表
411
+ #fbs_fis_fcf=pd.merge(fbs_fis,fcf,on=['asOfDate','periodType','NetIncome'])
412
+ fbs_fis_fcf=pd.merge(fbs_fis,fcf,how='left',on=['asOfDate'],suffixes=('', '_y'))
413
+
414
+ fbs_fis_fcf['ticker']=ticker
415
+ #将所有的nan替换为0
416
+ #fbs_fis_fcf.fillna(0,inplace=True)
417
+
418
+ print(" ...Successfully retrieved financial statements of",ticker,"\b!")
419
+ return fbs_fis_fcf
420
+
421
+ if __name__ == '__main__':
422
+ fs=get_financial_statements('AAPL')
423
+ fs_aapl=get_financial_statements('AAPL')
424
+ fs_msft=get_financial_statements('MSFT')
425
+ fs_c=get_financial_statements('C')
426
+ fs_maotai=get_financial_statements('600519.SS')
427
+
428
+ """
429
+ 最终获得的表结构:
430
+ ['asOfDate',
431
+ 'periodType',
432
+
433
+ 'AccountsPayable(应付账款)',
434
+ 'AccountsReceivable(应收账款)',
435
+ 'AccumulatedDepreciation(累计折旧)',
436
+ 'AdditionalPaidInCapital(资本公积,资本溢价,附加资本;paid-in capital:实收资本;缴入资本)',
437
+ 'AllowanceForDoubtfulAccountsReceivable(备抵应收呆帐)',
438
+ 'AvailableForSaleSecurities(可供出售金融资产;trading securities: 交易性金融资产)',
439
+ 'BuildingsAndImprovements(建筑物改良)',
440
+ 'CapitalStock(股本)',
441
+ 'CashAndCashEquivalents(现金及现金等价物)',
442
+ 'CashCashEquivalentsAndShortTermInvestments(现金、现金等价物及短期投资)',
443
+ 'CashEquivalents(现金等价物)',
444
+ 'CashFinancial(?)',
445
+ 'CommonStock(普通股)',
446
+ 'CommonStockEquity(普通股权益?)',
447
+ 'ConstructionInProgress(在建工程)',
448
+ 'CurrentAssets(流动资产)',
449
+ 'CurrentLiabilities(流动负债)',
450
+ 'DividendsPayable(应付股利)',
451
+ 'FinishedGoods(制成品)',
452
+ 'GoodwillAndOtherIntangibleAssets(商誉及其他无形资产)',
453
+ 'GrossAccountsReceivable(应收账款总额)',
454
+ 'GrossPPE(固定资产总额)',
455
+ 'InventoriesAdjustmentsAllowances(存货调整备抵)',
456
+ 'Inventory(存货)',
457
+ 'InvestedCapital(投入资本)',
458
+ 'InvestmentinFinancialAssets(金融资产投资?)',
459
+ 'LandAndImprovements(土地改良)',
460
+ 'MachineryFurnitureEquipment(机械家具设备?)',
461
+ 'MinorityInterest(少数股东损益?)',
462
+ 'NetPPE(固定资产净值)',
463
+ 'NetTangibleAssets(有形资产净值)',
464
+ 'NonCurrentDeferredAssets(非流动递延资产)',
465
+ 'NonCurrentDeferredTaxesAssets(非流动递延税项资产?)',
466
+ 'NonCurrentDeferredTaxesLiabilities(非流动递延税金负债?)',
467
+ 'OrdinarySharesNumber(普通股数量?)',
468
+ 'OtherCurrentAssets(其他流动资产)',
469
+ 'OtherCurrentLiabilities(其他流动负债)',
470
+ 'OtherEquityInterest(其他股权)',
471
+ 'OtherIntangibleAssets(其他有形资产)',
472
+ 'OtherNonCurrentAssets(其他非流动资产)',
473
+ 'OtherPayable(其它应付款)',
474
+ 'OtherProperties(?)',
475
+ 'OtherReceivables(其他应收款)',
476
+ 'Payables(应付款项)',
477
+ 'PrepaidAssets(预付资产;预付费用)',
478
+ 'Properties(财产?)',
479
+ 'RawMaterials(原材料)',
480
+ 'RetainedEarnings(留存收益)',
481
+ 'ShareIssued(股票发行)',
482
+ 'StockholdersEquity(股东权益)',
483
+ 'TangibleBookValue(有形资产账面价值)',
484
+ 'TotalAssets(总资产)',
485
+ 'TotalCapitalization(资本总额?)',
486
+ 'TotalEquityGrossMinorityInterest(少数股东权益总额)',
487
+ 'TotalLiabilitiesNetMinorityInterest(?)',
488
+ 'TotalNonCurrentAssets(非流动资产总额)',
489
+ 'TotalNonCurrentLiabilitiesNetMinorityInterest(?)',
490
+ 'TotalTaxPayable(应缴税款总额)',
491
+ 'TradeandOtherPayablesNonCurrent(?)',
492
+ 'WorkInProcess(在制品)',
493
+ 'WorkingCapital(营运资本)',
494
+ 'Amortization(摊销)',
495
+
496
+ 'BasicAverageShares(未稀释的平均股数?)',
497
+ 'BasicEPS( 基本每股收益,指属于普通股股东的当期净利润,除以发行在外普通股的加权平均数,可按存在月数加权)',
498
+ 'CostOfRevenue(主营业务成本,营收成本)',
499
+ 'DepreciationAndAmortizationInIncomeStatement(损益表中的折旧和摊销)',
500
+ 'DepreciationIncomeStatement(损益表中的折旧)',
501
+ 'DilutedAverageShares(稀释后平均股数?)',
502
+ 'DilutedEPS(考虑了可转换债券和股票期权可能行权对于流通在外股数的影响)',
503
+ 'EBIT(息税前利润)',
504
+ 'EBITDA(未计利息、税项、折旧及摊销前的利润)',
505
+ 'GeneralAndAdministrativeExpense(一般管理费用)',
506
+ 'GrossProfit(营业毛利)',
507
+ 'ImpairmentOfCapitalAssets(资本资产减值)',
508
+ 'InterestExpense(利息费用)',
509
+ 'InterestExpenseNonOperating(非经营性利息费用)',
510
+ 'InterestIncome(利息收益)',
511
+ 'InterestIncomeNonOperating(非经营性利息收入)',
512
+ 'MinorityInterests(少数股东权益)',
513
+ 'NetIncome(净利润)',
514
+ 'NetIncomeCommonStockholders(归属于普通股股东的净利润,用于计算EPS和PE)',
515
+ 'NetIncomeContinuousOperations(扣非后净利润)',
516
+ 'NetIncomeFromContinuingAndDiscontinuedOperation(来自持续经营和停止经营业务的净收入)',
517
+ 'NetIncomeFromContinuingOperationNetMinorityInterest(不归属少数股东的扣非后净利润?)',
518
+ 'NetIncomeIncludingNoncontrollingInterests(包括非控股权的净收入?)',
519
+ 'NetInterestIncome(净利息收入)',
520
+ 'NetNonOperatingInterestIncomeExpense(?)',
521
+ 'NormalizedEBITDA(调整后EBITDA?)',
522
+ 'NormalizedIncome(调整后利润?)',
523
+ 'OperatingExpense(营业费用)',
524
+ 'OperatingIncome(营业利润)',
525
+ 'OperatingRevenue(营业收入)',
526
+ 'OtherNonOperatingIncomeExpenses(其他营业外收入支出?)',
527
+ 'OtherOperatingExpenses(其它营业费用)',
528
+ 'OtherSpecialCharges(其他特殊费用)',
529
+ 'OtherunderPreferredStockDividend(优先股股利下的其他项目)',
530
+ 'PretaxIncome(税前利润)',
531
+ 'ReconciledCostOfRevenue(对账后的经营收入成本?)',
532
+ 'ReconciledDepreciation(对账后的折旧)',
533
+ 'RentAndLandingFees(租金及土地费用?)',
534
+ 'RentExpenseSupplemental(补充租金费用?)',
535
+ 'ResearchAndDevelopment(研发费用?)',
536
+ 'SellingAndMarketingExpense(销售和市场营销费用)',
537
+ 'SellingGeneralAndAdministration(销售及一般管理费用)',
538
+ 'SpecialIncomeCharges(特殊的收入费用?)',
539
+ 'TaxEffectOfUnusualItems(特殊项目的税收效应?)',
540
+ 'TaxProvision(税金?)',
541
+ 'TaxRateForCalcs(计算用的税率)',
542
+ 'TotalExpenses(总费用)',
543
+ 'TotalOperatingIncomeAsReported(报告的总营业利润)',
544
+ 'TotalOtherFinanceCost(其他财务成本合计)',
545
+ 'TotalRevenue(总收入)',
546
+ 'TotalUnusualItems(非经常性项目总计)',
547
+ 'TotalUnusualItemsExcludingGoodwill(不包括商誉的非经常项目合计)',
548
+ 'WriteOff(冲销?)',
549
+
550
+ 'BeginningCashPosition(期初现金头寸)',
551
+ 'CapitalExpenditure(资本支出)',
552
+ 'CashDividendsPaid(现金股利支付)',
553
+ 'ChangeInCashSupplementalAsReported(现金补充变更报告?)',
554
+ 'ChangeInInventory(存货变化)',
555
+ 'ChangeInWorkingCapital(营运资本的变动额)',
556
+ 'DepreciationAndAmortization(折旧摊销)',
557
+ 'EndCashPosition(期末现金头寸)',
558
+ 'FreeCashFlow(自有现金流)',
559
+ 'InvestingCashFlow(投资现金流)',
560
+ 'NetOtherFinancingCharges(其他融资费用净额)',
561
+ 'NetOtherInvestingChanges(其他投资变动净额)',
562
+ 'OperatingCashFlow(营运现金流)',
563
+ 'OtherNonCashItems(其他非现金项目)'
564
+ ]
565
+ """
566
+
567
+ #==============================================================================
568
+ if __name__ == '__main__':
569
+ fsdf=get_financial_statements('601398.SS')
570
+ account_entry='TotalAssets'
571
+
572
+ fsdf1=fs_entry_begin(fsdf,account_entry='TotalAssets',suffix='_begin')
573
+
574
+ def fs_entry_begin(fsdf,account_entry='TotalAssets',suffix='_begin'):
575
+ """
576
+ 功能:以上年年报期末科目数值作为本期年报和季报的期初,仅适用于雅虎财报!
577
+ """
578
+ import pandas as pd
579
+ import numpy as np
580
+ #获取年报日期
581
+ ar_mm_dd=pd.to_datetime(fsdf[fsdf['periodType']=='12M']['asOfDate'].values[0]).strftime("%Y-%m-%d")[-5:]
582
+
583
+ fsdf['asOfDate_pd']=fsdf['asOfDate'].apply(lambda x: pd.to_datetime(x))
584
+ fsdf['Date_y4']=fsdf['asOfDate'].apply(lambda x: pd.to_datetime(x).strftime("%Y"))
585
+ fsdf['Date_begin_pd']=fsdf['Date_y4'].apply(lambda x: pd.to_datetime(str(int(x)-1)+'-'+ar_mm_dd))
586
+
587
+ asOfDate_pd_list=list(fsdf['asOfDate_pd'])
588
+ entry_begin=lambda x: fsdf[fsdf['asOfDate_pd']==x][account_entry].values[0] if x in asOfDate_pd_list else np.nan
589
+ fsdf[account_entry+suffix]=fsdf['Date_begin_pd'].apply(entry_begin)
590
+
591
+ fsdf.drop(['asOfDate_pd','Date_y4','Date_begin_pd'],axis=1,inplace=True)
592
+
593
+ return fsdf
594
+
595
+ #==============================================================================
596
+ #==============================================================================
597
+ #==============================================================================
598
+ #==============================================================================