├── .gitignore
└── .gitignore
├── .idea
├── StockAI.iml
├── misc.xml
├── modules.xml
├── vcs.xml
└── workspace.xml
├── Datas
├── CsvData
│ └── __init__.py
└── __init__.py
├── README.md
├── StockAI.py
├── __init__.py
├── code
├── QuartzTimer
│ ├── __init__.py
│ ├── quartzTimer.py
│ ├── quartzTimer1.py
│ └── quartzTimer2.py
├── SaveDateToMysql.py
├── Util
│ ├── __init__.py
│ └── myUtilFile.py
├── __init__.py
├── getDatasFromTushare.py
└── preDealStocksDatas.py
├── doc
├── StockAI项目整体思路流程.txt
├── __init__.py
└── mysql
├── modelSVM
├── __init__.py
└── trainBySVM.py
├── produceModel
├── SVM.py
└── __init__.py
└── requests
/.gitignore/.gitignore:
--------------------------------------------------------------------------------
1 | 初始提交
2 |
--------------------------------------------------------------------------------
/.idea/StockAI.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/workspace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 | true
36 | DEFINITION_ORDER
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 | 1537619215492
117 |
118 |
119 | 1537619215492
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
--------------------------------------------------------------------------------
/Datas/CsvData/__init__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 | # -*- coding:utf-8 -*-
3 | '''
4 | created by leifengchuan
5 | '''
--------------------------------------------------------------------------------
/Datas/__init__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 | # -*- coding:utf-8 -*-
3 | '''
4 | created by leifengchuan
5 | '''
6 |
7 |
8 |
9 |
10 | """
11 | Data目录用来存放文档数据的目录
12 |
13 | """
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # StockAI
2 | 一个利用历史数据分析,推荐股票的模型
3 |
--------------------------------------------------------------------------------
/StockAI.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/22 22:35
4 | # @Author : leifengchuan
5 | # @File : StockAI.py
6 | """
7 | 对外提供接口服务的文件
8 |
9 |
10 | """
11 |
12 | from flask import Flask
13 |
14 | app = Flask(__name__)
15 |
16 |
17 | @app.route('/')
18 | def hello_world():
19 | return 'Hello World!'
20 |
21 |
22 | if __name__ == '__main__':
23 | app.run()
24 |
--------------------------------------------------------------------------------
/__init__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/24 16:42
4 | # @Author : leifengchuan
5 | # @File : __init__.py
6 | import pymysql
7 | pymysql.install_as_MySQLdb()
8 |
--------------------------------------------------------------------------------
/code/QuartzTimer/__init__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/24 16:58
4 | # @Author : leifengchuan
5 | # @File : __init__.py
6 |
--------------------------------------------------------------------------------
/code/QuartzTimer/quartzTimer.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 | # -*- coding:utf-8 -*-
3 | '''
4 | created by leifengchuan
5 | '''
6 | from threading import Timer
7 |
8 |
9 |
10 | def printHello():
11 | """
12 | 定时器模式一:
13 | 直接使用thrading中的timer
14 | :return:
15 | """
16 | print("Hello World")
17 | "Hello World"
18 | t = Timer(10*2, printHello)
19 | t.start()
20 |
21 |
22 | if __name__ == "__main__":
23 | printHello()
24 |
25 |
--------------------------------------------------------------------------------
/code/QuartzTimer/quartzTimer1.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 | # -*- coding:utf-8 -*-
3 | '''
4 | created by leifengchuan
5 | '''
6 | import time, os, sched
7 | """
8 | 利用sched实现周期调用
9 | """
10 | # 第一个参数确定任务的时间,返回从某个特定的时间到现在经历的秒数
11 | # 第二个参数以某种人为的方式衡量时间
12 | schedule = sched.scheduler(time.time, time.sleep)
13 |
14 |
15 | def perform_command(cmd, inc):
16 | # 安排inc秒后再次运行自己,即周期运行
17 | schedule.enter(inc, 0, perform_command, (cmd, inc))
18 | os.system(cmd)
19 |
20 |
21 | def timming_exe(cmd, inc=10):
22 | # enter用来安排某事件的发生时间,从现在起第n秒开始启动
23 | schedule.enter(inc, 0, perform_command, (cmd, inc))
24 | # 持续运行,直到计划时间队列变成空为止
25 | schedule.run()
26 |
27 |
28 | print("show time after 10 seconds:")
29 | timming_exe("echo %time%", 10)
--------------------------------------------------------------------------------
/code/QuartzTimer/quartzTimer2.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 | # -*- coding:utf-8 -*-
3 | '''
4 | created by leifengchuan
5 | '''
6 | """
7 | pip install APScheduler
8 | 第三种方法实现定时器
9 | https://blog.csdn.net/blueheart20/article/details/70219490?locationNum=1&fps=1
10 | https://segmentfault.com/a/1190000011084828
11 | https://segmentfault.com
12 | https://www.cnblogs.com/hushaojun/p/5189109.html
13 | 【最好的模式】
14 | """
15 | from apscheduler.schedulers.background import BackgroundScheduler
16 | from apscheduler.schedulers.blocking import BlockingScheduler
17 | import datetime
18 |
19 |
20 |
21 |
22 | def job_function():
23 | """
24 | 定义一个定时器的方法
25 | 用来执行具体的细节功能
26 | :return:
27 | """
28 | print("Hello World " + str(datetime.datetime.now()))
29 | "Hello World" + " " + str(datetime.datetime.now())
30 |
31 |
32 |
33 |
34 |
35 | if __name__ == '__main__':
36 | """
37 | 代码执行测试
38 | """
39 | print('start to do it')
40 | sched = BlockingScheduler()
41 | sched.add_job(job_function, 'cron', day_of_week='mon-fri', hour='0-23', minute="*", second="*/1")
42 | sched.start()
--------------------------------------------------------------------------------
/code/SaveDateToMysql.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/22 22:28
4 | # @Author : leifengchuan
5 | # @File : getDatasFromTushare
6 |
7 | """
8 | 从tushare获取数据,然后保存再自己本地mysql数据库中
9 | """
10 |
11 | #!/usr/bin/python3
12 | # -*- coding:utf-8 -*-
13 | '''
14 | created by leifengchuan
15 | '''
16 | # coding=UTF-8
17 | import pymysql
18 | pymysql.install_as_MySQLdb()#备注这个是必须的
19 | import tushare as ts
20 | from sqlalchemy import create_engine
21 |
22 | engine = create_engine('mysql://root:root@localhost/stockAI?charset=utf8')
23 |
24 |
25 | def SaveDate():
26 | """
27 | 定义一个方法从tushare的bar接口获取历史数据,然后保存在mysql中
28 | :return:
29 | """
30 | cons = ts.get_apis()
31 | String = "600004, 600006, 600017, 600022, 600026, 600037, 600039, 600053, 600056, 600058, 600059, 600060, 600062, 600064, 600073, 600079, 600086, 600094, 600098, 600108, 600120, 600122, 600125, 600126, 600138, 600141, 600143, 600151, 600155, 600158, 600160, 600161, 600166, 600169, 600171, 600176, 600179, 600183, 600184, 600187, 600195, 600201, 600216, 600240, 600256, 600259, 600260, 600266, 600267, 600270, 600277, 600280, 600282, 600284, 600289, 600291, 600292, 600298, 600300, 600307, 600312, 600315, 600316, 600317, 600325, 600329, 600335, 600338, 600346, 600348, 600366, 600380, 600388, 600392, 600393, 600395, 600409, 600410, 600416, 600418, 600422, 600426, 600428, 600435, 600438, 600458, 600460, 600466, 600478, 600481, 600499, 600500, 600503, 600511, 600516, 600517, 600521, 600525, 600536, 600545, 600557, 600563, 600565, 600566, 600572, 600575, 600578, 600580, 600582, 600584, 600587, 600594, 600597, 600598, 600600, 600611, 600614, 600618, 600623, 600628, 600633, 600635, 600639, 600640, 600642, 600643, 600645, 600648, 600651, 600655, 600657, 600673, 600687, 600694, 600717, 600718, 600729, 600737, 600743, 600748, 600750, 600751, 600754, 600755, 600757, 600759, 600765, 600770, 600773, 600776, 600787, 600801, 600808, 600811, 600823, 600826, 600835, 600839, 600848, 600859, 600862, 600863, 600869, 600872, 600874, 600875, 600879, 600880, 600881, 600884, 600885, 600894, 600908, 600917, 600936, 600939, 600967, 600970, 600971, 600978, 600993, 600996, 601000, 601001, 601002, 601016, 601020, 601127, 601128, 601168, 601200, 601231, 601233, 601311, 601678, 601689, 601699, 601717, 601777, 601811, 601880, 601928, 601969, 603000, 603001, 603019, 603025, 603077, 603169, 603188, 603198, 603225, 603228, 603328, 603355, 603369, 603377, 603444, 603515, 603528, 603556, 603568, 603569, 603589, 603658, 603766, 603806, 603816, 603868, 603877, 603883, 603888, 000006, 000009, 000012, 000021, 000025, 000027, 000028, 000031, 000039, 000049, 000050, 000061, 000062, 000066, 000078, 000089, 000090, 000099, 000156, 000158, 000400, 000401, 000418, 000426, 000488, 000501, 000513, 000519, 000528, 000536, 000541, 000543, 000547, 000552, 000563, 000566, 000572, 000581, 000587, 000592, 000596, 000598, 000600, 000612, 000636, 000652, 000656, 000661, 000662, 000667, 000669, 000680, 000681, 000685, 000690, 000703, 000712, 000718, 000727, 000729, 000732, 000758, 000761, 000762, 000766, 000777, 000778, 000786, 000806, 000807, 000816, 000825, 000829, 000830, 000848, 000860, 000877, 000878, 000887, 000897, 000926, 000930, 000937, 000939, 000960, 000969, 000970, 000975, 000977, 000979, 000981, 000987, 000988, 000990, 000997, 000998, 000999, 001696, 002001, 002002, 002004, 002005, 002011, 002013, 002018, 002019, 002022, 002028, 002030, 002032, 002038, 002041, 002048, 002049, 002050, 002051, 002056, 002063, 002064, 002073, 002078, 002092, 002093, 002106, 002118, 002122, 002123, 002127, 002128, 002131, 002147, 002152, 002155, 002176, 002179, 002183, 002190, 002191, 002195, 002221, 002223, 002233, 002242, 002244, 002249, 002250, 002251, 002254, 002261, 002266, 002268, 002269, 002271, 002273, 002276, 002277, 002280, 002281, 002285, 002299, 002308, 002311, 002317, 002325, 002332, 002340, 002342, 002344, 002345, 002353, 002354, 002358, 002359, 002366, 002368, 002371, 002373, 002375, 002384, 002390, 002392, 002400, 002405, 002407, 002408, 002410, 002414, 002416, 002422, 002428, 002431, 002434, 002437, 002439, 002440, 002444, 002463, 002477, 002479, 002482, 002489, 002491, 002503, 002505, 002506, 002512, 002517, 002544, 002551, 002573, 002583, 002588, 002589, 002603, 002635, 002640, 002642, 002657, 002663, 002665, 002670, 002672, 002681, 002690, 002699, 002701, 002707, 002709, 002745, 002807, 002815, 002818, 300001, 300002, 300010, 300026, 300032, 300039, 300043, 300055, 300058, 300088, 300113, 300115, 300116, 300133, 300134, 300146, 300147, 300159, 300166, 300182, 300197, 300199, 300202, 300244, 300253, 300257, 300266, 300273, 300274, 300287, 300291, 600000, 600008, 600009, 600010, 600011, 600015, 600016, 600018, 600019, 600021, 600023, 600028, 600029, 600030, 600031, 600036, 600038, 600048, 600050, 600061, 600066, 600068, 600074, 600085, 600089, 600100, 600104, 600109, 600111, 600115, 600118, 600153, 600157, 600170, 600177, 600188, 600196, 600208, 600219, 600221, 600233, 600271, 600276, 600297, 600309, 600332, 600340, 600352, 600362, 600369, 600372, 600373, 600376, 600383, 600390, 600406, 600415, 600436, 600482, 600485, 600489, 600498, 600518, 600519, 600522, 600535, 600547, 600549, 600570, 600583, 600585, 600588, 600606, 600637, 600649, 600660, 600663, 600674, 600682, 600685, 600688, 600690, 600703, 600704, 600705, 600739, 600741, 600795, 600804, 600816, 600820, 600827, 600837, 600871, 600886, 600887, 600893, 600895, 600900, 600909, 600919, 600926, 600958, 600959, 600977, 600999, 601006, 601009, 601012, 601018, 601021, 601088, 601099, 601111, 601117, 601118, 601155, 601163, 601166, 601169, 601186, 601198, 601211, 601212, 601216, 601225, 601228, 601229, 601288, 601318, 601328, 601333, 601336, 601375, 601377, 601390, 601398, 601555, 601600, 601601, 601607, 601608, 601611, 601618, 601628, 601633, 601668, 601669, 601688, 601718, 601727, 601766, 601788, 601800, 601818, 601857, 601866, 601872, 601877, 601878, 601881, 601888, 601898, 601899, 601901, 601919, 601933, 601939, 601958, 601966, 601985, 601988, 601989, 601991, 601992, 601997, 601998, 603160, 603799, 603833, 603858, 603993, 000001, 000002, 000008, 000060, 000063, 000069, 000100, 000157, 000166, 000333, 000338, 000402, 000413, 000415, 000423, 000425, 000503, 000538, 000540, 000559, 000568, 000623, 000625, 000627, 000630, 000651, 000671, 000686, 000709, 000723, 000725, 000728, 000738, 000750, 000768, 000776, 000783, 000792, 000826, 000839, 000858, 000876, 000895, 000898, 000938, 000959, 000961, 000963, 000983, 001979, 002007, 002008, 002024, 002027, 002044, 002065, 002074, 002081, 002142, 002146, 002153, 002174, 002202, 002230, 002236, 002241, 002252, 002292, 002294, 002304, 002310, 002352, 002385, 002411, 002415, 002424, 002426, 002450, 002456, 002460, 002465, 002466, 002468, 002470, 002475, 002500, 002508, 002555, 002558, 002572, 002594, 002601, 002602, 002608, 002624, 002673, 002714, 002736, 002739, 002797, 002831, 002839, 002841, 300003, 300015, 300017, 300024, 300027, 300033, 300059, 300070, 300072, 300122, 300124, 300136, 300144, 300251, 300315"
32 | list = String.split(", ")
33 | for i in range(len(list)):
34 | # i=str(list[i]).strip(" ")
35 | print("begin save code is {}条,===={}".format(i, list[i]))
36 | df = ts.bar(list[i], conn=cons, freq='D', start_date='2004-01-05', end_date='', ma=[5, 10, 20],factors=['vr', 'tor'])
37 | # df.to_excel('d:/test/'+list[i]+'.xlsx')
38 | df.to_sql('tick_data_vol', engine, if_exists='append')
39 | ts.close_apis(cons)
40 |
41 |
42 | '''
43 | test
44 | '''
45 | if __name__ == "__main__":
46 | SaveDate()
47 |
--------------------------------------------------------------------------------
/code/Util/__init__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/24 16:42
4 | # @Author : leifengchuan
5 | # @File : __init__.py
6 |
--------------------------------------------------------------------------------
/code/Util/myUtilFile.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/22 22:46
4 | # @Author : leifengchuan
5 | # @File : myUtilFile
6 |
7 | """
8 | 封装些常用的代码方法
9 | 比如包含发送邮件的方法
10 | """
11 | #导入包
12 | import smtplib
13 | from email.mime.text import MIMEText
14 | from email.header import Header
15 | import pymysql# pip install pymysql
16 | import time as time
17 |
18 |
19 | # 第三方 SMTP 服务,采用网易邮箱的服务
20 | mail_host = "smtp.XXX.com" # 设置服务器
21 | mail_user = "XXXX" # 用户名
22 | mail_pass = "XXXXXX" # 口令
23 | sender = 'from@runoob.com'
24 | receivers = ['429240967@qq.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
25 |
26 | # 定义数据库账号密码等信息
27 | host = "localhost"
28 | userName = "root"
29 | password = "root"
30 | mysqldbName = "stockAI"
31 |
32 |
33 | def getCurrentFormateTime():
34 | """
35 | 格式化日期:格式化成2016-03-20 11:45:39形式
36 | :return:
37 | """
38 | return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
39 |
40 | def getReceiversFromMysql():
41 | """
42 | 从mysql数据库获取收件人列表
43 | :return:
44 | """
45 | sql="select email from reemail where status='1' "
46 | # return contnectMysqlDbAndFetchAll(sql)
47 |
48 |
49 | def sedEmail(content,header):
50 | """
51 | 定义发送邮件的方法
52 | :return:
53 | content:待发送的文本的内容
54 | header:头部信息
55 |
56 | """
57 | message = MIMEText(content, 'plain', 'utf-8')
58 | message['From'] = Header(header, 'utf-8')
59 | message['To'] = Header("测试", 'utf-8')
60 |
61 | subject = 'Python SMTP 邮件测试'
62 | message['Subject'] = Header(subject, 'utf-8')
63 |
64 | try:
65 | smtpObj = smtplib.SMTP()
66 | smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
67 | smtpObj.login(mail_user, mail_pass)
68 | smtpObj.sendmail(sender, receivers, message.as_string())
69 | print("邮件发送成功")
70 | except smtplib.SMTPException:
71 | print("Error: 无法发送邮件")
72 |
73 |
74 |
75 | def createOrWriteContentToFile(string):
76 | """
77 | string:等待写入的日志信息
78 | :param string:
79 | :return:
80 | """
81 | string=string+"\n"#换行,追加模式
82 | with open("../../doc/stockAI.log",'a',encoding='UTF-8') as file:
83 | file.write(string)
84 |
85 |
86 |
87 |
88 |
89 | def connectDB():
90 | """
91 | 链接数据库返回db对象
92 | :return:
93 | """
94 | return pymysql.connect(host, userName, password, mysqldbName)
95 |
96 |
97 | def contnectMysqlDbAndFetchOne(sql):
98 | """
99 | 定义一个方法
100 | 连接数据库,执行sql语句
101 | 查询使用一条数据
102 | """
103 | # 打开数据库连接
104 | db = connectDB()
105 |
106 | # 使用 cursor() 方法创建一个游标对象 cursor
107 | cursor = db.cursor()
108 | # 使用 execute() 方法执行 SQL 查询
109 | cursor.execute(sql)
110 | # 使用 fetchone() 方法获取单条数据.
111 | data = cursor.fetchone()
112 | # 关闭数据库连接
113 | db.close()
114 | string="调用查询数据库的语句是{},查询时间:{}".format(sql,getCurrentFormateTime())
115 | createOrWriteContentToFile(string)
116 | return data
117 |
118 |
119 | def contnectMysqlDbAndFetchAll(sql):
120 | """
121 | 定义一个方法
122 | 连接数据库,执行sql语句
123 | 查询使用全部
124 | """
125 | # 打开数据库连接
126 | db = connectDB()
127 |
128 | # 使用 cursor() 方法创建一个游标对象 cursor
129 | cursor = db.cursor()
130 | # 使用 execute() 方法执行 SQL 查询
131 | cursor.execute(sql)
132 | # 使用 fetchone() 方法获取单条数据.
133 | data = cursor.fetchall()
134 | # 关闭数据库连接
135 | db.close()
136 | string = "调用查询数据库的语句是{},查询时间:{}".format(sql,getCurrentFormateTime())
137 | createOrWriteContentToFile(string)
138 | return data
139 |
140 |
141 | def contnectMysqlDbAndFetchMany(sql):
142 | """
143 | 定义一个方法
144 | 连接数据库,执行sql语句
145 | 查询使用多条数据
146 | """
147 | # 打开数据库连接
148 | db = connectDB()
149 | # 使用 cursor() 方法创建一个游标对象 cursor
150 | cursor = db.cursor()
151 | # 使用 execute() 方法执行 SQL 查询
152 | cursor.execute(sql)
153 | # 使用 fetchone() 方法获取单条数据.
154 | data = cursor.fetchmany()
155 | # 关闭数据库连接
156 | db.close()
157 | string="调用查询数据库的语句是{},查询时间:{}".format(sql,getCurrentFormateTime())
158 | createOrWriteContentToFile(string)
159 | return data
160 |
161 |
162 | def insterOrUpdateOrDelete(sql):
163 | """
164 | 定义一个方法
165 | 连接数据库,执行sql语句
166 | 插入,更新,删除
167 | """
168 | # 打开数据库连接
169 | db = connectDB()
170 | # 使用 cursor() 方法创建一个游标对象 cursor
171 | cursor = db.cursor()
172 | try:
173 | # 使用 execute() 方法执行 SQL 查询
174 | cursor.execute(sql)
175 | # 执行sql语句
176 | db.commit()
177 | except:
178 | # 发生错误时回滚
179 | db.rollback()
180 | # 关闭数据库连接
181 | string = "调用数据库的语句是{},查询时间:{}".format(sql, getCurrentFormateTime())
182 | createOrWriteContentToFile(string)
183 | db.close()
184 |
185 |
186 |
187 |
188 | if __name__ == "__main__":
189 | sql = "select email from reemail where status='1' "
190 | print(contnectMysqlDbAndFetchAll(sql))
191 |
192 |
193 |
--------------------------------------------------------------------------------
/code/__init__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/22 22:27
4 | # @Author : leifengchuan:
5 | # @File : __init__.py.py
6 |
7 |
--------------------------------------------------------------------------------
/code/getDatasFromTushare.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/22 22:28
4 | # @Author : leifengchuan
5 | # @File : getDatasFromTushare
6 |
7 | """
8 | 从tushare获取数据,然后保存再自己本地mysql数据库中
9 | """
10 |
11 |
--------------------------------------------------------------------------------
/code/preDealStocksDatas.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/22 22:29
4 | # @Author : leifengchuan
5 | # @File : preDealStocksDatas
6 | """
7 | 数据预处理文件
8 | 预处理包含数据
9 | """
10 |
--------------------------------------------------------------------------------
/doc/StockAI项目整体思路流程.txt:
--------------------------------------------------------------------------------
1 | 项目整体思路步骤:
2 |
3 | 第一步:选股票的code,目前选中的比较优良的股票是 沪深300以及上证500,总共800个股票代码
4 |
5 | 第二步:根据第一步的股票code获取历史数据存在csv或者数据库中,其中获取的时间区间是 【2004-01-05 2018-06-15】
6 |
7 | 第三步:手动或者写程序对第二步获取的历史数据根据code分别打标注,标注标注出那个买入点位比较合适,
8 | 后面用来训练的时候,有Y=1,没有标注的数据Y=0
9 |
10 | 第四步:打标注好数据后,开始根据下面的字典,根据code把近五日的历史数据生成一条记录,维度大概100维,用于做特征工程
11 |
12 | 第五步:把第四步的数据用来做特征工程
13 | 特征工程的细节
14 | 清洗数据
15 |
16 | 第六步:模型训练,参数调优
17 |
18 | 第七步:模型部署,获取实时数据做模拟交易。
19 |
20 |
21 |
22 | ===============字典:======================
23 | /**
24 | * 股票的代码
25 | */
26 | code;
27 | /**
28 | * 具体的时间日期
29 | */
30 | tradedate;
31 | /**
32 | * 【Y值】 是否可以购买
33 | */
34 | resultBuy;
35 | /**
36 | * 今日开盘价
37 | */
38 | open1Price;
39 | /**
40 | * 今日收盘价
41 | */
42 | closed1Price;
43 | /**
44 | * 今日最高价
45 | */
46 | high1Price;
47 | /**
48 | * 今日最低价
49 | */
50 | lower1Price;
51 | /**
52 | * 跌涨幅度
53 | */
54 | level1;
55 | /**
56 | * 跌涨值
57 | */
58 | level1value;
59 | /**
60 | * 今日ma5值
61 | */
62 | ma51;
63 | /**
64 | * 今日ma10值
65 | */
66 | ma101;
67 | /**
68 | * 今日ma20值
69 | */
70 | ma201;
71 | /**
72 | * 今日成交量
73 | */
74 | valume1;
75 | /**
76 | * 今日换手率
77 | */
78 | change1;
79 | /**
80 | * 市盈率
81 | */
82 | marketProfits1;
83 | /**
84 | * 公司市值
85 | */
86 | companyMoney1;;
87 |
88 | /**
89 | * ma5是否大于昨日的ma5
90 | */
91 | ma5biger1;
92 |
93 | /**
94 | * ma10是否大于昨日的ma10
95 | */
96 | ma10biger1;
97 |
98 | /**
99 | * ma20是否大于昨日的ma20
100 | */
101 | ma20biger1;
102 | /**
103 | * ma5是否大于ma10
104 | */
105 | ma5bigerma10_1;
106 | /**
107 | * ma5是否大于ma20
108 | */
109 | ma5bigerma20_1;
110 |
111 | /**
112 | * 换手率
113 | */
114 | tor1;
115 |
116 | /**
117 | * vr:量比
118 | */
119 | vr1;
120 | // ====昨日数据===
121 | open2Price;
122 | closed2Price;
123 | high2Price;
124 | lower2Price;
125 | level2;
126 | level2value;
127 | ma52;
128 | ma102;
129 | ma202;
130 | valume2;
131 | change2;
132 | marketProfits2;
133 | companyMoney2;;
134 | ma5biger2;
135 | ma10biger2;
136 | ma20biger2;
137 | ma5bigerma10_2;
138 | ma5bigerma20_2;
139 | tor2;
140 | vr2;
141 |
142 | // ======前日数据===
143 | open3Price;
144 | closed3Price;
145 | high3Price;
146 | lower3Price;
147 | level3;
148 | level3value;
149 | ma53;
150 | ma103;
151 | ma203;
152 | valume3;
153 | change3;
154 | marketProfits3;
155 | companyMoney3;
156 | ma5biger3;
157 | ma10biger3;
158 | ma20biger3;
159 | ma5bigerma10_3;
160 | ma5bigerma20_3;
161 | tor3;
162 | vr3;
163 | // ==大前日的数据===
164 | open4Price;
165 | closed4Price;
166 | high4Price;
167 | lower4Price;
168 | level4;
169 | level4value;
170 | ma54;
171 | ma104;
172 | ma204;
173 | valume4;
174 | change4;
175 | marketProfits4;
176 | companyMoney4;
177 | ma5biger4;
178 | ma10biger4;
179 | ma20biger4;
180 | ma5bigerma10_4;
181 | ma5bigerma20_4;
182 | tor4;
183 | vr4;
184 | // =前五日的数据=====
185 | open5Price;
186 | closed5Price;
187 | high5Price;
188 | lower5Price;
189 | level5;
190 | level5value;
191 | ma55;
192 | ma105;
193 | ma205;
194 | valume5;
195 | change5;
196 | marketProfits5;
197 | companyMoney5;
198 | ma5biger5;
199 | ma10biger5;
200 | ma20biger5;
201 | ma5bigerma10_5;
202 | ma5bigerma20_5;
203 | tor5;
204 | vr5;
--------------------------------------------------------------------------------
/doc/__init__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/22 22:33
4 | # @Author : leifengchuan
5 | # @File : __init__.py
6 |
--------------------------------------------------------------------------------
/doc/mysql:
--------------------------------------------------------------------------------
1 | #mysql数据库表结构信息
--------------------------------------------------------------------------------
/modelSVM/__init__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/22 22:35
4 | # @Author : leifengchuan
5 | # @File : __init__.py
6 |
--------------------------------------------------------------------------------
/modelSVM/trainBySVM.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/22 22:36
4 | # @Author : leifengchuan
5 | # @File : trainBySVM
6 |
7 | """
8 | 数据预处理后后用来训练模型的代码文件
9 | """
10 |
--------------------------------------------------------------------------------
/produceModel/SVM.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/22 22:44
4 | # @Author : leifengchuan
5 | # @File : SVM
6 | """
7 | 该模型采用的是SVM分类器用来预测的
8 | """
--------------------------------------------------------------------------------
/produceModel/__init__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | # @Time : 2018/9/22 22:42
4 | # @Author : leifengchuan
5 | # @File : __init__.py
6 |
7 | """
8 | 该目录下代码是调用训练好的模型,实现预测
9 | """
10 |
--------------------------------------------------------------------------------
/requests:
--------------------------------------------------------------------------------
1 | #项目使用到的环境
2 | 1,pip install tushare
3 | 2,pip install pymysql
4 | 3,pip install sklearn
--------------------------------------------------------------------------------