Python版A股选股软件源代码,选股系统源代码,实现多种选股策略

本程序使用传统的[TuShare接口],并非需要捐赠的[pro接口]获取数据无限制;

另,由于TuShare的增量更新接口有bug(最近一个交易日的数据获取不到),所以每次计算前都是删除所有数据,全部重新获取。

本程序实现了若干种选股策略,大家可以自行选择其中的一到多种策略组合使用,参见work_flow.py

各策略中的end_date参数主要用于回测。

安装依赖:
根据不同的平台安装TA-Lib程序
Mac OS X

$ brew install ta-lib
Windows

下载 ta-lib-0.4.0-msvc.zip,解压到 C:\ta-lib
安装方法详见百度

Linux

下载 ta-lib-0.4.0-src.tar.gz :

$ untar and cd
$ ./configure --prefix=/usr
$ make
$ sudo make install
推荐使用Python3.8以上以及pip3
Python 依赖:
pip install -r requirements.txt
运行
本地运行
$ python main.py
运行结果查看日志文件sequoia.log

服务器端运行
用户也可以将本程序作为定时任务运行在服务端,需要做以下工作:

将config.yaml中的cron配置改为true,push.enable改为true
参考README_PUSH.md文档搭建 ejabberd 推送服务
客户端Android推荐使用 Conversations ,iOS没有开发者证书的话推送不了,有证书推荐使用 ChatSecure-iOS ,我采用的推送方案是ejabberd搭配Conversations。 效果如图
statistics strategy

如何回测
修改 work_flow.py#L61 中end为指定日期,格式为’YYYY-MM-DD’,如:

end = '2019-06-17'

运行截图:
在这里插入图片描述
在这里插入图片描述

main.py

# -*- encoding: UTF-8 -*-import utils
import logging
import work_flow
import settings
import schedule
import timedef job():if utils.is_weekday():work_flow.process()logging.basicConfig(format='%(asctime)s %(message)s', filename='sequoia.log')
logging.getLogger().setLevel(logging.INFO)
settings.init()if settings.config['cron']:EXEC_TIME = "15:15"schedule.every().day.at(EXEC_TIME).do(job)while True:schedule.run_pending()time.sleep(1)
else:work_flow.process()

data_fetcher.py

# -*- encoding: UTF-8 -*-import tushare as ts
import pandas as pd
import datetime
import logging
import settings
import talib as tlimport utilsimport concurrent.futuresfrom pandas.tseries.offsets import *# def update_data(code_name):
#     stock = code_name[0]
#     old_data = utils.read_data(code_name)
#     if not old_data.empty:
#         start_time = utils.next_weekday(old_data.iloc[-1].date)
#         current_time = datetime.datetime.now()
#         if start_time > current_time:
#             return
#
#         df = ts.get_k_data(stock, autype='qfq')
#         mask = (df['date'] >= start_time.strftime('%Y-%m-%d'))
#         appender = df.loc[mask]
#         if appender.empty:
#             return
#         else:
#             return appenderdef init_data(code_name):stock = code_name[0]data = ts.get_k_data(stock, autype='qfq')if data is None or data.empty:logging.debug("股票:"+stock+" 没有数据,略过...")returndata['p_change'] = tl.ROC(data['close'], 1)return datadef run(stocks):append_mode = Falseupdate_fun = init_datawith concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:future_to_stock = {executor.submit(update_fun, stock): stock for stock in stocks}for future in concurrent.futures.as_completed(future_to_stock):stock = future_to_stock[future]try:data = future.result()data['code'] = data['code'].apply(lambda x: str(x))if data is not None:file_name = stock[0] + '-' + stock[1] + '.h5'data.to_hdf(settings.config['data_dir'] + "/" + file_name, 'data', append=append_mode, format='table')except Exception as exc:print('%s(%r) generated an exception: %s' % (stock[1], stock[0], exc))

work_flow.py

