最近炒股是买什么就跌,一直是亏损哎,哭,作为学过python的人来讲怎么能容忍,之前也炒过股票觉得用阳包阴这样的k线来选出来的股票还不错。于是说做就做,我可以用python来写一个选股的程序。

好!有了idea是第一步,要怎么实现呢,网上找了资料,大部分都是用tushare库来获取股票数据的。于是动起来 写了一个直接通过接口获取数据的程序,从3504只股票里面选取出来我需要的股票,执行时间居然需要二十多分钟, 太慢!差评!同样不能容忍。因此,我想到了数据库。我就想能不能将所有的A股数据添加进数据库里面,我每次执行的时候直接从数据库里面去取数据, 这样会大大加快了我的执行速度 于是说干就干,先理清楚思路。1.需要获取到所有股票的代码跟名称等。于是有了writeallstock这个文件 2.需要从所有的股票里面找出阳包阴的股票,以及计算出它们的收益率的话,我需要所有股票的一段时间的行情 于是有了createverydatebase 3.有了这一段时间的数据,但是这些数据时死了,不会每天给我自动更新,因此我需要每天定时的将当天的数据加 进去。所以写了writeeveryday 4.好了,所有的股票数据一段时间的行情而且会每天定时更新都存在我的数据库里面了,就需要去统计今天有哪些股票满足 阳包阴的情况于是产生了findstock 5.虽然找到了当天满足阳包阴的股票了,但是我心里还是没有谱,我想对比一下这个股票之前出现这种情况的时候如果 第二天买入的话到底有多少收益,所以有了winrates 6.好了整体框架和思路都出来了,那么有两个文件需要每个交易日都执行的,所以将它们绑在一起,而且每天的报告出来 之后也不一定都有时间打开电脑去看,所以加入了通过邮件自动发送当天报告到邮箱的功能。就有了runall 至于其它的几个文件,打开看看下面都有解释和注释 目前我的选股条件是阳包阴,而且当天要涨停。

下面送上代码。执行代码的前提是,需要有python,需要安装本地mysql数据库,还需要导入mysql、tushare、pandas、lxml、bs4等需要支持的python库。另外:完整项目也可以访问我的github,地址:https://github.com/cat-steel/stock_pick

rite_allstock.pyimport mysql.connector

import tushare as ts

#将所有的股票名称和股票代码、行业、地区写入到名为allstock的表中,这个文件只需要执行一次

#通过tushare库获取所有的A股列表

stock_info = ts.get_stock_basics()

#连接数据库

conn = mysql.connector.connect(user='root',password='password',database='test')

cursor = conn.cursor()

codes = stock_info.index

names = stock_info.name

industrys = stock_info.industry

areas = stock_info.area

#通过for循环遍历所有股票,然后拆分获取到需要的列,将数据写入到数据库中

a=0

for i in range(0,len(stock_info)):

cursor.execute('insert into allstock (code,name,industry,area) values (%s,%s,%s,%s)',(codes[i],names[i],industrys[i],areas[i]))

a += 1

#统计所有A股数量

print('共获取到%d支股票'%a)

conn.commit()

cursor.close()

conn.close()

creat_everydatebase.pyimport tushare as ts

import mysql.connector

import re,time

#创建所有股票的表格以及插入每支股票的近段时间的行情,这个文件只需要执行一次!!!

#想要写入哪一段时间的数据只需要修改starttime,endtime的时间就可以了

def everdate(starttime,endtime):

#获取所有有股票

stock_info = ts.get_stock_basics()

#连接数据库

conn = mysql.connector.connect(user='root',password='password',database='test')

cursor = conn.cursor()

codes = stock_info.index

a = 0

#通过for循环以及获取A股只数来遍历每一只股票

for x in range(0,len(stock_info)):

#匹配深圳股票(因为整个A股太多,所以我选择深圳股票做个筛选)

if re.match('000',codes[x]) or re.match('002',codes[x]):

#以stock_加股票代码为表名称创建表格

cursor.execute('create table stock_' + codes[x] + ' (date varchar(32),open varchar(32),close varchar(32),high varchar(32),low varchar(32),volume varchar(32),p_change varchar(32),unique(date))')

#利用tushare包获取单只股票的阶段性行情

df = ts.get_hist_data(codes[x],starttime,endtime)

print('%s的表格创建完成'%codes[x])

a += 1

#这里使用try,except的目的是为了防止一些停牌的股票,获取数据为空,插入数据库的时候失败而报错

