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
093c1659
Commit
093c1659
authored
Nov 19, 2017
by
Dr.李
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update schedule setting
parent
b9b8fdd2
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
201 additions
and
194 deletions
+201
-194
api.py
alphamind/api.py
+2
-0
sqlengine.py
alphamind/data/engines/sqlengine.py
+8
-6
combined_model_training.py
alphamind/examples/combined_model_training.py
+191
-188
No files found.
alphamind/api.py
View file @
093c1659
...
@@ -50,6 +50,8 @@ def map_freq(freq):
...
@@ -50,6 +50,8 @@ def map_freq(freq):
horizon
=
19
horizon
=
19
elif
freq
==
'1d'
:
elif
freq
==
'1d'
:
horizon
=
0
horizon
=
0
elif
freq
[
-
1
]
==
"b"
:
horizon
=
int
(
freq
[:
-
1
])
-
1
else
:
else
:
raise
ValueError
(
"Unrecognized freq: {0}"
.
format
(
freq
))
raise
ValueError
(
"Unrecognized freq: {0}"
.
format
(
freq
))
return
horizon
return
horizon
...
...
alphamind/data/engines/sqlengine.py
View file @
093c1659
...
@@ -184,18 +184,19 @@ class SqlEngine(object):
...
@@ -184,18 +184,19 @@ class SqlEngine(object):
ref_date
:
str
,
ref_date
:
str
,
codes
:
Iterable
[
int
],
codes
:
Iterable
[
int
],
expiry_date
:
str
=
None
,
expiry_date
:
str
=
None
,
horizon
:
int
=
0
)
->
pd
.
DataFrame
:
horizon
:
int
=
0
,
offset
:
int
=
0
)
->
pd
.
DataFrame
:
start_date
=
ref_date
start_date
=
ref_date
if
not
expiry_date
:
if
not
expiry_date
:
end_date
=
advanceDateByCalendar
(
'china.sse'
,
ref_date
,
str
(
horizon
+
DAILY_RETURN_OFFSET
)
+
'b'
)
.
strftime
(
'
%
Y
%
m
%
d'
)
end_date
=
advanceDateByCalendar
(
'china.sse'
,
ref_date
,
str
(
horizon
+
offset
+
DAILY_RETURN_OFFSET
)
+
'b'
)
.
strftime
(
'
%
Y
%
m
%
d'
)
else
:
else
:
end_date
=
expiry_date
end_date
=
expiry_date
stats
=
func
.
sum
(
self
.
ln_func
(
1.
+
DailyReturn
.
d1
))
.
over
(
stats
=
func
.
sum
(
self
.
ln_func
(
1.
+
DailyReturn
.
d1
))
.
over
(
partition_by
=
DailyReturn
.
code
,
partition_by
=
DailyReturn
.
code
,
order_by
=
DailyReturn
.
trade_date
,
order_by
=
DailyReturn
.
trade_date
,
rows
=
(
DAILY_RETURN_OFFSET
,
horizon
+
DAILY_RETURN_OFFSET
))
.
label
(
'dx'
)
rows
=
(
DAILY_RETURN_OFFSET
+
offset
,
horizon
+
DAILY_RETURN_OFFSET
+
offset
))
.
label
(
'dx'
)
query
=
select
([
DailyReturn
.
trade_date
,
DailyReturn
.
code
,
stats
])
.
where
(
query
=
select
([
DailyReturn
.
trade_date
,
DailyReturn
.
code
,
stats
])
.
where
(
and_
(
and_
(
...
@@ -213,13 +214,14 @@ class SqlEngine(object):
...
@@ -213,13 +214,14 @@ class SqlEngine(object):
start_date
:
str
=
None
,
start_date
:
str
=
None
,
end_date
:
str
=
None
,
end_date
:
str
=
None
,
dates
:
Iterable
[
str
]
=
None
,
dates
:
Iterable
[
str
]
=
None
,
horizon
:
int
=
0
)
->
pd
.
DataFrame
:
horizon
:
int
=
0
,
offset
:
int
=
0
)
->
pd
.
DataFrame
:
if
dates
:
if
dates
:
start_date
=
dates
[
0
]
start_date
=
dates
[
0
]
end_date
=
dates
[
-
1
]
end_date
=
dates
[
-
1
]
end_date
=
advanceDateByCalendar
(
'china.sse'
,
end_date
,
str
(
horizon
+
DAILY_RETURN_OFFSET
)
+
'b'
)
.
strftime
(
'
%
Y-
%
m-
%
d'
)
end_date
=
advanceDateByCalendar
(
'china.sse'
,
end_date
,
str
(
horizon
+
offset
+
DAILY_RETURN_OFFSET
)
+
'b'
)
.
strftime
(
'
%
Y-
%
m-
%
d'
)
cond
=
universe
.
query_range
(
start_date
,
end_date
)
cond
=
universe
.
query_range
(
start_date
,
end_date
)
big_table
=
join
(
DailyReturn
,
UniverseTable
,
big_table
=
join
(
DailyReturn
,
UniverseTable
,
...
@@ -230,7 +232,7 @@ class SqlEngine(object):
...
@@ -230,7 +232,7 @@ class SqlEngine(object):
stats
=
func
.
sum
(
self
.
ln_func
(
1.
+
DailyReturn
.
d1
))
.
over
(
stats
=
func
.
sum
(
self
.
ln_func
(
1.
+
DailyReturn
.
d1
))
.
over
(
partition_by
=
DailyReturn
.
code
,
partition_by
=
DailyReturn
.
code
,
order_by
=
DailyReturn
.
trade_date
,
order_by
=
DailyReturn
.
trade_date
,
rows
=
(
DAILY_RETURN_OFFSET
,
horizon
+
DAILY_RETURN_OFFSET
))
.
label
(
'dx'
)
rows
=
(
offset
+
DAILY_RETURN_OFFSET
,
horizon
+
offset
+
DAILY_RETURN_OFFSET
))
.
label
(
'dx'
)
query
=
select
([
DailyReturn
.
trade_date
,
DailyReturn
.
code
,
stats
])
\
query
=
select
([
DailyReturn
.
trade_date
,
DailyReturn
.
code
,
stats
])
\
.
select_from
(
big_table
)
.
select_from
(
big_table
)
...
...
alphamind/examples/combined_model_training.py
View file @
093c1659
...
@@ -25,18 +25,18 @@ end_date = '2017-11-15'
...
@@ -25,18 +25,18 @@ end_date = '2017-11-15'
benchmark_code
=
300
benchmark_code
=
300
universe_name
=
[
'zz500'
,
'hs300'
]
universe_name
=
[
'zz500'
,
'hs300'
]
universe
=
Universe
(
universe_name
,
universe_name
)
universe
=
Universe
(
universe_name
,
universe_name
)
frequency
=
'2
w
'
frequency
=
'2
b
'
batch
=
8
batch
=
8
method
=
'risk_neutral'
method
=
'risk_neutral'
use_rank
=
100
use_rank
=
100
industry_lower
=
1.
industry_lower
=
1.
industry_upper
=
1.
industry_upper
=
1.
neutralize_risk
=
[
'SIZE'
]
+
industry_styles
neutralize_risk
=
[
'SIZE'
]
+
industry_styles
constraint_risk
=
industry_styles
constraint_risk
=
[
'SIZE'
]
+
industry_styles
size_risk_lower
=
0
size_risk_lower
=
0
size_risk_upper
=
0
size_risk_upper
=
0
turn_over_target_base
=
0.
2
turn_over_target_base
=
0.
1
weight_gap
=
0.03
weight_gap
s
=
[
0.01
,
0.02
,
0.03
,
0.04
]
benchmark_total_lower
=
0.8
benchmark_total_lower
=
0.8
benchmark_total_upper
=
1.
benchmark_total_upper
=
1.
horizon
=
map_freq
(
frequency
)
horizon
=
map_freq
(
frequency
)
...
@@ -101,7 +101,7 @@ for ref_date in ref_dates:
...
@@ -101,7 +101,7 @@ for ref_date in ref_dates:
alpha_logger
.
info
(
'trade_date: {0} training finished'
.
format
(
ref_date
))
alpha_logger
.
info
(
'trade_date: {0} training finished'
.
format
(
ref_date
))
frequency
=
'
1w
'
frequency
=
'
2b
'
ref_dates
=
makeSchedule
(
start_date
,
end_date
,
frequency
,
'china.sse'
)
ref_dates
=
makeSchedule
(
start_date
,
end_date
,
frequency
,
'china.sse'
)
const_model_factor_data
=
engine
.
fetch_data_range
(
universe
,
const_model_factor_data
=
engine
.
fetch_data_range
(
universe
,
...
@@ -117,14 +117,17 @@ Predicting and re-balance phase
...
@@ -117,14 +117,17 @@ Predicting and re-balance phase
factor_groups
=
const_model_factor_data
.
groupby
(
'trade_date'
)
factor_groups
=
const_model_factor_data
.
groupby
(
'trade_date'
)
rets
=
[]
for
weight_gap
in
weight_gaps
:
turn_overs
=
[]
print
(
"start {0} weight gap simulation ..."
.
format
(
weight_gap
))
leverags
=
[]
previous_pos
=
pd
.
DataFrame
()
index_dates
=
[]
rets
=
[]
turn_overs
=
[]
leverags
=
[]
previous_pos
=
pd
.
DataFrame
()
for
i
,
value
in
enumerate
(
factor_groups
):
index_dates
=
[]
for
i
,
value
in
enumerate
(
factor_groups
):
date
=
value
[
0
]
date
=
value
[
0
]
data
=
value
[
1
]
data
=
value
[
1
]
ref_date
=
date
.
strftime
(
'
%
Y-
%
m-
%
d'
)
ref_date
=
date
.
strftime
(
'
%
Y-
%
m-
%
d'
)
...
@@ -245,7 +248,7 @@ for i, value in enumerate(factor_groups):
...
@@ -245,7 +248,7 @@ for i, value in enumerate(factor_groups):
turn_over
,
executed_pos
=
executor
.
execute
(
target_pos
=
target_pos
)
turn_over
,
executed_pos
=
executor
.
execute
(
target_pos
=
target_pos
)
executed_codes
=
executed_pos
.
code
.
tolist
()
executed_codes
=
executed_pos
.
code
.
tolist
()
dx_returns
=
engine
.
fetch_dx_return
(
date
,
executed_codes
,
horizon
=
horizon
)
dx_returns
=
engine
.
fetch_dx_return
(
date
,
executed_codes
,
horizon
=
horizon
,
offset
=
1
)
result
=
pd
.
merge
(
executed_pos
,
total_data
[[
'code'
,
'weight'
]],
on
=
[
'code'
],
how
=
'inner'
)
result
=
pd
.
merge
(
executed_pos
,
total_data
[[
'code'
,
'weight'
]],
on
=
[
'code'
],
how
=
'inner'
)
result
=
pd
.
merge
(
result
,
dx_returns
,
on
=
[
'code'
])
result
=
pd
.
merge
(
result
,
dx_returns
,
on
=
[
'code'
])
...
@@ -261,27 +264,27 @@ for i, value in enumerate(factor_groups):
...
@@ -261,27 +264,27 @@ for i, value in enumerate(factor_groups):
previous_pos
=
executed_pos
previous_pos
=
executed_pos
alpha_logger
.
info
(
'{0} is finished'
.
format
(
date
))
alpha_logger
.
info
(
'{0} is finished'
.
format
(
date
))
ret_df
=
pd
.
DataFrame
({
'returns'
:
rets
,
'turn_over'
:
turn_overs
,
'leverage'
:
leverage
},
index
=
index_dates
)
ret_df
=
pd
.
DataFrame
({
'returns'
:
rets
,
'turn_over'
:
turn_overs
,
'leverage'
:
leverage
},
index
=
index_dates
)
ret_df
.
loc
[
advanceDateByCalendar
(
'china.sse'
,
ref_dates
[
-
1
],
frequency
)]
=
0.
ret_df
.
loc
[
advanceDateByCalendar
(
'china.sse'
,
ref_dates
[
-
1
],
frequency
)]
=
0.
ret_df
=
ret_df
.
shift
(
1
)
ret_df
=
ret_df
.
shift
(
1
)
ret_df
.
iloc
[
0
]
=
0.
ret_df
.
iloc
[
0
]
=
0.
ret_df
[
'tc_cost'
]
=
ret_df
.
turn_over
*
0.002
ret_df
[
'tc_cost'
]
=
ret_df
.
turn_over
*
0.002
ret_df
[[
'returns'
,
'tc_cost'
]]
.
cumsum
()
.
plot
(
figsize
=
(
12
,
6
),
ret_df
[[
'returns'
,
'tc_cost'
]]
.
cumsum
()
.
plot
(
figsize
=
(
12
,
6
),
title
=
'Fixed frequency rebalanced: {0}'
.
format
(
frequency
),
title
=
'Fixed frequency rebalanced: {0}'
.
format
(
frequency
),
secondary_y
=
'tc_cost'
)
secondary_y
=
'tc_cost'
)
ret_df
[
'ret_after_tc'
]
=
ret_df
[
'returns'
]
-
ret_df
[
'tc_cost'
]
ret_df
[
'ret_after_tc'
]
=
ret_df
[
'returns'
]
-
ret_df
[
'tc_cost'
]
sharp_calc
=
MovingSharp
(
52
)
sharp_calc
=
MovingSharp
(
49
)
drawdown_calc
=
MovingMaxDrawdown
(
52
)
drawdown_calc
=
MovingMaxDrawdown
(
49
)
max_drawdown_calc
=
MovingMaxDrawdown
(
len
(
ret_df
))
max_drawdown_calc
=
MovingMaxDrawdown
(
len
(
ret_df
))
res_df
=
pd
.
DataFrame
(
columns
=
[
'daily_return'
,
'cum_ret'
,
'sharp'
,
'drawdown'
,
'max_drawn'
])
res_df
=
pd
.
DataFrame
(
columns
=
[
'daily_return'
,
'cum_ret'
,
'sharp'
,
'drawdown'
,
'max_drawn'
])
total_returns
=
0.
total_returns
=
0.
for
i
,
ret
in
enumerate
(
ret_df
[
'ret_after_tc'
]):
for
i
,
ret
in
enumerate
(
ret_df
[
'ret_after_tc'
]):
date
=
ret_df
.
index
[
i
]
date
=
ret_df
.
index
[
i
]
total_returns
+=
ret
total_returns
+=
ret
sharp_calc
.
push
({
'ret'
:
ret
,
'riskFree'
:
0.
})
sharp_calc
.
push
({
'ret'
:
ret
,
'riskFree'
:
0.
})
...
@@ -296,8 +299,8 @@ for i, ret in enumerate(ret_df['ret_after_tc']):
...
@@ -296,8 +299,8 @@ for i, ret in enumerate(ret_df['ret_after_tc']):
if
i
<
10
:
if
i
<
10
:
res_df
.
loc
[
date
,
'sharp'
]
=
0.
res_df
.
loc
[
date
,
'sharp'
]
=
0.
else
:
else
:
res_df
.
loc
[
date
,
'sharp'
]
=
sharp_calc
.
result
()
*
np
.
sqrt
(
52
)
res_df
.
loc
[
date
,
'sharp'
]
=
sharp_calc
.
result
()
*
np
.
sqrt
(
49
)
res_df
.
to_csv
(
'hs300_{0}.csv'
.
format
(
int
(
weight_gap
*
100
)))
res_df
.
to_csv
(
'hs300_{0}.csv'
.
format
(
int
(
weight_gap
*
100
)))
#plt.show()
#
plt.show()
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