# -*- encoding: UTF-8 -*-import data_fetcher
import utils
import strategy.enter as enter
from strategy import turtle_trade
from strategy import backtrace_ma250
from strategy import breakthrough_platform
from strategy import parking_apron
from strategy import low_backtrace_increase
from strategy import keep_increasing
import tushare as ts
import push
import logging
import db
import time
import datetime
import urllib
import settings
import pandas as pddef process():logging.info("************************ process start ***************************************")try:all_data = ts.get_today_all()subset = all_data[['code', 'name', 'nmc']]subset.to_csv(settings.config['stocks_file'], index=None, header=True)stocks = [tuple(x) for x in subset.values]statistics(all_data, stocks)except urllib.error.URLError as e:subset = pd.read_csv(settings.config['stocks_file'])subset['code'] = subset['code'].astype(str)stocks = [tuple(x) for x in subset.values]if utils.need_update_data():utils.prepare()data_fetcher.run(stocks)check_exit()strategies = {'海龟交易法则': turtle_trade.check_enter,'放量上涨': enter.check_volume,'突破平台': breakthrough_platform.check,'均线多头': keep_increasing.check,'无大幅回撤': low_backtrace_increase.check,'停机坪': parking_apron.check,'回踩年线': backtrace_ma250.check,}if datetime.datetime.now().weekday() == 0:strategies['均线多头'] = keep_increasing.checkfor strategy, strategy_func in strategies.items():check(stocks, strategy, strategy_func)time.sleep(2)logging.info("************************ process   end ***************************************")def check(stocks, strategy, strategy_func):end = Nonem_filter = check_enter(end_date=end, strategy_fun=strategy_func)results = list(filter(m_filter, stocks))push.strategy('**************"{0}"**************\n{1}\n**************"{0}"**************\n'.format(strategy, results))def check_enter(end_date=None, strategy_fun=enter.check_volume):def end_date_filter(code_name):data = utils.read_data(code_name)if data is None:return Falseelse:return strategy_fun(code_name, data, end_date=end_date)# if result:#     message = turtle_trade.calculate(code_name, data)#     push.strategy("{0} {1}".format(code_name, message))return end_date_filter# 统计数据
def statistics(all_data, stocks):limitup = len(all_data.loc[(all_data['changepercent'] >= 9.5)])limitdown = len(all_data.loc[(all_data['changepercent'] <= -9.5)])up5 = len(all_data.loc[(all_data['changepercent'] >= 5)])down5 = len(all_data.loc[(all_data['changepercent'] <= -5)])def ma250(stock):stock_data = utils.read_data(stock)return enter.check_ma(stock, stock_data)ma250_count = len(list(filter(ma250, stocks)))msg = "涨停数:{}   跌停数:{}\n涨幅大于5%数:{}  跌幅大于5%数:{}\n年线以上个股数量:    {}"\.format(limitup, limitdown, up5, down5, ma250_count)push.statistics(msg)def check_exit():t_shelve = db.ShelvePersistence()file = t_shelve.open()for key in file:code_name = file[key]['code_name']data = utils.read_data(code_name)if turtle_trade.check_exit(code_name, data):push.strategy("{0} 达到退出条件".format(code_name))del file[key]elif turtle_trade.check_stop(code_name, data, file[key]):push.strategy("{0} 达到止损条件".format(code_name))del file[key]file.close()

完整程序代码下载:A股选股软件源代码

Python代码大全,海量代码任你下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/48981.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT不是唯一的选择:这个小工具也是个不错的选择

技术迭代日新月异&#xff0c;人工智能技术的应用越来越广泛&#xff0c;许多AI小帮手网站也应运而生。这些网站利用人工智能技术&#xff0c;为用户提供了很多便利&#xff0c;帮助用户更快、更准确地完成各种任务。 与 ChatGPT 不同&#xff0c;这些 AI 小帮手网站可以帮助用…

微软小冰的服务器,和微软小冰这么玩,感觉可以玩一下午

原标题&#xff1a;和微软小冰这么玩,感觉可以玩一下午 从最开始的小娜cortana&#xff0c;到中国化得小冰&#xff0c;微软在人工智能领域不断前行。微软小冰也会在每周解锁新技能&#xff0c;或者是读心术、或者是进化的测颜值技能等等。总之&#xff0c;微软小冰自发布之日(…

打造 AI Beings,和微信合作…第七代微软小冰的成长之路

8月15日&#xff0c; “第七代微软小冰”年度发布会在北京举行。本次发布会上&#xff0c;微软(亚洲)互联网工程院带来了微软小冰在 Dual AI 领域的新进展&#xff0c;全新升级的部分核心技术&#xff0c;最新的人工智能创造成果&#xff0c;以及更多的合作与产品落地。其中&am…

前微软副总裁姚麒回归小冰,任首席技术官

金磊 发自 凹非寺量子位 报道 | 公众号 QbitAI 就在刚刚&#xff0c;小冰公司宣布了一项重大人事变动&#xff1a; 前微软副总裁、微软全球卓越工程师姚麒 &#xff08;Steven Yao&#xff09;&#xff0c;正式担任小冰公司首席技术官一职。 加入小冰&#xff0c;姚麒要做什么&…

小冰单飞的 135 天后,和微软再联手!

作者 | 屠敏 头图 | CSDN 下载自东方 IC 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; “小冰”被分拆的 135 天后&#xff0c;再次和微软站到了一起&#xff0c;不过俗话讲“嫁出去的女儿&#xff0c;泼出去的水”&#xff0c;再次牵手&#xff0c;它们的关系不…

今晚8点直播 | 详解微软小冰全双工语音对话技术