#再使用for循环遍历单只股票每一天的行情

try:

for i in range(0,len(df)):

#获取股票日期,并转格式(这里为什么要转格式,是因为之前我2018-03-15这样的格式写入数据库的时候,通过通配符%之后他居然给我把-符号当做减号给算出来了查看数据库日期就是2000百思不得其解想了很久最后决定转换格式)

times = time.strptime(df.index[i],'%Y-%m-%d')

time_new = time.strftime('%Y%m%d',times)

#插入每一天的行情

cursor.execute('insert into stock_'+codes[x]+ ' (date,open,close,high,low,volume,p_change) values (%s,%s,%s,%s,%s,%s,%s)' % (time_new,df.open[i],df.close[i],df.high[i],df.low[i],df.volume[i],df.p_change[i]))

except:

print('%s这股票目前停牌'%codes[x])

conn.close()

cursor.close()

#统计总共插入了多少张表的数据

print('所有股票总共插入数据库%d张表格'%a)

everdate('2018-01-01','2018-03-14')

write_everyday.py#每天下午三点之后进行股票数据添加到数据库,这个文件一般只需要每天执行一次,也可以用来补行情,如果数据库缺少那天的数据的话,只需修改new_time就行,如下示例

import tushare as ts

import mysql.connector

import re,time

#每天行情出来了之后,插入当天的行情到每支股票的每个表格中

def everystock():

#获取所有股票列表

stock_info = ts.get_stock_basics()

#获取股票代码列

codes = stock_info.index

#连接数据库

conn = mysql.connector.connect(user='root',password='password',database='test')

cursor = conn.cursor()

#获取当前时间

new_time = time.strftime('%Y-%m-%d')

#new_time = '2018-03-13'

a = 0

##使用for循环遍历所有的股票

for x in range(0,len(stock_info)):

try:

if re.match('000',codes[x]) or re.match('002',codes[x]):

#获取单只股票当天的行情

df = ts.get_hist_data(codes[x],new_time,new_time)

#将时间转换格式

times = time.strptime(new_time,'%Y-%m-%d')

time_new = time.strftime('%Y%m%d',times)

# #将当天的行情插入数据库

cursor.execute('insert into stock_'+codes[x]+ ' (date,open,close,high,low,volume,p_change) values (%s,%s,%s,%s,%s,%s,%s)' % (time_new,df.open[0],df.close[0],df.high[0],df.low[0],df.volume[0],df.p_change[0]))

print('%s的数据插入完成'%codes[x])

a += 1

except:

print('%s无行情或者数据库已经存在当天的数据'%codes[x])

#统计当天插入数据库的股票数量

dir_log = 'D:\\python\\work\\stock\\WD\\run\log\\'

filename = dir_log + new_time +'.log'

flog = open(filename,'w')

flog.write('今天的行情插入完成%s条'%a)

# print('今天的行情插入完成%s条'%a)

flog.close()

conn.commit()

conn.close()

cursor.close()

#everystock()

find_stock.pyimport mysql.connector

import re,time

import datetime,os

#从数据库获取股票数据,统计想要查找日期的满足阳包阴并且当天涨停的股票

def valid_stock(dates):

#载入日志,好查错(因为之前统计出来的股票我去实时查了一下完全不满足条件,所以想到了加入日志好定位是哪个地方出错了)

dir_log = 'D:\\python\\work\\stock\\WD\\run\log\\'

filename = dir_log + dates +'.log'

flog = open(filename,'w')

# 先将字符串格式的时间转换为时间格式才能计算昨天的日期

now = datetime.date(*map(int,dates.split('-')))

oneday = datetime.timedelta(days=1)

yestody = str(now - oneday)

#将昨天日期转换为规定的字符串格式

times = time.strptime(yestody,'%Y-%m-%d')

str_yestoday = time.strftime('%Y%m%d',times)

flog.write('执行的时间前一天是%s\n'%str_yestoday)

#将想要查找的日期转换为规定的字符串格式

str_today = time.strptime(dates,'%Y-%m-%d')

today = time.strftime('%Y%m%d',str_today)

flog.write('执行的时间是%s\n'%today)

#连接数据库

conn = mysql.connector.connect(user='root',password='password',database='test')

cursor = conn.cursor()

#查找allstock表获取所有股票代码

cursor.execute('select code from allstock')

value_code = cursor.fetchall()

a = 0

