Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
A
alpha-mind
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
Dr.李
alpha-mind
Commits
8ae8ce45
Commit
8ae8ce45
authored
Jul 11, 2017
by
Dr.李
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
simplify implementation
parent
248e2c95
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
8 additions
and
37 deletions
+8
-37
factoranalysis.py
alphamind/analysis/factoranalysis.py
+8
-37
No files found.
alphamind/analysis/factoranalysis.py
View file @
8ae8ce45
...
...
@@ -71,7 +71,6 @@ class FDataPack(object):
def
__init__
(
self
,
raw_factors
:
np
.
ndarray
,
d1returns
=
None
,
factor_names
:
List
[
str
]
=
None
,
codes
:
List
=
None
,
groups
:
Optional
[
np
.
ndarray
]
=
None
,
...
...
@@ -81,11 +80,6 @@ class FDataPack(object):
self
.
raw_factors
=
raw_factors
if
d1returns
is
not
None
:
self
.
d1returns
=
d1returns
.
flatten
()
else
:
self
.
d1returns
=
None
if
factor_names
:
self
.
factor_names
=
factor_names
else
:
...
...
@@ -100,21 +94,19 @@ class FDataPack(object):
self
.
risk_names
=
risk_names
def
benchmark_risk_exp
(
self
)
->
np
.
ndarray
:
return
self
.
risk_exp
@
self
.
benchmark
def
settle
(
self
,
weights
:
np
.
ndarray
)
->
pd
.
DataFrame
:
return
self
.
benchmark
@
self
.
risk_exp
if
self
.
d1returns
is
None
:
raise
ValueError
(
"No return is offered"
)
def
settle
(
self
,
weights
:
np
.
ndarray
,
dx_return
:
np
.
ndarray
)
->
pd
.
DataFrame
:
weights
=
weights
.
flatten
()
dx_return
=
dx_return
.
flatten
()
if
self
.
benchmark
is
not
None
:
net_pos
=
weights
-
self
.
benchmark
else
:
net_pos
=
weights
ret_arr
=
net_pos
*
self
.
d1returns
ret_arr
=
net_pos
*
dx_return
if
self
.
groups
is
not
None
:
ret_agg
=
pd
.
Series
(
ret_arr
)
.
groupby
(
self
.
groups
)
.
sum
()
...
...
@@ -126,7 +118,7 @@ class FDataPack(object):
ret_agg
.
name
=
'er'
pos_table
=
pd
.
DataFrame
(
net_pos
,
columns
=
[
'weight'
])
pos_table
[
'ret'
]
=
self
.
d1returns
pos_table
[
'ret'
]
=
dx_return
if
self
.
groups
is
not
None
:
ic_table
=
pos_table
.
groupby
(
self
.
groups
)
.
corr
()[
'ret'
]
.
loc
[(
slice
(
None
),
'weight'
)]
...
...
@@ -150,26 +142,6 @@ class FDataPack(object):
self
.
risk_exp
,
pos_process
)
def
to_df
(
self
)
->
pd
.
DataFrame
:
cols
=
self
.
factor_names
to_concat
=
[
self
.
raw_factors
.
copy
()]
if
self
.
groups
is
not
None
:
cols
.
append
(
'groups'
)
to_concat
.
append
(
self
.
groups
.
reshape
(
-
1
,
1
))
if
self
.
benchmark
is
not
None
:
cols
.
append
(
'benchmark'
)
to_concat
.
append
(
self
.
benchmark
.
reshape
(
-
1
,
1
))
if
self
.
risk_exp
is
not
None
:
cols
.
extend
(
self
.
risk_names
)
to_concat
.
append
(
self
.
risk_exp
)
return
pd
.
DataFrame
(
np
.
concatenate
(
to_concat
,
axis
=
1
),
columns
=
cols
,
index
=
self
.
codes
)
def
factor_analysis
(
factors
:
pd
.
DataFrame
,
factor_weights
:
np
.
ndarray
,
...
...
@@ -186,7 +158,6 @@ def factor_analysis(factors: pd.DataFrame,
risk_exp
=
risk_exp
[:,
risk_exp
.
sum
(
axis
=
0
)
!=
0
]
data_pack
=
FDataPack
(
raw_factors
=
factors
.
values
,
d1returns
=
d1returns
,
groups
=
industry
,
benchmark
=
benchmark
,
risk_exp
=
risk_exp
)
...
...
@@ -206,8 +177,8 @@ def factor_analysis(factors: pd.DataFrame,
risk_lbound
=
kwargs
[
'risk_bound'
][
0
]
risk_ubound
=
kwargs
[
'risk_bound'
][
1
]
else
:
risk_lbound
=
benchmark
@
risk_exp
risk_ubound
=
benchmark
@
risk_exp
risk_lbound
=
data_pack
.
benchmark_risk_exp
()
risk_ubound
=
data_pack
.
benchmark_risk_exp
()
weights
=
build_portfolio
(
er
,
builder
=
'linear'
,
...
...
@@ -224,7 +195,7 @@ def factor_analysis(factors: pd.DataFrame,
**
kwargs
)
/
kwargs
[
'use_rank'
]
if
detail_analysis
:
analysis
=
data_pack
.
settle
(
weights
)
analysis
=
data_pack
.
settle
(
weights
,
d1returns
)
else
:
analysis
=
None
return
pd
.
DataFrame
({
'weight'
:
weights
,
...
...
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