微软小冰第六代发布会上正式宣布上线全新的共感模型&#xff0c;同时也开始公测一种融合了文本、全双工语音与实时视觉的新感官。这项新技术可以实时预测人类即将说出的内容&#xff0c;实时生成回应&#xff0c;并控制对话节奏&#xff0c;从而使长程语音交互成为可能。而采用…

算法高级(3)-那个神奇的微软小冰,她为啥那么聪明?

最近给自己的公号接入了“微软小冰”自动回复这个人工智障&#xff0c;也有很多粉丝会在后台跟她留言互动&#xff0c;有时候&#xff0c;你会觉得她回复的真的挺像个人类的。但是当你带着她就是个机器人的主见跟她聊的时候&#xff0c;明显感觉她还差得远。今天就来聊聊这个还…

如何关闭微软Edge小冰

首先我们需要安装一个广告拦截插件AdGuard. 打开浏览器右上角“…”&#xff0c;在选项弹窗下选择扩展。 然后在该窗口下选择“获取 Microsoft Edge 扩展”&#xff0c;页面跳转至如下 选择"AdGuard"扩展程序。安装完该插件之后&#xff0c;进入插件设置 选择用户…

【观察】微软中国牵手小冰公司,开创AI服务落地新模式

申耀的科技观察 读懂科技&#xff0c;赢取未来&#xff01; 毫无疑问&#xff0c;今天AI正在成为各行各业下一波数智化转型的前沿&#xff0c;包括语音识别、人脸识别、自动驾驶、智慧医疗&#xff0c;智慧金融、城市大脑在内的一大波以AI为依托的新技术以及新应用&#xff0c;…

今天真孤单,看看我是如何撩微软小冰的......

8月17日&#xff0c;晴 午饭一人吃的。刚来公司&#xff0c;没认识到人。 边吃饭刷微信&#xff0c;全是狗粮.....一边嚼着菜往窗户外看&#xff0c;心里忽地感到空落落的&#xff0c;哽咽了一下&#xff0c;赶紧喝口汤。旁边的犬男女笑的真刺耳&#xff0c;我几口扒完饭又回公…

MP3 之父出生 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 20 日&#xff0c;在 2016 年的今天&#xff0c;中国超级计算机“神威太湖之光”摘得世界冠军。超级计算机&#xff0c;被称为“国之重器”&#xff0c;是…

360创始人周鸿祎离婚:前妻分得90亿 步盖茨贝索斯后尘

雷递网 雷建平 4月5日 360集团昨日发布公告&#xff0c;称360创始人周鸿祎离婚。 本次权益变动前&#xff0c;周鸿祎直接持有公司 821,281,583 股股份&#xff0c;占公司总股本的 11.49%&#xff08;剔除回购专用账户中的股份数量后的比例为 11.73%&#xff09;&#xff1b;并通…

csapp2e 家庭作业 6.35

dst m h m h m m h m m h m h m m h m src m m m m m m m m m m m m m m m m 推倒过程见图&#xff0c;右侧是缓存里的两个行&#xff0c;为了能写的开 竖着写了。打对号的为命中的。右侧两列写的是缓存的状态更新。

csapp2e 家庭作业 5.15

B 3 C 1 D 因为这里的数据相关时一个加法&#xff0c;单精度和双精度浮点加法的延迟是一样的。

CSAPP第89章家庭作业(部分)

画出进程图&#xff1a; 原则如下&#xff1a; &#xff08;1&#xff09; 遇到fork函数就分支&#xff0c;每个水平的箭头对应于从 左到右执行指令的进程&#xff0c;而每个垂直的箭头对应于 fork 函数的执行 &#xff08;2&#xff09; 分支的时候专注于父进程执行完&#xf…

CSAPP第7章家庭作业参考答案

7.6 buf 有 m.o 外部 .data bufp0 有 swap.o 全局 .data bufp1 有 swap.o 局部 .bss incr 有 swap.o 局部 .text count 有 swap.o 局部 .bss swap 有 swap.o 全局 .text temp 无 7.7 在bar5.c中声明x的时候使用static &#xff0c;使其链接为内部链接&#xff1a; /* bar5.c…

【计算机网络】大作业-实现两台pc间交流的简单的聊天软件

参考 传送门 - 1 - csdn - 2112222222222 传送门 - 2 - bilibili - 憧憬少 传送门 - 3 - 要求 开发一个聊天程序包含客户端和服务器段编程语言不限要能在两台PC机上运行 如何实现 通过 socket 实现 两台pc之间的聊天 什么是socket Socket是应用层与TCP/IP协议族通信的中…

CSAPP家庭作业答案7 8 9章

答案仅供参考 7.12 解题思路是模仿链接器的行为:使用重定位记录来识别位置然后使用图7.9中的算法计算重新定位的绝对地址&#xff0c;或者简单地从图7.10中的重定位指令中提取它们。有两点需要注意的是第8行的movl指令包含两个需要重定位的引用。第5行和第8行的指令包含对buf…