count = []

#遍历所有股票

for i in range(0,len(value_code)):

if re.match('000',value_code[i][0]) or re.match('002',value_code[i][0]):

#查询所有匹配到的股票,将今天与昨天的数据对比

try:

cursor.execute('select * from stock_'+ value_code[i][0]+ ' where date=%s or date =%s order by date desc'%(today,str_yestoday)) #当天

#cursor.execute('select * from stock_'+ value_code[i][0]+ ' where date=%s or date =%s'%('20180315','20180314'))

value = cursor.fetchall()

#1是昨天,2是今天

#今天的开盘价

opens1 = float(value[0][1])

#今天的收盘价

close1 = float(value[0][2])

#今天的涨幅

p_change1 = float(value[0][6])

#昨天的。。。。。

opens2 = float(value[1][1])

close2 = float(value[1][2])

p_change2 = float(value[1][6])

#加入这两天的数据满足昨天下跌超过2%,而且今天的开盘价低于昨天的收盘价,且今天的收盘价高于昨天的收盘价,就满足阳包阴的条件

if opens2opens1 and p_change2<-2 and p_change1>9.8:

flog.write('%s票%s的开盘价是%s\n'%(value_code[i][0],today,opens1))

flog.write('%s票%s的收盘价是%s\n'%(value_code[i][0],today,close1))

flog.write('%s票%s的涨幅是%s\n'%(value_code[i][0],today,p_change1))

flog.write('%s票%s的开盘价是%s\n'%(value_code[i][0],str_yestoday,opens2))

flog.write('%s票%s的收盘价价是%s\n'%(value_code[i][0],str_yestoday,close2))

flog.write('%s票%s的涨幅是%s\n'%(value_code[i][0],str_yestoday,p_change2))

#将满足条件的股票代码放进列表中,统计当天满足条件的股票

count.append(value_code[i][0])

a += 1

except:

#之前有次sql语句出错了,order by后面没加date,每次寻找都是0支,找了半个多小时才找出来是sql语句的问题

flog.write('%s停牌无数据,或者请查看sql语句是否正确\n'%value_code[i][0])#一般不用管,除非执行好多天的数据都为0时那可能输sql语句有问题了

print('总共找到%d支满足条件的股票'%a)

flog.close()

conn.close()

cursor.close()

return count,a

#valid_stock('2018-3-1')

win_rates.py#这个文件可以联合find_stock单独运行,输入todays的日期可以直接查找当天出现过的股票

import mysql.connector

import re,time

import datetime

import find_stock

#统计当天满足阳包阴所有股票,在设置的这段时间里面有没有出现过类似的行情,并且计算如果出现过,那么那天之后的5天收益率是多少

def rate(todays):

print(todays)

#将满足阳包阴的这些股票,以及它们之前满足的时候收益率都写到报告里面方便查看整体情况

count,a = find_stock.valid_stock(todays)

dir_repor = 'D:\\python\\work\\stock\\WD\\run\\report\\'

filename = dir_repor + todays +'.txt'

fp = open(filename,'w')

fp.write('总共找到%d支满足条件的股票分别是\n%s\n'%(a,count))

#连接数据库

conn = mysql.connector.connect(user='root',password='password',database='test')

cursor = conn.cursor()

#遍历满足条件的这些股票

for x in count:

#从数据库里挑出它们的行情

cursor.execute('select * from stock_'+x+' order by date desc')

value = cursor.fetchall()

# print(value)

for i in range(0,len(value)): #遍历这支股票的所有天数

try:

dates = value[i][0]

opens2 = float(value[i][1]) #第i行的第一列

opens1 = float(value[i+1][1])

close2 = float(value[i][2]) #第i行的第二列

close1 = float(value[i+1][2])

p_change1 = float(value[i+1][6]) #第i行的第六列

p_change2 = float(value[i][6])

if opens2opens1 and p_change1<-2 and p_change2>9.8:

#这一句很重要,就是在出现阳包阴之后得有5天的数据区统计,否则就会变成-5就会从开始统计的那天去取数据,结果就导致当天的这些股票统计收益的时候也有不过都是错的

if i-6>0:

#收益率

wins = (float(value[i-6][2])-float(value[i-1][1]))/float(value[i-1][1])*100

print('%s的%s之后5天收率为百分之%d'%(x,dates,wins))

fp.write('%s在%s之后5天收率为百分之%d\n'%(x,dates,wins))

else:

fp.write('%s在%s之前没有满足条件的行情\n'%(x,dates))

except:

pass

# print('%s前3个月无满足条件的情况'%x)

fp.close()

conn.close()

cursor.close()

#rate('2018-03-16')

run_all.py#总的运行文件,实现将统计报告发送邮件到自己的邮箱,将这个文件放到Jenkin上每个交易日下午3点之后运行就可以收到当天满足行情的股票了

import win_rates

import write_everyday

import time

import os

import smtplib

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

from email.header import Header

#获取最新的文件

def new_file(test_report_dir):

lists = os.listdir(test_report_dir)

lists.sort(key = lambda fn:os.path.getmtime(test_report_dir + fn))

file_path = os.path.join(test_report_dir,lists[-1])

return file_path

#发送邮件

def send_email():

f = open(new_file(test_report_dir),'rb')

mail_body = f.read()

# print(mail_body)

f.close()

#设置邮件服务器和账号密码

smtpserver = 'smtp.163.com'

user = '17665324876@163.com'

password = '*****'

#设置接收邮箱和主题

sender = user

receiver = '497051142@qq.com'

subject = '今天的股票行情来啦'

msg = MIMEMultipart('mixed')

att = MIMEText(mail_body,'txt','utf-8')

att['Content-Type'] = 'application/octet-stream'

att['Content-Disposition'] = 'attachment; filename = "%s.txt"'%todays

msg.attach(att)

msg['From'] = user

msg['To'] = receiver

msg['Subject'] =Header(subject,'utf-8')

smtp = smtplib.SMTP()

smtp.connect(smtpserver,25)

smtp.login(user,password)

smtp.sendmail(sender,receiver,msg.as_string())

smtp.quit()

if __name__ == '__main__':

test_report_dir = 'D:\\python\\work\\stock\\WD\\run\\report\\'

#如果执行的不是当天的日期的话请将第一个todays注释掉,最好也将write_everyday.everystock()注释掉,用第二个todays

todays = time.strftime('%Y-%m-%d')

# todays = '2018-03-14'

#如果不是交易日执行的话write_everyday会报错,会报tushare获取不到行情,所以请手动输入日期并将下面一行注释掉

write_everyday.everystock()

time.sleep(3)

win_rates.rate(todays)

send_email()

delete_stock.pyimport mysql.connector

import re,time

import datetime,os

def delete(dates):

conn = mysql.connector.connect(user='root',password='password',database='test')

cursor = conn.cursor()

cursor.execute('select code from allstock')

value_code = cursor.fetchall()

a = 0

for i in range(0,len(value_code)):

if re.match('000',value_code[i][0]) or re.match('002',value_code[i][0]):

cursor.execute('delete from stock_'+ value_code[i][0]+ ' where date=%s'%(dates)) #删除重复的数据

a +=1

print('%s已删除'%value_code[i][0])

print('共删除%d支股票的数据'%a)

conn.commit()

conn.close()

cursor.close()

delete('20180313')

addsqlunique.pyimport mysql.connector

import re,time

import datetime,os

#因为之前创建表格的时候没加唯一性约束,容易插入重复的数据,导致最后计算记过不准确,所以穿件一个函数给之前没加约束的加上去

def addunique():

conn = mysql.connector.connect(user='root',password='password',database='test')

cursor = conn.cursor()

cursor.execute('select code from allstock')

value_code = cursor.fetchall()

a = 0

for i in range(0,len(value_code)):

if re.match('000',value_code[i][0]) or re.match('002',value_code[i][0]):

cursor.execute('alter table stock_'+ value_code[i][0]+ ' add unique (date)') #删除重复的数据

print('%s已添加唯一性约束完成'%value_code[i][0])

conn.close()

cursor.close()

addunique()

可以选股了,拿去赚钱吧,亏钱了可不要赖我哦。

