Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
F
FactorCalculate
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
李煜
FactorCalculate
Commits
40616b3c
Commit
40616b3c
authored
Jul 05, 2019
by
李煜
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
code pdate
parent
b2dea9f5
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
246 additions
and
219 deletions
+246
-219
client.py
client.py
+10
-16
factor_cash_flow.py
factor/factor_cash_flow.py
+30
-24
factor_contrarian.py
factor/factor_contrarian.py
+18
-9
factor_earning.py
factor/factor_earning.py
+53
-35
factor_growth.py
factor/factor_growth.py
+60
-64
factor_per_share_indicators.py
factor/factor_per_share_indicators.py
+45
-43
historical_value.py
factor/historical_value.py
+30
-28
No files found.
client.py
View file @
40616b3c
import
pdb
import
collections
import
time
import
time
import
collections
from
datetime
import
datetime
,
timedelta
from
datetime
import
datetime
,
timedelta
from
factor
import
factor_growth
,
historical_value
,
factor_per_share_indicators
,
factor_cash_flow
,
factor_contrarian
,
factor_earning
from
factor
import
factor_growth
,
historical_value
,
factor_per_share_indicators
,
factor_cash_flow
,
factor_contrarian
,
factor_earning
from
factor.ttm_fundamental
import
*
from
factor.ttm_fundamental
import
*
...
@@ -11,10 +9,8 @@ from vision.file_unit.income import Income
...
@@ -11,10 +9,8 @@ from vision.file_unit.income import Income
from
vision.file_unit.valuation
import
Valuation
from
vision.file_unit.valuation
import
Valuation
from
vision.file_unit.industry
import
Industry
from
vision.file_unit.industry
import
Industry
from
vision.file_unit.indicator
import
Indicator
from
vision.file_unit.indicator
import
Indicator
from
factor.utillities.trade_date
import
TradeDate
from
factor.utillities.trade_date
import
TradeDate
from
ultron.cluster.invoke.cache_data
import
cache_data
from
ultron.cluster.invoke.cache_data
import
cache_data
from
ultron.utilities.short_uuid
import
unique_machine
,
decode
def
get_trade_date
(
trade_date
,
n
):
def
get_trade_date
(
trade_date
,
n
):
...
@@ -48,7 +44,6 @@ def get_basic_growth_data(trade_date):
...
@@ -48,7 +44,6 @@ def get_basic_growth_data(trade_date):
:param trade_date: 交易日
:param trade_date: 交易日
:return:
:return:
"""
"""
trade_date_pre_year
=
get_trade_date
(
trade_date
,
1
)
trade_date_pre_year
=
get_trade_date
(
trade_date
,
1
)
trade_date_pre_year_2
=
get_trade_date
(
trade_date
,
2
)
trade_date_pre_year_2
=
get_trade_date
(
trade_date
,
2
)
trade_date_pre_year_3
=
get_trade_date
(
trade_date
,
3
)
trade_date_pre_year_3
=
get_trade_date
(
trade_date
,
3
)
...
@@ -262,7 +257,6 @@ def get_basic_history_value_data(trade_date):
...
@@ -262,7 +257,6 @@ def get_basic_history_value_data(trade_date):
ttm_factor_sets_5
=
ttm_factor_sets_5
.
drop
(
columns
=
{
"trade_date"
})
ttm_factor_sets_5
=
ttm_factor_sets_5
.
drop
(
columns
=
{
"trade_date"
})
# ttm_factor_sets_sum = ttm_factor_sets_sum.rename(columns={"net_profit": "net_profit_5"})
# ttm_factor_sets_sum = ttm_factor_sets_sum.rename(columns={"net_profit": "net_profit_5"})
ttm_factor_sets
=
pd
.
merge
(
ttm_factor_sets
,
ttm_factor_sets_3
,
on
=
'symbol'
)
ttm_factor_sets
=
pd
.
merge
(
ttm_factor_sets
,
ttm_factor_sets_3
,
on
=
'symbol'
)
ttm_factor_sets
=
pd
.
merge
(
ttm_factor_sets
,
ttm_factor_sets_5
,
on
=
'symbol'
)
ttm_factor_sets
=
pd
.
merge
(
ttm_factor_sets
,
ttm_factor_sets_5
,
on
=
'symbol'
)
# ttm_factor_sets = pd.merge(ttm_factor_sets, ttm_factor_sets_sum, on='symbol')
# ttm_factor_sets = pd.merge(ttm_factor_sets, ttm_factor_sets_sum, on='symbol')
...
@@ -375,12 +369,12 @@ def get_basic_cash_flow(trade_date):
...
@@ -375,12 +369,12 @@ def get_basic_cash_flow(trade_date):
Income
.
total_operating_cost
,
Income
.
net_profit
,
Income
.
total_operating_cost
,
Income
.
net_profit
,
Income
.
np_parent_company_owners
]
Income
.
np_parent_company_owners
]
}
}
ttm_
factor
_sets
=
get_ttm_fundamental
([],
ttm_factors
,
trade_date
)
.
reset_index
()
ttm_
cash_flow
_sets
=
get_ttm_fundamental
([],
ttm_factors
,
trade_date
)
.
reset_index
()
ttm_
factor_sets
=
ttm_factor_sets
[
-
ttm_factor
_sets
.
duplicated
()]
ttm_
cash_flow_sets
=
ttm_cash_flow_sets
[
-
ttm_cash_flow
_sets
.
duplicated
()]
# 合并
# 合并
ttm_
factor_sets
=
pd
.
merge
(
ttm_factor
_sets
,
valuation_sets
,
on
=
"symbol"
)
ttm_
cash_flow_sets
=
pd
.
merge
(
ttm_cash_flow
_sets
,
valuation_sets
,
on
=
"symbol"
)
return
tp_cash_flow
,
ttm_
factor
_sets
return
tp_cash_flow
,
ttm_
cash_flow
_sets
def
get_basic_constrain
(
trade_date
):
def
get_basic_constrain
(
trade_date
):
...
@@ -408,10 +402,10 @@ def get_basic_constrain(trade_date):
...
@@ -408,10 +402,10 @@ def get_basic_constrain(trade_date):
Income
.
administration_expense
Income
.
administration_expense
]}
]}
ttm_
factors
_sets
=
get_ttm_fundamental
([],
ttm_factors
,
trade_date
)
.
reset_index
()
ttm_
constrain
_sets
=
get_ttm_fundamental
([],
ttm_factors
,
trade_date
)
.
reset_index
()
ttm_
factors_sets
=
ttm_factors_sets
[
-
ttm_factors
_sets
.
duplicated
()]
ttm_
constrain_sets
=
ttm_constrain_sets
[
-
ttm_constrain
_sets
.
duplicated
()]
return
balance_sets
,
ttm_
factors
_sets
return
balance_sets
,
ttm_
constrain
_sets
def
get_basic_earning
(
trade_date
):
def
get_basic_earning
(
trade_date
):
...
@@ -572,9 +566,9 @@ if __name__ == '__main__':
...
@@ -572,9 +566,9 @@ if __name__ == '__main__':
print
(
'per_share_cal_time:{}'
.
format
(
time3
-
time2
))
print
(
'per_share_cal_time:{}'
.
format
(
time3
-
time2
))
# cash flow
# cash flow
tp_cash_flow
,
ttm_
factor
_sets
=
get_basic_cash_flow
(
date_index
)
tp_cash_flow
,
ttm_
cash_flow
_sets
=
get_basic_cash_flow
(
date_index
)
cache_data
.
set_cache
(
session4
+
"1"
,
date_index
,
tp_cash_flow
.
to_json
(
orient
=
'records'
))
cache_data
.
set_cache
(
session4
+
"1"
,
date_index
,
tp_cash_flow
.
to_json
(
orient
=
'records'
))
cache_data
.
set_cache
(
session4
+
"2"
,
date_index
,
ttm_
factor
_sets
.
to_json
(
orient
=
'records'
))
cache_data
.
set_cache
(
session4
+
"2"
,
date_index
,
ttm_
cash_flow
_sets
.
to_json
(
orient
=
'records'
))
factor_cash_flow
.
factor_calculate
(
date_index
=
date_index
,
session
=
session4
)
factor_cash_flow
.
factor_calculate
(
date_index
=
date_index
,
session
=
session4
)
time4
=
time
.
time
()
time4
=
time
.
time
()
print
(
'cash_flow_cal_time:{}'
.
format
(
time4
-
time3
))
print
(
'cash_flow_cal_time:{}'
.
format
(
time4
-
time3
))
...
...
factor/factor_cash_flow.py
View file @
40616b3c
...
@@ -45,7 +45,8 @@ class FactorCashFlow(FactorBase):
...
@@ -45,7 +45,8 @@ class FactorCashFlow(FactorBase):
super
(
FactorCashFlow
,
self
)
.
_create_tables
(
create_sql
,
drop_sql
)
super
(
FactorCashFlow
,
self
)
.
_create_tables
(
create_sql
,
drop_sql
)
# 经营活动净现金流(TTM)/负债(TTM)
# 经营活动净现金流(TTM)/负债(TTM)
def
nocf_to_t_liability_ttm
(
self
,
ttm_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
nocf_to_t_liability_ttm
(
ttm_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'net_operate_cash_flow'
,
'total_liability'
]
columns_list
=
[
'net_operate_cash_flow'
,
'total_liability'
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
[
'OptCFToLiabilityTTM'
]
=
np
.
where
(
cash_flow
[
'OptCFToLiabilityTTM'
]
=
np
.
where
(
...
@@ -56,7 +57,8 @@ class FactorCashFlow(FactorBase):
...
@@ -56,7 +57,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# 经营活动净现金流(TTM)/带息负债(TTM)
# 经营活动净现金流(TTM)/带息负债(TTM)
def
nocf_to_interest_bear_debt_ttm
(
self
,
ttm_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
nocf_to_interest_bear_debt_ttm
(
ttm_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'net_operate_cash_flow'
,
'total_liability'
,
'interest_bearing_liability'
]
columns_list
=
[
'net_operate_cash_flow'
,
'total_liability'
,
'interest_bearing_liability'
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
[
'OptCFToIBDTTM'
]
=
np
.
where
(
cash_flow
[
'OptCFToIBDTTM'
]
=
np
.
where
(
...
@@ -67,7 +69,8 @@ class FactorCashFlow(FactorBase):
...
@@ -67,7 +69,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# 经营活动净现金流(TTM)/净负债(TTM)
# 经营活动净现金流(TTM)/净负债(TTM)
def
nocf_to_net_debt_ttm
(
self
,
ttm_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
nocf_to_net_debt_ttm
(
ttm_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'net_operate_cash_flow'
,
'net_liability'
]
columns_list
=
[
'net_operate_cash_flow'
,
'net_liability'
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
[
'OptCFToNetDebtTTM'
]
=
np
.
where
(
CalcTools
.
is_zero
(
cash_flow
.
net_liability
.
values
),
0
,
cash_flow
[
'OptCFToNetDebtTTM'
]
=
np
.
where
(
CalcTools
.
is_zero
(
cash_flow
.
net_liability
.
values
),
0
,
...
@@ -77,7 +80,8 @@ class FactorCashFlow(FactorBase):
...
@@ -77,7 +80,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# 销售商品和提供劳务收到的现金(TTM)/营业收入(TTM)
# 销售商品和提供劳务收到的现金(TTM)/营业收入(TTM)
def
sale_service_cash_to_or_ttm
(
self
,
ttm_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
sale_service_cash_to_or_ttm
(
ttm_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'goods_sale_and_service_render_cash'
,
'operating_revenue'
]
columns_list
=
[
'goods_sale_and_service_render_cash'
,
'operating_revenue'
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
[
'SaleServCashToOptReTTM'
]
=
np
.
where
(
cash_flow
[
'SaleServCashToOptReTTM'
]
=
np
.
where
(
...
@@ -88,7 +92,8 @@ class FactorCashFlow(FactorBase):
...
@@ -88,7 +92,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# 经营活动产生的现金流量净额(TTM)/营业收入(TTM)
# 经营活动产生的现金流量净额(TTM)/营业收入(TTM)
def
cash_rate_of_sales_ttm
(
self
,
ttm_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
cash_rate_of_sales_ttm
(
ttm_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'net_operate_cash_flow'
,
'operating_revenue'
]
columns_list
=
[
'net_operate_cash_flow'
,
'operating_revenue'
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
[
'OptCFToRevTTM'
]
=
np
.
where
(
cash_flow
[
'OptCFToRevTTM'
]
=
np
.
where
(
...
@@ -99,7 +104,8 @@ class FactorCashFlow(FactorBase):
...
@@ -99,7 +104,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# 经营活动产生的现金流量净额(TTM)/(营业总收入(TTM)-营业总成本(TTM))
# 经营活动产生的现金流量净额(TTM)/(营业总收入(TTM)-营业总成本(TTM))
def
nocf_to_operating_ni_ttm
(
self
,
ttm_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
nocf_to_operating_ni_ttm
(
ttm_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'net_operate_cash_flow'
,
'total_operating_revenue'
,
'total_operating_cost'
]
columns_list
=
[
'net_operate_cash_flow'
,
'total_operating_revenue'
,
'total_operating_cost'
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
[
'OptCFToNetIncomeTTM'
]
=
np
.
where
(
cash_flow
[
'OptCFToNetIncomeTTM'
]
=
np
.
where
(
...
@@ -111,7 +117,8 @@ class FactorCashFlow(FactorBase):
...
@@ -111,7 +117,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# 经营活动产生的现金流量净额(TTM)/流动负债(TTM)
# 经营活动产生的现金流量净额(TTM)/流动负债(TTM)
def
oper_cash_in_to_current_liability_ttm
(
self
,
ttm_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
oper_cash_in_to_current_liability_ttm
(
ttm_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'net_operate_cash_flow'
,
'total_current_liability'
]
columns_list
=
[
'net_operate_cash_flow'
,
'total_current_liability'
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
[
'OptCFToCurrLiabilityTTM'
]
=
np
.
where
(
cash_flow
[
'OptCFToCurrLiabilityTTM'
]
=
np
.
where
(
...
@@ -122,7 +129,8 @@ class FactorCashFlow(FactorBase):
...
@@ -122,7 +129,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# 期末现金及现金等价物余额(TTM)/流动负债(TTM)
# 期末现金及现金等价物余额(TTM)/流动负债(TTM)
def
cash_to_current_liability_ttm
(
self
,
ttm_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
cash_to_current_liability_ttm
(
ttm_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'cash_and_equivalents_at_end'
,
'total_current_assets'
]
columns_list
=
[
'cash_and_equivalents_at_end'
,
'total_current_assets'
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
[
'CashRatioTTM'
]
=
np
.
where
(
CalcTools
.
is_zero
(
cash_flow
.
total_current_assets
.
values
),
cash_flow
[
'CashRatioTTM'
]
=
np
.
where
(
CalcTools
.
is_zero
(
cash_flow
.
total_current_assets
.
values
),
...
@@ -133,7 +141,8 @@ class FactorCashFlow(FactorBase):
...
@@ -133,7 +141,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# 经营活动产生的现金流量净额(TTM)/(长期借款(TTM)+ 短期借款(TTM)+ 总市值 - 期末现金及现金等价物(TTM)
# 经营活动产生的现金流量净额(TTM)/(长期借款(TTM)+ 短期借款(TTM)+ 总市值 - 期末现金及现金等价物(TTM)
def
cfo_to_ev_ttm
(
self
,
ttm_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
cfo_to_ev_ttm
(
ttm_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'net_operate_cash_flow'
,
'longterm_loan'
,
'shortterm_loan'
,
'market_cap'
,
columns_list
=
[
'net_operate_cash_flow'
,
'longterm_loan'
,
'shortterm_loan'
,
'market_cap'
,
'cash_and_equivalents_at_end'
]
'cash_and_equivalents_at_end'
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
...
@@ -147,7 +156,8 @@ class FactorCashFlow(FactorBase):
...
@@ -147,7 +156,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# (经营活动产生的金流量净额(TTM) - 净利润(TTM)) /总资产(TTM)
# (经营活动产生的金流量净额(TTM) - 净利润(TTM)) /总资产(TTM)
def
acca_ttm
(
self
,
ttm_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
acca_ttm
(
ttm_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'net_operate_cash_flow'
,
'net_profit'
,
'total_assets'
]
columns_list
=
[
'net_operate_cash_flow'
,
'net_profit'
,
'total_assets'
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
[
'OptOnReToAssetTTM'
]
=
np
.
where
(
CalcTools
.
is_zero
(
cash_flow
.
total_assets
.
values
),
0
,
cash_flow
[
'OptOnReToAssetTTM'
]
=
np
.
where
(
CalcTools
.
is_zero
(
cash_flow
.
total_assets
.
values
),
0
,
...
@@ -158,7 +168,8 @@ class FactorCashFlow(FactorBase):
...
@@ -158,7 +168,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# 经营活动产生的现金流量净额(TTM)/归属于母公司所有者的净利润(TTM)
# 经营活动产生的现金流量净额(TTM)/归属于母公司所有者的净利润(TTM)
def
net_profit_cash_cover_ttm
(
self
,
ttm_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
net_profit_cash_cover_ttm
(
ttm_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'net_operate_cash_flow'
,
'np_parent_company_owners'
]
columns_list
=
[
'net_operate_cash_flow'
,
'np_parent_company_owners'
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
[
'NetProCashCoverTTM'
]
=
np
.
where
(
cash_flow
[
'NetProCashCoverTTM'
]
=
np
.
where
(
...
@@ -169,7 +180,8 @@ class FactorCashFlow(FactorBase):
...
@@ -169,7 +180,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# 经营活动产生的现金流量净额(TTM)/总资产(TTM)
# 经营活动产生的现金流量净额(TTM)/总资产(TTM)
def
oper_cash_in_to_asset_ttm
(
self
,
ttm_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
oper_cash_in_to_asset_ttm
(
ttm_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'net_operate_cash_flow'
,
'total_assets'
]
columns_list
=
[
'net_operate_cash_flow'
,
'total_assets'
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
ttm_cash_flow
.
loc
[:,
columns_list
]
cash_flow
[
'OptToAssertTTM'
]
=
np
.
where
(
CalcTools
.
is_zero
(
cash_flow
.
total_assets
.
values
),
cash_flow
[
'OptToAssertTTM'
]
=
np
.
where
(
CalcTools
.
is_zero
(
cash_flow
.
total_assets
.
values
),
...
@@ -180,7 +192,8 @@ class FactorCashFlow(FactorBase):
...
@@ -180,7 +192,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# 销售商品和提供劳务收到的现金(Latest)/营业收入(Latest)
# 销售商品和提供劳务收到的现金(Latest)/营业收入(Latest)
def
sales_service_cash_to_or_latest
(
self
,
tp_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
sales_service_cash_to_or_latest
(
tp_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'goods_sale_and_service_render_cash'
,
'operating_revenue'
]
columns_list
=
[
'goods_sale_and_service_render_cash'
,
'operating_revenue'
]
cash_flow
=
tp_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
tp_cash_flow
.
loc
[:,
columns_list
]
cash_flow
[
'SalesServCashToOR'
]
=
np
.
where
(
CalcTools
.
is_zero
(
cash_flow
.
operating_revenue
.
values
),
cash_flow
[
'SalesServCashToOR'
]
=
np
.
where
(
CalcTools
.
is_zero
(
cash_flow
.
operating_revenue
.
values
),
...
@@ -191,7 +204,8 @@ class FactorCashFlow(FactorBase):
...
@@ -191,7 +204,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# 经验活动产生的现金流量净额 / 营业收入
# 经验活动产生的现金流量净额 / 营业收入
def
cash_rate_of_sales_latest
(
self
,
tp_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
cash_rate_of_sales_latest
(
tp_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'net_operate_cash_flow'
,
'operating_revenue'
]
columns_list
=
[
'net_operate_cash_flow'
,
'operating_revenue'
]
cash_flow
=
tp_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
tp_cash_flow
.
loc
[:,
columns_list
]
cash_flow
[
'CashOfSales'
]
=
np
.
where
(
CalcTools
.
is_zero
(
cash_flow
.
operating_revenue
.
values
),
cash_flow
[
'CashOfSales'
]
=
np
.
where
(
CalcTools
.
is_zero
(
cash_flow
.
operating_revenue
.
values
),
...
@@ -202,7 +216,8 @@ class FactorCashFlow(FactorBase):
...
@@ -202,7 +216,8 @@ class FactorCashFlow(FactorBase):
return
factor_cash_flow
return
factor_cash_flow
# 经营活动产生的现金流量净额(Latest)/(营业总收入(Latest)-营业总成本(Latest))
# 经营活动产生的现金流量净额(Latest)/(营业总收入(Latest)-营业总成本(Latest))
def
nocf_to_operating_ni_latest
(
self
,
tp_cash_flow
,
factor_cash_flow
):
@
staticmethod
def
nocf_to_operating_ni_latest
(
tp_cash_flow
,
factor_cash_flow
):
columns_list
=
[
'net_operate_cash_flow'
,
'total_operating_revenue'
,
columns_list
=
[
'net_operate_cash_flow'
,
'total_operating_revenue'
,
'total_operating_cost'
]
'total_operating_cost'
]
cash_flow
=
tp_cash_flow
.
loc
[:,
columns_list
]
cash_flow
=
tp_cash_flow
.
loc
[:,
columns_list
]
...
@@ -223,7 +238,6 @@ def calculate(trade_date, cash_flow_dic, cash_flow): # 计算对应因子
...
@@ -223,7 +238,6 @@ def calculate(trade_date, cash_flow_dic, cash_flow): # 计算对应因子
factor_cash_flow
=
pd
.
DataFrame
()
factor_cash_flow
=
pd
.
DataFrame
()
factor_cash_flow
[
'symbol'
]
=
tp_cash_flow
.
index
factor_cash_flow
[
'symbol'
]
=
tp_cash_flow
.
index
# tp_cash_flow.set_index('symbol', inplace=True)
# 非TTM计算
# 非TTM计算
factor_cash_flow
=
cash_flow
.
nocf_to_operating_ni_latest
(
tp_cash_flow
,
factor_cash_flow
)
factor_cash_flow
=
cash_flow
.
nocf_to_operating_ni_latest
(
tp_cash_flow
,
factor_cash_flow
)
...
@@ -248,14 +262,6 @@ def calculate(trade_date, cash_flow_dic, cash_flow): # 计算对应因子
...
@@ -248,14 +262,6 @@ def calculate(trade_date, cash_flow_dic, cash_flow): # 计算对应因子
cash_flow
.
_storage_data
(
factor_cash_flow
,
trade_date
)
cash_flow
.
_storage_data
(
factor_cash_flow
,
trade_date
)
def
do_update
(
self
,
start_date
,
end_date
,
count
):
# 读取本地交易日
trade_date_sets
=
self
.
_trade_date
.
trade_date_sets_ago
(
start_date
,
end_date
,
count
)
for
trade_date
in
trade_date_sets
:
self
.
calculate
(
trade_date
)
print
(
'----->'
)
@
app
.
task
()
@
app
.
task
()
def
factor_calculate
(
**
kwargs
):
def
factor_calculate
(
**
kwargs
):
print
(
"cash_flow_kwargs: {}"
.
format
(
kwargs
))
print
(
"cash_flow_kwargs: {}"
.
format
(
kwargs
))
...
...
factor/factor_contrarian.py
View file @
40616b3c
...
@@ -45,7 +45,8 @@ class FactorContrarian(FactorBase):
...
@@ -45,7 +45,8 @@ class FactorContrarian(FactorBase):
super
(
FactorContrarian
,
self
)
.
_create_tables
(
create_sql
,
drop_sql
)
super
(
FactorContrarian
,
self
)
.
_create_tables
(
create_sql
,
drop_sql
)
# 销售成本率=营业成本(TTM)/营业收入(TTM)
# 销售成本率=营业成本(TTM)/营业收入(TTM)
def
sales_cost_ratio_ttm
(
self
,
tp_contrarian
,
factor_contrarian
):
@
staticmethod
def
sales_cost_ratio_ttm
(
tp_contrarian
,
factor_contrarian
):
columns_list
=
[
'operating_cost'
,
'operating_revenue'
]
columns_list
=
[
'operating_cost'
,
'operating_revenue'
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
[
'SalesCostTTM'
]
=
np
.
where
(
contrarian
[
'SalesCostTTM'
]
=
np
.
where
(
...
@@ -57,7 +58,8 @@ class FactorContrarian(FactorBase):
...
@@ -57,7 +58,8 @@ class FactorContrarian(FactorBase):
return
factor_contrarian
return
factor_contrarian
# 销售税金率=营业税金及附加(TTM)/营业收入(TTM)
# 销售税金率=营业税金及附加(TTM)/营业收入(TTM)
def
tax_ratio_ttm
(
self
,
tp_contrarian
,
factor_contrarian
):
@
staticmethod
def
tax_ratio_ttm
(
tp_contrarian
,
factor_contrarian
):
columns_list
=
[
'operating_tax_surcharges'
,
'operating_revenue'
]
columns_list
=
[
'operating_tax_surcharges'
,
'operating_revenue'
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
[
'TaxRTTM'
]
=
np
.
where
(
contrarian
[
'TaxRTTM'
]
=
np
.
where
(
...
@@ -69,7 +71,8 @@ class FactorContrarian(FactorBase):
...
@@ -69,7 +71,8 @@ class FactorContrarian(FactorBase):
return
factor_contrarian
return
factor_contrarian
# 财务费用与营业总收入之比=财务费用(TTM)/营业总收入(TTM)
# 财务费用与营业总收入之比=财务费用(TTM)/营业总收入(TTM)
def
financial_expense_rate_ttm
(
self
,
tp_contrarian
,
factor_contrarian
):
@
staticmethod
def
financial_expense_rate_ttm
(
tp_contrarian
,
factor_contrarian
):
columns_list
=
[
'financial_expense'
,
'total_operating_cost'
]
columns_list
=
[
'financial_expense'
,
'total_operating_cost'
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
[
'FinExpTTM'
]
=
np
.
where
(
contrarian
[
'FinExpTTM'
]
=
np
.
where
(
...
@@ -81,7 +84,8 @@ class FactorContrarian(FactorBase):
...
@@ -81,7 +84,8 @@ class FactorContrarian(FactorBase):
return
factor_contrarian
return
factor_contrarian
# 营业费用与营业总收入之比=销售费用(TTM)/营业总收入(TTM)
# 营业费用与营业总收入之比=销售费用(TTM)/营业总收入(TTM)
def
operating_expense_rate_ttm
(
self
,
tp_contrarian
,
factor_contrarian
):
@
staticmethod
def
operating_expense_rate_ttm
(
tp_contrarian
,
factor_contrarian
):
columns_list
=
[
'sale_expense'
,
'total_operating_cost'
,
'total_operating_revenue'
]
columns_list
=
[
'sale_expense'
,
'total_operating_cost'
,
'total_operating_revenue'
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
[
'OperExpTTM'
]
=
np
.
where
(
contrarian
[
'OperExpTTM'
]
=
np
.
where
(
...
@@ -93,7 +97,8 @@ class FactorContrarian(FactorBase):
...
@@ -93,7 +97,8 @@ class FactorContrarian(FactorBase):
return
factor_contrarian
return
factor_contrarian
# 管理费用与营业总收入之比=管理费用/营业总收入
# 管理费用与营业总收入之比=管理费用/营业总收入
def
admini_expense_rate_ttm
(
self
,
tp_contrarian
,
factor_contrarian
):
@
staticmethod
def
admini_expense_rate_ttm
(
tp_contrarian
,
factor_contrarian
):
columns_list
=
[
'administration_expense'
,
'total_operating_revenue'
]
columns_list
=
[
'administration_expense'
,
'total_operating_revenue'
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
[
'AdminExpTTM'
]
=
np
.
where
(
contrarian
[
'AdminExpTTM'
]
=
np
.
where
(
...
@@ -105,7 +110,8 @@ class FactorContrarian(FactorBase):
...
@@ -105,7 +110,8 @@ class FactorContrarian(FactorBase):
return
factor_contrarian
return
factor_contrarian
# 销售期间费用率 = (财务费用 + 销售费用 + 管理费用) / (营业收入)
# 销售期间费用率 = (财务费用 + 销售费用 + 管理费用) / (营业收入)
def
period_costs_rate_ttm
(
self
,
tp_contrarian
,
factor_contrarian
):
@
staticmethod
def
period_costs_rate_ttm
(
tp_contrarian
,
factor_contrarian
):
columns_list
=
[
'financial_expense'
,
'sale_expense'
,
'administration_expense'
,
'operating_revenue'
]
columns_list
=
[
'financial_expense'
,
'sale_expense'
,
'administration_expense'
,
'operating_revenue'
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
[
'PeridCostTTM'
]
=
np
.
where
(
contrarian
[
'PeridCostTTM'
]
=
np
.
where
(
...
@@ -118,7 +124,8 @@ class FactorContrarian(FactorBase):
...
@@ -118,7 +124,8 @@ class FactorContrarian(FactorBase):
return
factor_contrarian
return
factor_contrarian
# 负债合计/有形资产(流动资产+固定资产)
# 负债合计/有形资产(流动资产+固定资产)
def
debt_tangible_equity_ratio_latest
(
self
,
tp_contrarian
,
factor_contrarian
):
@
staticmethod
def
debt_tangible_equity_ratio_latest
(
tp_contrarian
,
factor_contrarian
):
columns_list
=
[
'total_liability'
,
'total_current_liability'
,
'fixed_assets'
]
columns_list
=
[
'total_liability'
,
'total_current_liability'
,
'fixed_assets'
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
[
'DTE'
]
=
np
.
where
(
contrarian
[
'DTE'
]
=
np
.
where
(
...
@@ -130,7 +137,8 @@ class FactorContrarian(FactorBase):
...
@@ -130,7 +137,8 @@ class FactorContrarian(FactorBase):
return
factor_contrarian
return
factor_contrarian
# 债务总资产比=负债合计/资产合计
# 债务总资产比=负债合计/资产合计
def
debts_asset_ratio_latest
(
self
,
tp_contrarian
,
factor_contrarian
):
@
staticmethod
def
debts_asset_ratio_latest
(
tp_contrarian
,
factor_contrarian
):
columns_list
=
[
'total_liability'
,
'total_assets'
]
columns_list
=
[
'total_liability'
,
'total_assets'
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
[
'DA'
]
=
np
.
where
(
contrarian
[
'DA'
]
=
np
.
where
(
...
@@ -142,7 +150,8 @@ class FactorContrarian(FactorBase):
...
@@ -142,7 +150,8 @@ class FactorContrarian(FactorBase):
# InteBearDebtToTotalCapital = 有息负债/总资本 总资本=固定资产+净运营资本 净运营资本=流动资产-流动负债
# InteBearDebtToTotalCapital = 有息负债/总资本 总资本=固定资产+净运营资本 净运营资本=流动资产-流动负债
# InteBearDebtToTotalCapital = 有息负债/(固定资产 + 流动资产 - 流动负债)
# InteBearDebtToTotalCapital = 有息负债/(固定资产 + 流动资产 - 流动负债)
def
inte_bear_debt_to_total_capital_latest
(
self
,
tp_contrarian
,
factor_contrarian
):
@
staticmethod
def
inte_bear_debt_to_total_capital_latest
(
tp_contrarian
,
factor_contrarian
):
columns_list
=
[
'interest_bearing_liability'
,
'fixed_assets'
,
'total_current_assets'
,
columns_list
=
[
'interest_bearing_liability'
,
'fixed_assets'
,
'total_current_assets'
,
'total_current_liability'
]
'total_current_liability'
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
contrarian
=
tp_contrarian
.
loc
[:,
columns_list
]
...
...
factor/factor_earning.py
View file @
40616b3c
...
@@ -76,7 +76,8 @@ class FactorEarning(FactorBase):
...
@@ -76,7 +76,8 @@ class FactorEarning(FactorBase):
)ENGINE=InnoDB DEFAULT CHARSET=utf8;"""
.
format
(
self
.
_name
)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;"""
.
format
(
self
.
_name
)
super
(
FactorEarning
,
self
)
.
_create_tables
(
create_sql
,
drop_sql
)
super
(
FactorEarning
,
self
)
.
_create_tables
(
create_sql
,
drop_sql
)
def
net_profit_ratio
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
net_profit_ratio
(
ttm_earning
,
factor_earning
):
"""
"""
销售净利率(Net profit ratio)
销售净利率(Net profit ratio)
销售净利率=净利润/营业收入
销售净利率=净利润/营业收入
...
@@ -93,7 +94,8 @@ class FactorEarning(FactorBase):
...
@@ -93,7 +94,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
operating_profit_ratio
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
operating_profit_ratio
(
ttm_earning
,
factor_earning
):
"""
"""
营业净利率
营业净利率
营业净利率=营业利润/营业收入
营业净利率=营业利润/营业收入
...
@@ -110,7 +112,8 @@ class FactorEarning(FactorBase):
...
@@ -110,7 +112,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
np_to_tor
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
np_to_tor
(
ttm_earning
,
factor_earning
):
"""
"""
净利润与营业总收入之比
净利润与营业总收入之比
净利润与营业总收入之比=净利润/营业总收入
净利润与营业总收入之比=净利润/营业总收入
...
@@ -127,7 +130,8 @@ class FactorEarning(FactorBase):
...
@@ -127,7 +130,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
operating_profit_to_tor
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
operating_profit_to_tor
(
ttm_earning
,
factor_earning
):
"""
"""
营业利润与营业总收入之比
营业利润与营业总收入之比
营业利润与营业总收入之比=营业利润/营业总收入
营业利润与营业总收入之比=营业利润/营业总收入
...
@@ -144,7 +148,8 @@ class FactorEarning(FactorBase):
...
@@ -144,7 +148,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
gross_income_ratio
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
gross_income_ratio
(
ttm_earning
,
factor_earning
):
"""
"""
销售毛利率
销售毛利率
销售毛利率=(营业收入-营业成本)/营业收入
销售毛利率=(营业收入-营业成本)/营业收入
...
@@ -162,7 +167,8 @@ class FactorEarning(FactorBase):
...
@@ -162,7 +167,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
ebit_to_tor
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
ebit_to_tor
(
ttm_earning
,
factor_earning
):
"""
"""
息税前利润与营业总收入之比
息税前利润与营业总收入之比
息税前利润与营业总收入之比=(利润总额+利息支出-利息收入)/营业总收入
息税前利润与营业总收入之比=(利润总额+利息支出-利息收入)/营业总收入
...
@@ -183,7 +189,8 @@ class FactorEarning(FactorBase):
...
@@ -183,7 +189,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
roa
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
roa
(
ttm_earning
,
factor_earning
):
"""
"""
资产回报率
资产回报率
资产回报率=净利润/总资产
资产回报率=净利润/总资产
...
@@ -200,11 +207,12 @@ class FactorEarning(FactorBase):
...
@@ -200,11 +207,12 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
roa5
(
self
,
ttm_earning_5y
,
factor_earning
):
@
staticmethod
def
roa5
(
ttm_earning_5y
,
factor_earning
):
"""
"""
5年权益回报率
5年权益回报率
5年权益回报率=净利润/总资产
5年权益回报率=净利润/总资产
:param ttm_earning:
:param ttm_earning
_5y
:
:param factor_earning:
:param factor_earning:
:return:
:return:
"""
"""
...
@@ -217,7 +225,8 @@ class FactorEarning(FactorBase):
...
@@ -217,7 +225,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
roe
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
roe
(
ttm_earning
,
factor_earning
):
"""
"""
权益回报率
权益回报率
权益回报率=净利润/股东权益
权益回报率=净利润/股东权益
...
@@ -234,10 +243,11 @@ class FactorEarning(FactorBase):
...
@@ -234,10 +243,11 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
roe5
(
self
,
ttm_earning_5y
,
factor_earning
):
@
staticmethod
def
roe5
(
ttm_earning_5y
,
factor_earning
):
"""
"""
5年权益回报率
5年权益回报率
:param ttm_earning:
:param ttm_earning
_5y
:
:param factor_earning:
:param factor_earning:
:return:
:return:
"""
"""
...
@@ -250,11 +260,12 @@ class FactorEarning(FactorBase):
...
@@ -250,11 +260,12 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
roe_diluted
(
self
,
tp_earning
,
factor_earning
):
@
staticmethod
def
roe_diluted
(
tp_earning
,
factor_earning
):
"""
"""
净资产收益率(摊薄)
净资产收益率(摊薄)
净资产收益率(摊薄)=归属于母公司的净利润/期末归属于母公司的所有者权益
净资产收益率(摊薄)=归属于母公司的净利润/期末归属于母公司的所有者权益
:param t
tm
_earning:
:param t
p
_earning:
:param factor_earning:
:param factor_earning:
:return:
:return:
"""
"""
...
@@ -269,7 +280,8 @@ class FactorEarning(FactorBase):
...
@@ -269,7 +280,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
roe_avg
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
roe_avg
(
ttm_earning
,
factor_earning
):
"""
"""
资产收益率(平均)
资产收益率(平均)
资产收益率(平均)=归属于母公司的净利润*2/(期末归属于母公司的所有者权益
资产收益率(平均)=归属于母公司的净利润*2/(期末归属于母公司的所有者权益
...
@@ -289,7 +301,6 @@ class FactorEarning(FactorBase):
...
@@ -289,7 +301,6 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
roe_weighted
(
self
,
ttm_earning
,
factor_earning
):
def
roe_weighted
(
self
,
ttm_earning
,
factor_earning
):
"""
"""
:param ttm_earning:
:param ttm_earning:
...
@@ -298,7 +309,8 @@ class FactorEarning(FactorBase):
...
@@ -298,7 +309,8 @@ class FactorEarning(FactorBase):
"""
"""
pass
pass
def
roe_cut
(
self
,
tp_earning
,
factor_earning
):
@
staticmethod
def
roe_cut
(
tp_earning
,
factor_earning
):
"""
"""
:param tp_earning:
:param tp_earning:
:param factor_earning:
:param factor_earning:
...
@@ -338,7 +350,8 @@ class FactorEarning(FactorBase):
...
@@ -338,7 +350,8 @@ class FactorEarning(FactorBase):
"""
"""
pass
pass
def
roa_ebit_ttm
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
roa_ebit_ttm
(
ttm_earning
,
factor_earning
):
"""
"""
总资产报酬率
总资产报酬率
ROAEBIT = EBIT*2/(期初总资产+期末总资产)
ROAEBIT = EBIT*2/(期初总资产+期末总资产)
...
@@ -360,7 +373,8 @@ class FactorEarning(FactorBase):
...
@@ -360,7 +373,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
operating_ni_to_tp_ttm
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
operating_ni_to_tp_ttm
(
ttm_earning
,
factor_earning
):
"""
"""
经营活动净收益/利润总额
经营活动净收益/利润总额
(注,对于非金融企业 经营活动净收益=营业总收入-营业总成本;
(注,对于非金融企业 经营活动净收益=营业总收入-营业总成本;
...
@@ -382,7 +396,8 @@ class FactorEarning(FactorBase):
...
@@ -382,7 +396,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
operating_ni_to_tp_latest
(
self
,
tp_earning
,
factor_earning
):
@
staticmethod
def
operating_ni_to_tp_latest
(
tp_earning
,
factor_earning
):
"""
"""
经营活动净收益/利润总额
经营活动净收益/利润总额
(注,对于非金融企业 经营活动净收益=营业总收入-营业总成本;
(注,对于非金融企业 经营活动净收益=营业总收入-营业总成本;
...
@@ -404,7 +419,8 @@ class FactorEarning(FactorBase):
...
@@ -404,7 +419,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
invest_r_associates_to_tp_ttm
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
invest_r_associates_to_tp_ttm
(
ttm_earning
,
factor_earning
):
"""
"""
对联营和营公司投资收益/利润总额
对联营和营公司投资收益/利润总额
:param ttm_earning:
:param ttm_earning:
...
@@ -421,7 +437,8 @@ class FactorEarning(FactorBase):
...
@@ -421,7 +437,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
invest_r_associates_to_tp_latest
(
self
,
tp_earning
,
factor_earning
):
@
staticmethod
def
invest_r_associates_to_tp_latest
(
tp_earning
,
factor_earning
):
"""
"""
对联营和营公司投资收益/利润总额
对联营和营公司投资收益/利润总额
:param tp_earning:
:param tp_earning:
...
@@ -438,7 +455,8 @@ class FactorEarning(FactorBase):
...
@@ -438,7 +455,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
npcut_to_np
(
self
,
tp_earning
,
factor_earning
):
@
staticmethod
def
npcut_to_np
(
tp_earning
,
factor_earning
):
"""
"""
扣除非经常损益后的净利润/净利润
扣除非经常损益后的净利润/净利润
:param tp_earning:
:param tp_earning:
...
@@ -455,7 +473,8 @@ class FactorEarning(FactorBase):
...
@@ -455,7 +473,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
interest_cover_ttm
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
interest_cover_ttm
(
ttm_earning
,
factor_earning
):
"""
"""
利息保障倍数
利息保障倍数
InterestCover=(TP + INT_EXP - INT_COME)/(INT_EXP - INT_COME)
InterestCover=(TP + INT_EXP - INT_COME)/(INT_EXP - INT_COME)
...
@@ -467,21 +486,18 @@ class FactorEarning(FactorBase):
...
@@ -467,21 +486,18 @@ class FactorEarning(FactorBase):
columns_list
=
[
'total_profit'
,
'financial_expense'
,
'interest_income'
]
columns_list
=
[
'total_profit'
,
'financial_expense'
,
'interest_income'
]
earning
=
ttm_earning
.
loc
[:,
columns_list
]
earning
=
ttm_earning
.
loc
[:,
columns_list
]
earning
[
'interest_cover_ttm'
]
=
np
.
where
(
earning
[
'interest_cover_ttm'
]
=
np
.
where
(
CalcTools
.
is_zero
(
earning
.
financial_expense
.
values
-
CalcTools
.
is_zero
(
earning
.
financial_expense
.
values
-
earning
.
interest_income
.
values
),
0
,
earning
.
interest_income
.
values
),
0
,
(
earning
.
total_profit
.
values
+
earning
.
financial_expense
.
values
-
earning
.
interest_income
.
values
)
/
(
earning
.
total_profit
.
values
+
(
earning
.
financial_expense
.
values
-
earning
.
interest_income
.
values
))
earning
.
financial_expense
.
values
-
earning
.
interest_income
.
values
)
/
(
earning
.
financial_expense
.
values
-
earning
.
interest_income
.
values
)
)
earning
=
earning
.
drop
(
columns_list
,
axis
=
1
)
earning
=
earning
.
drop
(
columns_list
,
axis
=
1
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
degm
(
self
,
ttm_earning
,
ttm_earning_p1y
,
factor_earning
):
@
staticmethod
def
degm
(
ttm_earning
,
ttm_earning_p1y
,
factor_earning
):
"""
"""
毛利率增长,与去年同期相比
毛利率增长,与去年同期相比
:param ttm_earning_p1y:
:param ttm_earning:
:param ttm_earning:
:param factor_earning:
:param factor_earning:
:return:
:return:
...
@@ -506,7 +522,8 @@ class FactorEarning(FactorBase):
...
@@ -506,7 +522,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
net_non_oi_to_tp_ttm
(
self
,
ttm_earning
,
factor_earning
):
@
staticmethod
def
net_non_oi_to_tp_ttm
(
ttm_earning
,
factor_earning
):
"""
"""
营业外收支净额/利润总额
营业外收支净额/利润总额
:param ttm_earning:
:param ttm_earning:
...
@@ -525,7 +542,8 @@ class FactorEarning(FactorBase):
...
@@ -525,7 +542,8 @@ class FactorEarning(FactorBase):
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
factor_earning
=
pd
.
merge
(
factor_earning
,
earning
,
on
=
"symbol"
)
return
factor_earning
return
factor_earning
def
net_non_oi_to_tp_latest
(
self
,
tp_earning
,
factor_earning
):
@
staticmethod
def
net_non_oi_to_tp_latest
(
tp_earning
,
factor_earning
):
"""
"""
营业外收支净额/利润总额
营业外收支净额/利润总额
:param tp_earning:
:param tp_earning:
...
...
factor/factor_growth.py
View file @
40616b3c
...
@@ -60,27 +60,31 @@ class Growth(FactorBase):
...
@@ -60,27 +60,31 @@ class Growth(FactorBase):
)ENGINE=InnoDB DEFAULT CHARSET=utf8;"""
.
format
(
self
.
_name
)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;"""
.
format
(
self
.
_name
)
super
(
Growth
,
self
)
.
_create_tables
(
create_sql
,
drop_sql
)
super
(
Growth
,
self
)
.
_create_tables
(
create_sql
,
drop_sql
)
def
historical_net_asset_grow_rate
(
self
,
tp_historical_growth
):
@
staticmethod
def
historical_net_asset_grow_rate
(
tp_historical_growth
):
"""
"""
净资产增长率
净资产增长率
:param tp_historical_growth:
:param tp_historical_growth:
:param factor_historical_growth:
:return:
:return:
"""
"""
columns_lists
=
[
'symbol'
,
'total_owner_equities'
,
'total_owner_equities_pre_year'
]
columns_lists
=
[
'symbol'
,
'total_owner_equities'
,
'total_owner_equities_pre_year'
]
historical_growth
=
tp_historical_growth
.
loc
[:,
columns_lists
]
historical_growth
=
tp_historical_growth
.
loc
[:,
columns_lists
]
if
len
(
historical_growth
)
<=
0
:
if
len
(
historical_growth
)
<=
0
:
return
return
fun
=
lambda
x
:
((
x
[
0
]
/
x
[
1
])
-
1.0
if
x
[
1
]
and
x
[
1
]
!=
0
and
x
[
0
]
is
not
None
and
x
[
1
]
is
not
None
else
None
)
fun
=
lambda
x
:
((
x
[
0
]
/
x
[
1
])
-
1.0
if
x
[
1
]
and
x
[
1
]
!=
0
and
x
[
0
]
is
not
None
and
x
[
1
]
is
not
None
else
None
)
historical_growth
[
'NetAsset1YChg'
]
=
historical_growth
[[
'total_owner_equities'
,
historical_growth
[
'NetAsset1YChg'
]
=
historical_growth
[[
'total_owner_equities'
,
'total_owner_equities_pre_year'
]]
.
apply
(
fun
,
axis
=
1
)
'total_owner_equities_pre_year'
]]
.
apply
(
fun
,
axis
=
1
)
historical_growth
=
historical_growth
.
drop
(
columns
=
[
'total_owner_equities'
,
'total_owner_equities_pre_year'
],
axis
=
1
)
historical_growth
=
historical_growth
.
drop
(
columns
=
[
'total_owner_equities'
,
'total_owner_equities_pre_year'
],
axis
=
1
)
# factor_historical_growth = pd.merge(factor_historical_growth, historical_growth, on='symbol')
# factor_historical_growth = pd.merge(factor_historical_growth, historical_growth, on='symbol')
return
historical_growth
return
historical_growth
def
historical_total_asset_grow_rate
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_total_asset_grow_rate
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
总资产增长率
总资产增长率
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -99,7 +103,8 @@ class Growth(FactorBase):
...
@@ -99,7 +103,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_operating_revenue_grow_rate
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_operating_revenue_grow_rate
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
营业收入增长率
营业收入增长率
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -118,7 +123,8 @@ class Growth(FactorBase):
...
@@ -118,7 +123,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_operating_profit_grow_rate
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_operating_profit_grow_rate
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
营业利润增长率
营业利润增长率
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -137,7 +143,8 @@ class Growth(FactorBase):
...
@@ -137,7 +143,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_total_profit_grow_rate
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_total_profit_grow_rate
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
利润总额增长率
利润总额增长率
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -156,7 +163,8 @@ class Growth(FactorBase):
...
@@ -156,7 +163,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_net_profit_grow_rate
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_net_profit_grow_rate
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
净利润增长率
净利润增长率
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -175,7 +183,8 @@ class Growth(FactorBase):
...
@@ -175,7 +183,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_np_parent_company_grow_rate
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_np_parent_company_grow_rate
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
归属母公司股东的净利润增长率
归属母公司股东的净利润增长率
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -195,7 +204,8 @@ class Growth(FactorBase):
...
@@ -195,7 +204,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_net_profit_grow_rate_3y
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_net_profit_grow_rate_3y
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
净利润3年复合增长率
净利润3年复合增长率
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -214,7 +224,8 @@ class Growth(FactorBase):
...
@@ -214,7 +224,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_net_profit_grow_rate_5y
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_net_profit_grow_rate_5y
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
净利润5年复合增长率
净利润5年复合增长率
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -233,7 +244,8 @@ class Growth(FactorBase):
...
@@ -233,7 +244,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_operating_revenue_grow_rate_3y
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_operating_revenue_grow_rate_3y
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
营业收入3年复合增长率
营业收入3年复合增长率
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -254,7 +266,8 @@ class Growth(FactorBase):
...
@@ -254,7 +266,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_operating_revenue_grow_rate_5y
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_operating_revenue_grow_rate_5y
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
营业收入5年复合增长率
营业收入5年复合增长率
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -275,7 +288,8 @@ class Growth(FactorBase):
...
@@ -275,7 +288,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_net_cash_flow_grow_rate
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_net_cash_flow_grow_rate
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
缺数据
缺数据
净现金流量增长率
净现金流量增长率
...
@@ -295,7 +309,8 @@ class Growth(FactorBase):
...
@@ -295,7 +309,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_np_parent_company_cut_yoy
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_np_parent_company_cut_yoy
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
缺失数据
缺失数据
归属母公司股东的净利润(扣除)同比增长
归属母公司股东的净利润(扣除)同比增长
...
@@ -315,27 +330,8 @@ class Growth(FactorBase):
...
@@ -315,27 +330,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_egro_
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
"""
def
historical_egro
(
tp_historical_growth
,
factor_historical_growth
):
5年收益增长率
:param tp_historical_growth:
:param factor_historical_growth:
:return:
"""
if
len
(
tp_historical_growth
)
<
3
:
return
columns_lists
=
[
'symbol'
,
'net_profit'
,
'net_profit_pre_year_1'
,
'net_profit_pre_year_2'
,
'net_profit_pre_year_3'
,
'net_profit_pre_year_4'
]
regr
=
linear_model
.
LinearRegression
()
# 读取五年的时间和净利润
historical_growth
=
tp_historical_growth
.
loc
[:,
columns_lists
]
regr
.
fit
(
tp_historical_growth
[
'x'
]
.
values
.
reshape
(
-
1
,
1
),
tp_historical_growth
[
'y'
]
.
values
)
weight
=
regr
.
coef_
mean
=
tp_historical_growth
[
'y'
]
.
mean
()
def
historical_egro
(
self
,
tp_historical_growth
,
factor_historical_growth
):
columns_lists
=
[
'symbol'
,
'net_profit'
,
'net_profit_pre_year_1'
,
'net_profit_pre_year_2'
,
columns_lists
=
[
'symbol'
,
'net_profit'
,
'net_profit_pre_year_1'
,
'net_profit_pre_year_2'
,
'net_profit_pre_year_3'
,
'net_profit_pre_year_4'
]
'net_profit_pre_year_3'
,
'net_profit_pre_year_4'
]
regr
=
linear_model
.
LinearRegression
()
regr
=
linear_model
.
LinearRegression
()
...
@@ -368,11 +364,9 @@ class Growth(FactorBase):
...
@@ -368,11 +364,9 @@ class Growth(FactorBase):
# range(0, 5)) else None)
# range(0, 5)) else None)
historical_growth
[
'coefficient'
]
=
historical_growth
.
apply
(
fun2
,
axis
=
1
)
historical_growth
[
'coefficient'
]
=
historical_growth
.
apply
(
fun2
,
axis
=
1
)
historical_growth
[
'mean'
]
=
historical_growth
[[
'net_profit'
,
'net_profit_pre_year_1'
,
'net_profit_pre_year_2'
,
'net_profit_pre_year_3'
,
'net_profit_pre_year_4'
]]
.
fillna
(
'nan'
)
.
mean
(
axis
=
1
)
historical_growth
[
'mean'
]
=
historical_growth
[[
'net_profit'
,
'net_profit_pre_year_1'
,
'net_profit_pre_year_2'
,
'net_profit_pre_year_3'
,
'net_profit_pre_year_4'
]]
.
fillna
(
'nan'
)
.
mean
(
axis
=
1
)
fun1
=
lambda
x
:
x
[
0
]
/
abs
(
x
[
1
])
if
x
[
1
]
!=
0
and
x
[
1
]
is
not
None
and
x
[
0
]
is
not
None
else
None
fun1
=
lambda
x
:
x
[
0
]
/
abs
(
x
[
1
])
if
x
[
1
]
!=
0
and
x
[
1
]
is
not
None
and
x
[
0
]
is
not
None
else
None
historical_growth
[
'NetPft5YAvgChgTTM'
]
=
historical_growth
[[
'coefficient'
,
'mean'
]]
.
apply
(
fun1
,
axis
=
1
)
historical_growth
[
'NetPft5YAvgChgTTM'
]
=
historical_growth
[[
'coefficient'
,
'mean'
]]
.
apply
(
fun1
,
axis
=
1
)
# historical_growth = historical_growth.drop(
# historical_growth = historical_growth.drop(
...
@@ -384,7 +378,8 @@ class Growth(FactorBase):
...
@@ -384,7 +378,8 @@ class Growth(FactorBase):
return
factor_historical_growth
return
factor_historical_growth
def
historical_sue
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_sue
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
未预期盈余
未预期盈余
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -396,8 +391,10 @@ class Growth(FactorBase):
...
@@ -396,8 +391,10 @@ class Growth(FactorBase):
historical_growth
=
tp_historical_growth
.
loc
[:,
columns_lists
]
historical_growth
=
tp_historical_growth
.
loc
[:,
columns_lists
]
if
len
(
historical_growth
)
<=
0
:
if
len
(
historical_growth
)
<=
0
:
return
return
historical_growth
[
'mean'
]
=
historical_growth
[[
'net_profit'
,
'net_profit_pre_year_1'
,
'net_profit_pre_year_2'
,
'net_profit_pre_year_3'
,
'net_profit_pre_year_4'
]]
.
fillna
(
0.0
)
.
mean
(
axis
=
1
)
historical_growth
[
'mean'
]
=
historical_growth
[[
'net_profit'
,
'net_profit_pre_year_1'
,
'net_profit_pre_year_2'
,
historical_growth
[
'std'
]
=
historical_growth
[[
'net_profit'
,
'net_profit_pre_year_1'
,
'net_profit_pre_year_2'
,
'net_profit_pre_year_3'
,
'net_profit_pre_year_4'
]]
.
fillna
(
0.0
)
.
std
(
axis
=
1
)
'net_profit_pre_year_3'
,
'net_profit_pre_year_4'
]]
.
fillna
(
0.0
)
.
mean
(
axis
=
1
)
historical_growth
[
'std'
]
=
historical_growth
[[
'net_profit'
,
'net_profit_pre_year_1'
,
'net_profit_pre_year_2'
,
'net_profit_pre_year_3'
,
'net_profit_pre_year_4'
]]
.
fillna
(
0.0
)
.
std
(
axis
=
1
)
fun
=
lambda
x
:
(
x
[
0
]
-
x
[
1
])
/
x
[
2
]
if
x
[
2
]
!=
0
and
x
[
1
]
is
not
None
and
x
[
0
]
is
not
None
and
x
[
2
]
is
not
None
else
None
fun
=
lambda
x
:
(
x
[
0
]
-
x
[
1
])
/
x
[
2
]
if
x
[
2
]
!=
0
and
x
[
1
]
is
not
None
and
x
[
0
]
is
not
None
and
x
[
2
]
is
not
None
else
None
...
@@ -409,7 +406,8 @@ class Growth(FactorBase):
...
@@ -409,7 +406,8 @@ class Growth(FactorBase):
return
factor_historical_growth
return
factor_historical_growth
def
historical_suoi
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_suoi
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
未预期毛利
未预期毛利
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -438,21 +436,15 @@ class Growth(FactorBase):
...
@@ -438,21 +436,15 @@ class Growth(FactorBase):
historical_growth
[
'std'
]
=
historical_growth
[[
'gi_2'
,
'gi_3'
,
'gi_4'
,
'gi_5'
]]
.
std
(
axis
=
1
)
historical_growth
[
'std'
]
=
historical_growth
[[
'gi_2'
,
'gi_3'
,
'gi_4'
,
'gi_5'
]]
.
std
(
axis
=
1
)
fun
=
lambda
x
:
((
x
[
0
]
-
x
[
1
])
/
x
[
2
]
if
x
[
2
]
!=
0
and
x
[
1
]
is
not
None
and
x
[
0
]
is
not
None
and
x
[
2
]
is
not
None
else
None
)
fun
=
lambda
x
:
((
x
[
0
]
-
x
[
1
])
/
x
[
2
]
if
x
[
2
]
!=
0
and
x
[
1
]
is
not
None
and
x
[
0
]
is
not
None
and
x
[
2
]
is
not
None
else
None
)
# historical_growth['StdUxpGrPft1YTTM'] = (historical_growth['gi_1'] - historical_growth['mean']) / historical_growth['std']
historical_growth
[
'StdUxpGrPft1YTTM'
]
=
historical_growth
[[
'gi_1'
,
'mean'
,
'std'
]]
.
apply
(
fun
,
axis
=
1
)
historical_growth
[
'StdUxpGrPft1YTTM'
]
=
historical_growth
[[
'gi_1'
,
'mean'
,
'std'
]]
.
apply
(
fun
,
axis
=
1
)
# historical_growth = historical_growth.drop(columns=['operating_revenue', 'operating_revenue_pre_year_1', 'operating_revenue_pre_year_2',
# 'operating_revenue_pre_year_3', 'operating_revenue_pre_year_4',
# 'operating_cost', 'operating_cost_pre_year_1', 'operating_cost_pre_year_2',
# 'operating_cost_pre_year_3', 'operating_cost_pre_year_4', 'std', 'mean',
# 'gi_1', 'gi_2', 'gi_3', 'gi_4', 'gi_5'], axis=1)
historical_growth
=
historical_growth
[[
'symbol'
,
'StdUxpGrPft1YTTM'
]]
historical_growth
=
historical_growth
[[
'symbol'
,
'StdUxpGrPft1YTTM'
]]
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_financing_cash_grow_rate
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_financing_cash_grow_rate
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
筹资活动产生的现金流量净额增长率
筹资活动产生的现金流量净额增长率
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -472,7 +464,8 @@ class Growth(FactorBase):
...
@@ -472,7 +464,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_oper_cash_grow_rate
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_oper_cash_grow_rate
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
经营活动产生的现金流量净额
经营活动产生的现金流量净额
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -492,7 +485,8 @@ class Growth(FactorBase):
...
@@ -492,7 +485,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_invest_cash_grow_rate
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_invest_cash_grow_rate
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
投资活动产生的现金流量净额
投资活动产生的现金流量净额
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -512,7 +506,8 @@ class Growth(FactorBase):
...
@@ -512,7 +506,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
historical_sgro
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
historical_sgro
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
五年营业收入增长率
五年营业收入增长率
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -539,19 +534,18 @@ class Growth(FactorBase):
...
@@ -539,19 +534,18 @@ class Growth(FactorBase):
return
False
return
False
def
fun2
(
x
):
def
fun2
(
x
):
aa
=
x
[[
'operating_revenue'
,
'operating_revenue_pre_year_1'
,
'operating_revenue_pre_year_2'
,
'operating_revenue_pre_year_3'
,
'operating_revenue_pre_year_4'
]]
.
fillna
(
'nan'
)
.
values
.
reshape
(
-
1
,
1
)
aa
=
x
[[
'operating_revenue'
,
'operating_revenue_pre_year_1'
,
'operating_revenue_pre_year_2'
,
'operating_revenue_pre_year_3'
,
'operating_revenue_pre_year_4'
]]
.
fillna
(
'nan'
)
.
values
.
reshape
(
-
1
,
1
)
if
has_non
(
aa
):
if
has_non
(
aa
):
return
None
return
None
else
:
else
:
regr
.
fit
(
aa
,
range
(
0
,
5
))
regr
.
fit
(
aa
,
range
(
0
,
5
))
return
regr
.
coef_
[
-
1
]
return
regr
.
coef_
[
-
1
]
# fun = lambda x: (regr.coef_[-1] if regr.fit(x[['operating_revenue', 'operating_revenue_pre_year_1',
# 'operating_revenue_pre_year_2', 'operating_revenue_pre_year_3',
# 'operating_revenue_pre_year_4']].values.reshape(-1, 1),
# range(0, 5)) else None)
historical_growth
[
'coefficient'
]
=
historical_growth
.
apply
(
fun2
,
axis
=
1
)
historical_growth
[
'coefficient'
]
=
historical_growth
.
apply
(
fun2
,
axis
=
1
)
historical_growth
[
'mean'
]
=
historical_growth
[[
'operating_revenue'
,
'operating_revenue_pre_year_1'
,
'operating_revenue_pre_year_2'
,
'operating_revenue_pre_year_3'
,
'operating_revenue_pre_year_4'
]]
.
fillna
(
0.0
)
.
mean
(
axis
=
1
)
historical_growth
[
'mean'
]
=
historical_growth
[[
'operating_revenue'
,
'operating_revenue_pre_year_1'
,
'operating_revenue_pre_year_2'
,
'operating_revenue_pre_year_3'
,
'operating_revenue_pre_year_4'
]]
.
fillna
(
0.0
)
.
mean
(
axis
=
1
)
fun1
=
lambda
x
:
x
[
0
]
/
abs
(
x
[
1
])
if
x
[
1
]
is
not
None
and
x
[
0
]
is
not
None
and
x
[
1
]
!=
0
else
None
fun1
=
lambda
x
:
x
[
0
]
/
abs
(
x
[
1
])
if
x
[
1
]
is
not
None
and
x
[
0
]
is
not
None
and
x
[
1
]
!=
0
else
None
historical_growth
[
'Sales5YChgTTM'
]
=
historical_growth
[[
'coefficient'
,
'mean'
]]
.
apply
(
fun1
,
axis
=
1
)
historical_growth
[
'Sales5YChgTTM'
]
=
historical_growth
[[
'coefficient'
,
'mean'
]]
.
apply
(
fun1
,
axis
=
1
)
...
@@ -564,7 +558,8 @@ class Growth(FactorBase):
...
@@ -564,7 +558,8 @@ class Growth(FactorBase):
return
factor_historical_growth
return
factor_historical_growth
# 分析师预期增长
# 分析师预期增长
def
fsalesg
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
fsalesg
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
未来预期营收增长
未来预期营收增长
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -583,7 +578,8 @@ class Growth(FactorBase):
...
@@ -583,7 +578,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
fearng
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
fearng
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
未来预期盈利增长
未来预期盈利增长
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -602,7 +598,8 @@ class Growth(FactorBase):
...
@@ -602,7 +598,8 @@ class Growth(FactorBase):
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
factor_historical_growth
=
pd
.
merge
(
factor_historical_growth
,
historical_growth
,
on
=
'symbol'
)
return
factor_historical_growth
return
factor_historical_growth
def
egibs_long
(
self
,
tp_historical_growth
,
factor_historical_growth
):
@
staticmethod
def
egibs_long
(
tp_historical_growth
,
factor_historical_growth
):
"""
"""
净利润增长率
净利润增长率
:param tp_historical_growth:
:param tp_historical_growth:
...
@@ -633,7 +630,6 @@ def calculate(trade_date, growth_sets, growth):
...
@@ -633,7 +630,6 @@ def calculate(trade_date, growth_sets, growth):
print
(
"
%
s has no data"
%
trade_date
)
print
(
"
%
s has no data"
%
trade_date
)
return
return
# psindu
factor_historical_growth
=
growth
.
historical_net_asset_grow_rate
(
growth_sets
)
factor_historical_growth
=
growth
.
historical_net_asset_grow_rate
(
growth_sets
)
factor_historical_growth
=
growth
.
historical_total_asset_grow_rate
(
growth_sets
,
factor_historical_growth
)
factor_historical_growth
=
growth
.
historical_total_asset_grow_rate
(
growth_sets
,
factor_historical_growth
)
factor_historical_growth
=
growth
.
historical_operating_revenue_grow_rate
(
growth_sets
,
factor_historical_growth
)
factor_historical_growth
=
growth
.
historical_operating_revenue_grow_rate
(
growth_sets
,
factor_historical_growth
)
...
...
factor/factor_per_share_indicators.py
View file @
40616b3c
...
@@ -10,11 +10,10 @@
...
@@ -10,11 +10,10 @@
"""
"""
import
sys
import
sys
sys
.
path
.
append
(
".."
)
import
json
import
json
from
pandas.io.json
import
json_normalize
from
pandas.io.json
import
json_normalize
sys
.
path
.
append
(
".."
)
from
factor.ttm_fundamental
import
*
from
factor.ttm_fundamental
import
*
from
factor.factor_base
import
FactorBase
from
factor.factor_base
import
FactorBase
from
vision.fm.signletion_engine
import
*
from
vision.fm.signletion_engine
import
*
...
@@ -62,7 +61,8 @@ class PerShareIndicators(FactorBase):
...
@@ -62,7 +61,8 @@ class PerShareIndicators(FactorBase):
)ENGINE=InnoDB DEFAULT CHARSET=utf8;"""
.
format
(
self
.
_name
)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;"""
.
format
(
self
.
_name
)
super
(
PerShareIndicators
,
self
)
.
_create_tables
(
create_sql
,
drop_sql
)
super
(
PerShareIndicators
,
self
)
.
_create_tables
(
create_sql
,
drop_sql
)
def
eps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
eps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
基本每股收益
基本每股收益
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -77,7 +77,8 @@ class PerShareIndicators(FactorBase):
...
@@ -77,7 +77,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
diluted_eps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
diluted_eps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
稀释每股收益
稀释每股收益
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -93,7 +94,8 @@ class PerShareIndicators(FactorBase):
...
@@ -93,7 +94,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
cash_equivalent_ps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
cash_equivalent_ps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股现金及现金等价物余额
每股现金及现金等价物余额
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -112,7 +114,8 @@ class PerShareIndicators(FactorBase):
...
@@ -112,7 +114,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
dividend_ps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
dividend_ps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股股利(税前)
每股股利(税前)
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -128,7 +131,8 @@ class PerShareIndicators(FactorBase):
...
@@ -128,7 +131,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
eps_ttm
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
eps_ttm
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股收益 TTM
每股收益 TTM
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -147,7 +151,8 @@ class PerShareIndicators(FactorBase):
...
@@ -147,7 +151,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
net_asset_ps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
net_asset_ps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股净资产
每股净资产
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -165,7 +170,8 @@ class PerShareIndicators(FactorBase):
...
@@ -165,7 +170,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
tor_ps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
tor_ps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股营业总收入
每股营业总收入
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -184,7 +190,8 @@ class PerShareIndicators(FactorBase):
...
@@ -184,7 +190,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
tor_ps_latest
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
tor_ps_latest
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股营业总收入
每股营业总收入
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -202,7 +209,8 @@ class PerShareIndicators(FactorBase):
...
@@ -202,7 +209,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
operating_revenue_ps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
operating_revenue_ps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股营业收入
每股营业收入
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -222,7 +230,8 @@ class PerShareIndicators(FactorBase):
...
@@ -222,7 +230,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
operating_revenue_ps_latest
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
operating_revenue_ps_latest
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股营业收入(最新)
每股营业收入(最新)
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -243,7 +252,8 @@ class PerShareIndicators(FactorBase):
...
@@ -243,7 +252,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
operating_profit_ps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
operating_profit_ps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股营业利润
每股营业利润
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -264,7 +274,8 @@ class PerShareIndicators(FactorBase):
...
@@ -264,7 +274,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
operating_profit_ps_latest
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
operating_profit_ps_latest
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股营业利润(最新)
每股营业利润(最新)
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -281,7 +292,8 @@ class PerShareIndicators(FactorBase):
...
@@ -281,7 +292,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
capital_surplus_fund_ps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
capital_surplus_fund_ps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股资本公积金
每股资本公积金
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -301,7 +313,8 @@ class PerShareIndicators(FactorBase):
...
@@ -301,7 +313,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
surplus_reserve_fund_ps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
surplus_reserve_fund_ps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股盈余公积金
每股盈余公积金
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -319,7 +332,8 @@ class PerShareIndicators(FactorBase):
...
@@ -319,7 +332,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
undivided_pro_fit_ps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
undivided_pro_fit_ps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股未分配利润
每股未分配利润
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -339,7 +353,8 @@ class PerShareIndicators(FactorBase):
...
@@ -339,7 +353,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
retained_earnings_ps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
retained_earnings_ps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股留存收益
每股留存收益
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -355,7 +370,8 @@ class PerShareIndicators(FactorBase):
...
@@ -355,7 +370,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
oper_cash_flow_ps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
oper_cash_flow_ps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股经营活动产生的现金流量净额
每股经营活动产生的现金流量净额
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -376,7 +392,8 @@ class PerShareIndicators(FactorBase):
...
@@ -376,7 +392,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
cash_flow_ps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
cash_flow_ps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股现金流量净额
每股现金流量净额
:param tp_share_indicators:
:param tp_share_indicators:
...
@@ -394,7 +411,8 @@ class PerShareIndicators(FactorBase):
...
@@ -394,7 +411,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
enterprise_fcfps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
enterprise_fcfps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股企业自由现金流量
每股企业自由现金流量
缺每股企业自由现金流量
缺每股企业自由现金流量
...
@@ -410,7 +428,8 @@ class PerShareIndicators(FactorBase):
...
@@ -410,7 +428,8 @@ class PerShareIndicators(FactorBase):
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
factor_share_indicators
=
pd
.
merge
(
factor_share_indicators
,
share_indicators
,
on
=
'symbol'
)
return
factor_share_indicators
return
factor_share_indicators
def
shareholder_fcfps
(
self
,
tp_share_indicators
,
factor_share_indicators
):
@
staticmethod
def
shareholder_fcfps
(
tp_share_indicators
,
factor_share_indicators
):
"""
"""
每股股东自由现金流量
每股股东自由现金流量
缺每股股东自由现金流量
缺每股股东自由现金流量
...
@@ -459,14 +478,6 @@ def calculate(trade_date, valuation_sets, per_share):
...
@@ -459,14 +478,6 @@ def calculate(trade_date, valuation_sets, per_share):
factor_share_indicators
=
per_share
.
oper_cash_flow_ps
(
factor_share_indicators
,
factor_share_indicators
)
# memorydrror
factor_share_indicators
=
per_share
.
oper_cash_flow_ps
(
factor_share_indicators
,
factor_share_indicators
)
# memorydrror
factor_share_indicators
=
per_share
.
cash_flow_ps
(
factor_share_indicators
,
factor_share_indicators
)
# memorydrror
factor_share_indicators
=
per_share
.
cash_flow_ps
(
factor_share_indicators
,
factor_share_indicators
)
# memorydrror
# factor_historical_value = factor_historical_value.drop(columns=['pb', 'pe', 'ps', 'pcf', 'market_cap',
# 'circulating_market_cap', 'isymbol',
# 'np_parent_company_owners',
# 'np_parent_company_owners_3',
# 'np_parent_company_owners_5',
# 'net_operate_cash_flow', 'net_profit',
# 'goods_sale_and_service_render_cash'])
# factor_share_indicators = factor_share_indicators[['symbol',
# factor_share_indicators = factor_share_indicators[['symbol',
# 'EPS',
# 'EPS',
# 'DilutedEPSTTM',
# 'DilutedEPSTTM',
...
@@ -514,15 +525,6 @@ def calculate(trade_date, valuation_sets, per_share):
...
@@ -514,15 +525,6 @@ def calculate(trade_date, valuation_sets, per_share):
per_share
.
_storage_data
(
factor_share_indicators
,
trade_date
)
per_share
.
_storage_data
(
factor_share_indicators
,
trade_date
)
def
do_update
(
self
,
start_date
,
end_date
,
count
):
# 读取本地交易日
trade_date_sets
=
self
.
_trade_date
.
trade_date_sets_ago
(
start_date
,
end_date
,
count
)
for
trade_date
in
trade_date_sets
:
print
(
'当前交易日:
%
s'
%
trade_date
)
self
.
calculate
(
trade_date
)
print
(
'----->'
)
# @app.task()
# @app.task()
def
factor_calculate
(
**
kwargs
):
def
factor_calculate
(
**
kwargs
):
print
(
"per_share_kwargs: {}"
.
format
(
kwargs
))
print
(
"per_share_kwargs: {}"
.
format
(
kwargs
))
...
@@ -530,6 +532,6 @@ def factor_calculate(**kwargs):
...
@@ -530,6 +532,6 @@ def factor_calculate(**kwargs):
session
=
kwargs
[
'session'
]
session
=
kwargs
[
'session'
]
per_share
=
PerShareIndicators
(
'factor_per_share'
)
# 注意, 这里的name要与client中新建table时的name一致, 不然回报错
per_share
=
PerShareIndicators
(
'factor_per_share'
)
# 注意, 这里的name要与client中新建table时的name一致, 不然回报错
content
=
cache_data
.
get_cache
(
session
,
date_index
)
content
=
cache_data
.
get_cache
(
session
,
date_index
)
total_
growth
_data
=
json_normalize
(
json
.
loads
(
str
(
content
,
encoding
=
'utf8'
)))
total_
pre_share
_data
=
json_normalize
(
json
.
loads
(
str
(
content
,
encoding
=
'utf8'
)))
print
(
"len_total_per_share_data {}"
.
format
(
len
(
total_
growth
_data
)))
print
(
"len_total_per_share_data {}"
.
format
(
len
(
total_
pre_share
_data
)))
calculate
(
date_index
,
total_
growth
_data
,
per_share
)
calculate
(
date_index
,
total_
pre_share
_data
,
per_share
)
factor/historical_value.py
View file @
40616b3c
...
@@ -60,7 +60,8 @@ class HistoricalValue(FactorBase):
...
@@ -60,7 +60,8 @@ class HistoricalValue(FactorBase):
)ENGINE=InnoDB DEFAULT CHARSET=utf8;"""
.
format
(
self
.
_name
)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;"""
.
format
(
self
.
_name
)
super
(
HistoricalValue
,
self
)
.
_create_tables
(
create_sql
,
drop_sql
)
super
(
HistoricalValue
,
self
)
.
_create_tables
(
create_sql
,
drop_sql
)
def
ps_indu
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
ps_indu
(
tp_historical_value
,
factor_historical_value
):
"""
"""
PEIndu, 市销率,以及同行业所有的公司的市销率
PEIndu, 市销率,以及同行业所有的公司的市销率
# (PS – PS 的行业均值)/PS 的行业标准差
# (PS – PS 的行业均值)/PS 的行业标准差
...
@@ -84,7 +85,8 @@ class HistoricalValue(FactorBase):
...
@@ -84,7 +85,8 @@ class HistoricalValue(FactorBase):
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
return
factor_historical_value
return
factor_historical_value
def
etop
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
etop
(
tp_historical_value
,
factor_historical_value
):
"""
"""
收益市值比
收益市值比
# 收益市值比= 净利润/总市值
# 收益市值比= 净利润/总市值
...
@@ -105,7 +107,8 @@ class HistoricalValue(FactorBase):
...
@@ -105,7 +107,8 @@ class HistoricalValue(FactorBase):
return
factor_historical_value
return
factor_historical_value
# 5年平均收益市值比 = 近5年净利润 / 近5年总市值
# 5年平均收益市值比 = 近5年净利润 / 近5年总市值
def
etp5
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
etp5
(
tp_historical_value
,
factor_historical_value
):
columns_lists
=
[
'symbol'
,
'net_profit_5'
,
'circulating_market_cap_5'
,
'market_cap_5'
]
columns_lists
=
[
'symbol'
,
'net_profit_5'
,
'circulating_market_cap_5'
,
'market_cap_5'
]
historical_value
=
tp_historical_value
.
loc
[:,
columns_lists
]
historical_value
=
tp_historical_value
.
loc
[:,
columns_lists
]
...
@@ -117,7 +120,8 @@ class HistoricalValue(FactorBase):
...
@@ -117,7 +120,8 @@ class HistoricalValue(FactorBase):
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
return
factor_historical_value
return
factor_historical_value
def
pe_indu
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
pe_indu
(
tp_historical_value
,
factor_historical_value
):
"""
"""
# (PE – PE 的行业均值)/PE 的行业标准差
# (PE – PE 的行业均值)/PE 的行业标准差
:param tp_historical_value:
:param tp_historical_value:
...
@@ -138,7 +142,8 @@ class HistoricalValue(FactorBase):
...
@@ -138,7 +142,8 @@ class HistoricalValue(FactorBase):
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
return
factor_historical_value
return
factor_historical_value
def
peg_3y
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
peg_3y
(
tp_historical_value
,
factor_historical_value
):
"""
"""
# 市盈率/归属于母公司所有者净利润 3 年复合增长率
# 市盈率/归属于母公司所有者净利润 3 年复合增长率
:param tp_historical_value:
:param tp_historical_value:
...
@@ -157,7 +162,8 @@ class HistoricalValue(FactorBase):
...
@@ -157,7 +162,8 @@ class HistoricalValue(FactorBase):
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
return
factor_historical_value
return
factor_historical_value
def
peg_5y
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
peg_5y
(
tp_historical_value
,
factor_historical_value
):
"""
"""
# 市盈率/归属于母公司所有者净利润 5 年复合增长率
# 市盈率/归属于母公司所有者净利润 5 年复合增长率
:param tp_historical_value:
:param tp_historical_value:
...
@@ -176,7 +182,8 @@ class HistoricalValue(FactorBase):
...
@@ -176,7 +182,8 @@ class HistoricalValue(FactorBase):
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
return
factor_historical_value
return
factor_historical_value
def
pb_indu
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
pb_indu
(
tp_historical_value
,
factor_historical_value
):
"""
"""
# (PB – PB 的行业均值)/PB 的行业标准差
# (PB – PB 的行业均值)/PB 的行业标准差
:param tp_historical_value:
:param tp_historical_value:
...
@@ -198,7 +205,8 @@ class HistoricalValue(FactorBase):
...
@@ -198,7 +205,8 @@ class HistoricalValue(FactorBase):
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
return
factor_historical_value
return
factor_historical_value
def
lcap
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
lcap
(
tp_historical_value
,
factor_historical_value
):
"""
"""
总市值的对数
总市值的对数
# 对数市值 即市值的对数
# 对数市值 即市值的对数
...
@@ -213,7 +221,8 @@ class HistoricalValue(FactorBase):
...
@@ -213,7 +221,8 @@ class HistoricalValue(FactorBase):
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
return
factor_historical_value
return
factor_historical_value
def
lflo
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
lflo
(
tp_historical_value
,
factor_historical_value
):
"""
"""
流通总市值的对数
流通总市值的对数
# 对数市值 即流通市值的对数
# 对数市值 即流通市值的对数
...
@@ -229,7 +238,8 @@ class HistoricalValue(FactorBase):
...
@@ -229,7 +238,8 @@ class HistoricalValue(FactorBase):
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
return
factor_historical_value
return
factor_historical_value
def
nlsize
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
nlsize
(
tp_historical_value
,
factor_historical_value
):
"""
"""
对数市值开立方
对数市值开立方
:param tp_historical_value:
:param tp_historical_value:
...
@@ -243,7 +253,8 @@ class HistoricalValue(FactorBase):
...
@@ -243,7 +253,8 @@ class HistoricalValue(FactorBase):
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
return
factor_historical_value
return
factor_historical_value
def
pcf_indu
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
pcf_indu
(
tp_historical_value
,
factor_historical_value
):
"""
"""
# (PCF – PCF 的行业均值)/PCF 的行业标准差
# (PCF – PCF 的行业均值)/PCF 的行业标准差
:param tp_historical_value:
:param tp_historical_value:
...
@@ -267,7 +278,8 @@ class HistoricalValue(FactorBase):
...
@@ -267,7 +278,8 @@ class HistoricalValue(FactorBase):
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
factor_historical_value
=
pd
.
merge
(
factor_historical_value
,
historical_value
,
on
=
"symbol"
)
return
factor_historical_value
return
factor_historical_value
def
cetop
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
cetop
(
tp_historical_value
,
factor_historical_value
):
"""
"""
# 经营活动产生的现金流量净额与市值比
# 经营活动产生的现金流量净额与市值比
:param tp_historical_value:
:param tp_historical_value:
...
@@ -287,7 +299,8 @@ class HistoricalValue(FactorBase):
...
@@ -287,7 +299,8 @@ class HistoricalValue(FactorBase):
return
factor_historical_value
return
factor_historical_value
# 现金流市值比 = 每股派现 * 分红前总股本/总市值
# 现金流市值比 = 每股派现 * 分红前总股本/总市值
def
ctop
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
ctop
(
tp_historical_value
,
factor_historical_value
):
columns_lists
=
[
'symbol'
,
'pcd'
,
'sbd'
,
'circulating_market_cap'
,
'market_cap'
]
columns_lists
=
[
'symbol'
,
'pcd'
,
'sbd'
,
'circulating_market_cap'
,
'market_cap'
]
historical_value
=
tp_historical_value
.
loc
[:,
columns_lists
]
historical_value
=
tp_historical_value
.
loc
[:,
columns_lists
]
...
@@ -300,7 +313,8 @@ class HistoricalValue(FactorBase):
...
@@ -300,7 +313,8 @@ class HistoricalValue(FactorBase):
return
factor_historical_value
return
factor_historical_value
# 5 年平均现金流市值比 = 近5年每股派现 * 分红前总股本/近5年总市值
# 5 年平均现金流市值比 = 近5年每股派现 * 分红前总股本/近5年总市值
def
ctop5
(
self
,
tp_historical_value
,
factor_historical_value
):
@
staticmethod
def
ctop5
(
tp_historical_value
,
factor_historical_value
):
columns_lists
=
[
'symbol'
,
'pcd'
,
'sbd'
,
'circulating_market_cap_5'
,
'market_cap_5'
]
columns_lists
=
[
'symbol'
,
'pcd'
,
'sbd'
,
'circulating_market_cap_5'
,
'market_cap_5'
]
historical_value
=
tp_historical_value
.
loc
[:,
columns_lists
]
historical_value
=
tp_historical_value
.
loc
[:,
columns_lists
]
...
@@ -318,14 +332,11 @@ class HistoricalValue(FactorBase):
...
@@ -318,14 +332,11 @@ class HistoricalValue(FactorBase):
def
calculate
(
trade_date
,
valuation_sets
,
historical_value
):
def
calculate
(
trade_date
,
valuation_sets
,
historical_value
):
"""
"""
:param historical_value:
:param valuation_sets:
:param trade_date:
:param trade_date:
:return:
:return:
"""
"""
# valuation_sets, ttm_factor_sets, cash_flow_sets, income_sets = self.get_basic_data(trade_date)
# valuation_sets = pd.merge(valuation_sets, income_sets, on='symbol')
# valuation_sets = pd.merge(valuation_sets, ttm_factor_sets, on='symbol')
# valuation_sets = pd.merge(valuation_sets, cash_flow_sets, on='symbol')
if
len
(
valuation_sets
)
<=
0
:
if
len
(
valuation_sets
)
<=
0
:
print
(
"
%
s has no data"
%
trade_date
)
print
(
"
%
s has no data"
%
trade_date
)
return
return
...
@@ -377,15 +388,6 @@ def calculate(trade_date, valuation_sets, historical_value):
...
@@ -377,15 +388,6 @@ def calculate(trade_date, valuation_sets, historical_value):
historical_value
.
_storage_data
(
factor_historical_value
,
trade_date
)
historical_value
.
_storage_data
(
factor_historical_value
,
trade_date
)
def
do_update
(
self
,
start_date
,
end_date
,
count
):
# 读取本地交易日
trade_date_sets
=
self
.
_trade_date
.
trade_date_sets_ago
(
start_date
,
end_date
,
count
)
for
trade_date
in
trade_date_sets
:
print
(
'因子计算日期:
%
s'
%
trade_date
)
self
.
calculate
(
trade_date
)
print
(
'----->'
)
@
app
.
task
()
@
app
.
task
()
def
factor_calculate
(
**
kwargs
):
def
factor_calculate
(
**
kwargs
):
print
(
"history_value_kwargs: {}"
.
format
(
kwargs
))
print
(
"history_value_kwargs: {}"
.
format
(
kwargs
))
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment