Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Sign in
Toggle navigation
R
robo-dividend
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
wenwen.tang
robo-dividend
Commits
15e7566f
Commit
15e7566f
authored
Jan 22, 2024
by
wenwen.tang
😕
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
# 数据替换和截取以后用105 和106,(都从2022.1.3开始)然后2022年以前的部分:105前边接76的数据 106前边接77的数据
parent
e34f0a89
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
113 additions
and
19 deletions
+113
-19
EstimateMarketTrendV20.py
ai/EstimateMarketTrendV20.py
+58
-14
robo_datas.py
ai/dao/robo_datas.py
+6
-4
data_access.py
ai/data_access.py
+9
-1
predict.txt
ai/predict.txt
+40
-0
No files found.
ai/EstimateMarketTrendV20.py
View file @
15e7566f
import
json
from
typing
import
List
from
py_jftech
import
autowired
from
py_jftech
import
autowired
,
parse_date
,
prev_workday
,
format_date
from
ai.dao.robo_datas
import
get_base_info
from
ai.dao.robo_datas
import
get_base_info
,
get_index_list
,
get_fund_list
from
ai.data_access
import
DataAccess
from
ai.model_trainer
import
ModelTrainer
from
ai.noticer
import
upload_predict
from
ai.training_data_builder
import
TrainingDataBuilder
from
api
import
DataSync
# 截止日期
# max_date = None
max_date
=
'2024-01-05'
# max_date = '2023-10-06'
# max_date = '2023-10-13'
# max_date = '2023-10-20'
# max_date = '2023-10-27'
# max_date = '2023-11-03'
# max_date = '2023-11-10'
# max_date = '2023-11-17'
# max_date = '2023-11-24'
# max_date = '2023-12-01'
# max_date = '2023-12-08'
max_date
=
'2023-12-15'
# 待预测指数
PREDICT_LIST
=
[
67
,
121
,
122
,
123
]
#
PREDICT_LIST = [67, 121, 122, 123, 155, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 168, 169, 170, 171, 174, 175]
#
PREDICT_LIST = [67, 121, 122, 123]
PREDICT_LIST
=
[
67
,
121
,
122
,
123
,
155
,
157
,
158
,
159
,
160
,
161
,
162
,
163
,
164
,
165
,
166
,
168
,
169
,
170
,
171
,
174
,
175
]
eco
=
[
65
,
66
,
74
,
134
]
index
=
[
67
,
68
,
69
,
70
,
71
,
72
,
73
,
75
,
116
,
117
,
138
,
139
,
142
,
143
,
140
,
141
,
144
,
145
,
146
]
index
=
[
67
,
68
,
69
,
70
,
71
,
72
,
73
,
75
,
76
,
77
,
105
,
106
,
116
,
117
,
138
,
139
,
142
,
143
,
140
,
141
,
144
,
145
,
146
]
fund
=
[
121
,
122
,
123
,
155
,
157
,
158
,
159
,
160
,
161
,
162
,
163
,
164
,
165
,
166
,
168
,
169
,
170
,
171
,
174
,
175
]
...
...
@@ -36,13 +47,43 @@ def predictionFromMoel(the_model, scaledX_forecast, predict_item, indexDict: dic
content
=
f
"""
\n
On day {forecastDay.strftime("
%
m/
%
d/
%
Y")}, the model predicts {predict_item} to be {predictionStr} in {str(numForecastDays)} business days.
\n
"""
print
(
content
)
# 上传预测结果
key
=
[
k
for
k
,
v
in
indexDict
.
items
()
if
v
==
predict_item
]
index_info
=
get_base_info
(
key
)[
0
]
upload_predict
(
index_info
[
'ticker'
],
forecastDay
,
predictionStr
)
#
key = [k for k, v in indexDict.items() if v == predict_item]
#
index_info = get_base_info(key)[0]
#
upload_predict(index_info['ticker'], forecastDay, predictionStr)
# send(content)
return
prediction
def
judgement
(
id
,
type
,
predict
):
from
datetime
import
datetime
predict_term
=
21
start
=
parse_date
(
max_date
)
if
max_date
else
prev_workday
(
datetime
.
today
())
navs
=
[]
if
type
==
'INDEX'
:
navs
=
get_index_list
(
index_ids
=
id
,
min_date
=
start
,
limit
=
predict_term
)
navs
=
[
nav
[
'rid_close'
]
for
nav
in
navs
]
elif
type
==
'FUND'
:
navs
=
get_fund_list
(
fund_ids
=
id
,
min_date
=
start
,
limit
=
predict_term
)
navs
=
[
nav
[
'rfn_nav_cal'
]
for
nav
in
navs
]
if
len
(
navs
)
==
predict_term
:
upper
=
True
if
navs
[
-
1
]
>=
navs
[
0
]
else
False
result
=
{}
for
k
,
v
,
in
predict
.
items
():
pred
=
True
if
v
[
0
]
>
0
else
False
if
upper
==
pred
:
result
[
k
]
=
True
else
:
result
[
k
]
=
False
j
=
{
'id'
:
id
,
'date'
:
format_date
(
start
),
'result'
:
result
}
with
open
(
'predict.txt'
,
'a+'
)
as
file
:
file
.
write
(
json
.
dumps
(
j
))
file
.
write
(
'
\n
'
)
########################################
if
__name__
==
'__main__'
:
sync
()
...
...
@@ -55,6 +96,7 @@ if __name__ == '__main__':
theThreshold
=
0.0
ids
=
set
(
PREDICT_LIST
)
|
set
(
eco
)
|
set
(
index
)
|
set
(
fund
)
infos
=
get_base_info
(
ids
)
infos_type
=
{
info
[
'id'
]:
info
[
'type'
]
for
info
in
infos
}
indexDict
=
{
info
[
'id'
]:
info
[
'ticker'
]
.
replace
(
' Index'
,
''
)
.
replace
(
' Equity'
,
''
)
.
replace
(
' '
,
'_'
)
for
info
in
infos
}
###################
...
...
@@ -85,9 +127,11 @@ if __name__ == '__main__':
gbt_model
=
trainer
.
train_GBT
(
X_train
,
y_train
,
X_test
,
y_test
)
svc_model
=
trainer
.
train_SVC
(
X_train
,
y_train
,
X_test
,
y_test
)
ensemble_model
=
trainer
.
ensemble_model
(
rf_model
,
gbt_model
,
svc_model
,
X_train
,
y_train
,
X_test
,
y_test
)
print
(
f
'forest predict{rf_model.predict(scaledX_forecast)}'
.
center
(
60
,
'+'
))
print
(
f
'gbt predict{gbt_model.predict(scaledX_forecast)}'
.
center
(
60
,
'+'
))
print
(
f
'svc predict{svc_model.predict(scaledX_forecast)}'
.
center
(
60
,
'+'
))
print
(
f
'ensemble predict{ensemble_model.predict(scaledX_forecast)}'
.
center
(
60
,
'+'
))
model_predict
=
{
'forest'
:
rf_model
.
predict
(
scaledX_forecast
),
'gbt'
:
gbt_model
.
predict
(
scaledX_forecast
),
'svc'
:
svc_model
.
predict
(
scaledX_forecast
),
'ensemble'
:
ensemble_model
.
predict
(
scaledX_forecast
)}
print
(
f
'预测结果:{model_predict}'
.
center
(
60
,
'+'
))
judgement
(
pid
,
infos_type
[
pid
],
model_predict
)
if
toForecast
:
predictionFromMoel
(
ensemble_model
,
scaledX_forecast
,
indexDict
[
pid
],
indexDict
)
ai/dao/robo_datas.py
View file @
15e7566f
...
...
@@ -2,7 +2,8 @@ from py_jftech import read, to_tuple, where
@
read
def
get_index_list
(
index_ids
=
None
,
min_date
=
None
,
max_date
=
None
):
def
get_index_list
(
index_ids
=
None
,
min_date
=
None
,
max_date
=
None
,
limit
=
None
):
limit_sql
=
f
'limit {limit}'
if
limit
else
''
sqls
=
[]
if
min_date
:
sqls
.
append
(
f
"rid_date >= '{min_date}'"
)
...
...
@@ -10,7 +11,7 @@ def get_index_list(index_ids=None, min_date=None, max_date=None):
sqls
.
append
(
f
"rid_date <= '{max_date}'"
)
return
f
'''
select * from robo_index_datas
{where(*sqls, rid_index_id=to_tuple(index_ids))} order by rid_index_id, rid_date
{where(*sqls, rid_index_id=to_tuple(index_ids))} order by rid_index_id, rid_date
{limit_sql}
'''
...
...
@@ -27,7 +28,8 @@ def get_eco_list(eco_ids=None, min_date=None, max_date=None):
'''
@
read
def
get_fund_list
(
fund_ids
=
None
,
min_date
=
None
,
max_date
=
None
):
def
get_fund_list
(
fund_ids
=
None
,
min_date
=
None
,
max_date
=
None
,
limit
=
None
):
limit_sql
=
f
'limit {limit}'
if
limit
else
''
sqls
=
[]
if
min_date
:
sqls
.
append
(
f
"rfn_date >= '{min_date}'"
)
...
...
@@ -35,7 +37,7 @@ def get_fund_list(fund_ids=None, min_date=None, max_date=None):
sqls
.
append
(
f
"rfn_date <= '{max_date}'"
)
return
f
'''
select * from robo_fund_navs
{where(*sqls, rfn_fund_id=to_tuple(fund_ids))} order by rfn_fund_id, rfn_date
{where(*sqls, rfn_fund_id=to_tuple(fund_ids))} order by rfn_fund_id, rfn_date
{limit_sql}
'''
@
read
...
...
ai/data_access.py
View file @
15e7566f
...
...
@@ -21,6 +21,14 @@ class DataAccess(ABC):
indexData
=
indexData
[
[
"rid_index_id"
,
"rid_date"
,
"rid_high"
,
"rid_open"
,
"rid_low"
,
"rid_close"
,
"rid_pe"
,
"rid_pb"
,
"rid_volume"
,
"rid_frdpe"
,
"rid_frdpes"
,
"rid_pc"
]]
# 数据替换和截取以后用105 和106,(都从2022.1.3开始)然后2022年以前的部分:105前边接76的数据 106前边接77的数据
condition1
=
((
indexData
[
'rid_index_id'
]
==
76
)
&
(
indexData
[
'rid_date'
]
>
'2022-01-03'
))
condition2
=
((
indexData
[
'rid_index_id'
]
==
77
)
&
(
indexData
[
'rid_date'
]
>
'2022-01-03'
))
condition3
=
((
indexData
[
'rid_index_id'
]
==
105
)
&
(
indexData
[
'rid_date'
]
<=
'2022-01-03'
))
condition4
=
((
indexData
[
'rid_index_id'
]
==
106
)
&
(
indexData
[
'rid_date'
]
<=
'2022-01-03'
))
indexData
.
drop
(
indexData
[
condition1
|
condition2
|
condition3
|
condition4
]
.
index
,
inplace
=
True
)
indexData
.
loc
[
indexData
[
'rid_index_id'
]
==
76
,
'rid_index_id'
]
=
105
indexData
.
loc
[
indexData
[
'rid_index_id'
]
==
77
,
'rid_index_id'
]
=
106
indexData
.
rename
(
columns
=
{
"rid_date"
:
'date'
},
inplace
=
True
)
# please use 'date'
indexData
[
"rid_index_id"
]
=
indexData
[
"rid_index_id"
]
.
map
(
self
.
_indexDict
)
indexData
.
fillna
(
method
=
'ffill'
,
inplace
=
True
)
...
...
@@ -58,7 +66,7 @@ class DataAccess(ABC):
return
vixData
def
get_other_index
(
self
,
indexData
):
other_index
=
[
"USGG10YR"
,
"USGG2YR"
,
"CCMP"
,
"
US0001M"
,
"US00
12M"
,
"COI_TOTL"
,
"LEI_TOTL"
,
"MID"
,
other_index
=
[
"USGG10YR"
,
"USGG2YR"
,
"CCMP"
,
"
TSFR1M"
,
"TSFR
12M"
,
"COI_TOTL"
,
"LEI_TOTL"
,
"MID"
,
"OE4EKLAC"
,
"OEA5KLAC"
,
"OECNKLAC"
,
"OEJPKLAC"
,
"OEOTGTAC"
,
"OEUSKLAC"
,
"USRINDEX"
,
"SPX"
]
cols
=
[
'date'
,
'rid_close'
,
'rid_pe'
,
'rid_pb'
,
'rid_volume'
,
'rid_frdpe'
,
'rid_frdpes'
,
'rid_pc'
]
indexOtherData
=
pd
.
DataFrame
()
...
...
ai/predict.txt
0 → 100644
View file @
15e7566f
{"id": 67, "date": "2023-10-06", "result": {"forest": false, "gbt": true, "svc": true, "ensemble": true}}
{"id": 121, "date": "2023-10-06", "result": {"forest": true, "gbt": true, "svc": false, "ensemble": true}}
{"id": 122, "date": "2023-10-06", "result": {"forest": true, "gbt": true, "svc": false, "ensemble": true}}
{"id": 123, "date": "2023-10-06", "result": {"forest": false, "gbt": false, "svc": true, "ensemble": false}}
{"id": 67, "date": "2023-10-13", "result": {"forest": false, "gbt": true, "svc": true, "ensemble": true}}
{"id": 121, "date": "2023-10-13", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 122, "date": "2023-10-13", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 123, "date": "2023-10-13", "result": {"forest": false, "gbt": false, "svc": true, "ensemble": false}}
{"id": 67, "date": "2023-10-20", "result": {"forest": false, "gbt": false, "svc": true, "ensemble": false}}
{"id": 121, "date": "2023-10-20", "result": {"forest": false, "gbt": true, "svc": false, "ensemble": true}}
{"id": 122, "date": "2023-10-20", "result": {"forest": true, "gbt": true, "svc": false, "ensemble": true}}
{"id": 123, "date": "2023-10-20", "result": {"forest": false, "gbt": false, "svc": true, "ensemble": false}}
{"id": 67, "date": "2023-10-27", "result": {"forest": false, "gbt": true, "svc": true, "ensemble": true}}
{"id": 121, "date": "2023-10-27", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 122, "date": "2023-10-27", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 123, "date": "2023-10-27", "result": {"forest": false, "gbt": false, "svc": true, "ensemble": false}}
{"id": 67, "date": "2023-11-03", "result": {"forest": true, "gbt": true, "svc": true, "ensemble": true}}
{"id": 121, "date": "2023-11-03", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 122, "date": "2023-11-03", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 123, "date": "2023-11-03", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 67, "date": "2023-11-17", "result": {"forest": false, "gbt": false, "svc": true, "ensemble": false}}
{"id": 121, "date": "2023-11-17", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 122, "date": "2023-11-17", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 123, "date": "2023-11-17", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 67, "date": "2023-11-24", "result": {"forest": false, "gbt": false, "svc": true, "ensemble": false}}
{"id": 121, "date": "2023-11-24", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 122, "date": "2023-11-24", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 123, "date": "2023-11-24", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 67, "date": "2023-12-01", "result": {"forest": false, "gbt": false, "svc": true, "ensemble": false}}
{"id": 121, "date": "2023-12-01", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 122, "date": "2023-12-01", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 123, "date": "2023-12-01", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 67, "date": "2023-12-08", "result": {"forest": false, "gbt": false, "svc": true, "ensemble": false}}
{"id": 121, "date": "2023-12-08", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 122, "date": "2023-12-08", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 123, "date": "2023-12-08", "result": {"forest": false, "gbt": false, "svc": false, "ensemble": false}}
{"id": 67, "date": "2023-12-15", "result": {"forest": false, "gbt": false, "svc": true, "ensemble": false}}
{"id": 121, "date": "2023-12-15", "result": {"forest": true, "gbt": true, "svc": true, "ensemble": true}}
{"id": 122, "date": "2023-12-15", "result": {"forest": false, "gbt": false, "svc": true, "ensemble": false}}
{"id": 123, "date": "2023-12-15", "result": {"forest": true, "gbt": true, "svc": true, "ensemble": true}}
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