python自动买股票_用python可以做哪些有趣的事--我:选股票相关推荐

  1. python自动投递_利用python如何在前程无忧高效投递简历

    前言 在前程无忧上投递简历发现有竞争力分析,免费能看到匹配度评价和综合竞争力分数,可以做投递参考 计算方式 综合竞争力得分应该越高越好,匹配度评语也应该评价越高越好 抓取所有职位关键字搜索结果并获取综 ...

  2. python自动扫雷_利用Python实现自动扫雷

    自动扫雷一般分为两种,一种是读取内存数据,而另一种是通过分析图片获得数据,并通过模拟鼠标操作,这里我用的是第二种方式. 一.准备工作 我的版本是 python 3.6.1 python的第三方库: w ...

  3. python自动配置文件_【python接口自动化】- ConfigParser配置文件的使用

    前言:目前我们使用的绝大多数计算机程序,无论是办公软件,浏览器,甚至游戏.视频都是通过菜单界面系统配置的,它几乎成了我们使用机器的默认方式.而在python中,也有这样的一个配置模块可以把代码可配置化 ...

  4. python自动控制程序_使用 Python 自动执行 ANSYS APDL

    有时候,我们希望将有限元求解和其它程序相结合,以实现设计自动化或优化.本文以 Python 函数运行 一个 APDL 脚本,实现检查输出文件是否有错误为例,提供一个结合思路. 1. 什么是 APDL ...

  5. python自动抢单_【Python成长之路】基于sikuli jar包,实现淘宝自动抢单功能(1)...

    [写在前面] 记得节前,西哥问我能不能帮忙写个淘宝自动抢单的功能.其实之前就有提到过sikuli IDE工具,可以很方便地实现图形化自动化,只是当时并没有真正用python实现. 因此刚好借这个机会, ...

  6. python自动点赞_用Python模拟技巧带你实现自动抽屉登录自动点赞

    /1 前言/ 嘿,各位小伙伴们晚上好呀,今天小编又给大家带来干货内容啦,今天带来的是,如何自动登录抽屉,并且点赞! 原计划是不打算使用selenium的,但是因为要涉及点赞,所以免不了登录.但事实证明 ...

  7. python自动上传图片_使用Python实现一个简单的图片上传存储服务

    使用flask实现的一个简单的图片上传服务 设计初衷 对于图片的存储,有很多选择,一般采用云服务如(七牛,又拍等),但是国内的服务像七牛 自定义域名竟然需要域名备案(Excuse me,当初就是因为备 ...

  8. python自动输入_使用Python和pywin32自动输入数据

    我正在尝试编写一个python脚本来获取数据并将其输入任何形式 以下是我目前为止的代码:def pasteNum(n): win32clipboard.OpenClipboard() win32cli ...

  9. python自动化工业_五大python自动化框架学习

    1.Robot Framework 作为最重要的Python测试框架之一,Robot Framework主要被用在测试驱动(test-driven)类型的开发与验收中.虽然是由Python开发而来,但 ...

最新文章

  1. iOSSharing #9 | 2019-05-19
  2. 浪潮发布业界最高GPU密度的SR-AI整机柜
  3. Object.defineProperty的理解
  4. HelloX项目github协同开发指南
  5. 小巧优美的ORM框架-doodads
  6. MATLAB中的for循环
  7. 如何关闭139端口及445端口等危险端口
  8. 无连续整数的子集数问题
  9. windows net 命令详解
  10. sxt_(015)_request处理表单数据及乱码
  11. tipask火车头采集器文章和提问发布模块|非免登录
  12. 利用反射动态修改 EasyPoi 导出Excel表格标题名称
  13. 关于数据存储引擎结构,没有比这篇更详细的
  14. 2022-04-07 西安 javaSE(04) 方法可变参数、重载、递归,数组、冒泡排序、二分查找、动态操作,二维数组、jvm内存区域划分
  15. html原生listview,设置 ListView 及其各项的样式 (HTML)
  16. 这家小米生态链公司用AI+学习,重塑儿童手表市场
  17. 如何用C语言画一个高逼格的“心形“?
  18. 移动光猫改桥接,开启telnet
  19. resent = msg.get_all('Resent-Date') AttributeError: 'str' object has no attribute 'get_all'
  20. c语言scanf返回值

热门文章

  1. 工厂模式与超级英雄的那些事儿
  2. Rails的静态资源管理(三)—— 开发环境的Asset Pipelin
  3. Pycharm如何更改运行(run)的快捷键
  4. 智慧旅游景区Web3D可视化GIS综合运营平台
  5. 关于指数函数等价无穷小的小发现!
  6. python 滤镜色卡
  7. 仿真用计算机配置,需要进行仿真,选什么配置的电脑比较好
  8. 姿态估计入门-2020综述《The Progress of Human Pose Estimation: A Survey and Taxonomy of Models Applied in 2D》
  9. pycharm 无法安装第三方库解决方案
  10. 计算机人脸识别算哪个专业,人脸识别属于计算机什么领域