本程序使用传统的[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代码大全,海量代码任你下载

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

  1. Python版自动组卷评卷考试系统,具有考试定时、自动组卷、客观题自动判卷、自动评分和考试界面设计功能

    一.实验项目名称: 自动组卷评卷考试系统 二.实验内容 用Python语言编程实现自动组卷评卷考试系统,软件主要功能包括:从题库中随机抽取试题自动组成试卷(满分100分):实现考生考试答题操作界面:实 ...

  2. Python教学管理系统、学生选课考试系统源代码,基于Django

    项目介绍 系统主要功能包括, 院系管理员发布课程信息,教师选课,指定课程教材并编写教材大纲和学时数,然后根据教材编写每周教学内容:随后学生进行选课,其中学生选课是根据教师选课后的课程号进行选课,然后院 ...

  3. 基于python的在线考试系统-基于 Python 的电子教室和在线考试系统源代码

    Python 是近年倍受推崇的语言,这里介绍的是两个与教学相关的开源项目.一个是用于计算机教室管理的电子教室系统,第二个是与之关联的在线考试系统,当然,这个系统也可以单列出来.这两个项目还只是个雏形, ...

  4. php移动商城源码,GitHub - longmix/shopmallmobile: 商城系统源代码移动商城版本,完整的服务器调用,商品展示/用户中心/订单/支付/购物车/功能齐全...

    免费商城软件源代码 商城系统源代码是延誉宝电商系统的移动商城版本,包含了完整的服务器调用,商品展示/用户中心/订单/支付/购物车/功能齐全. 与网上下载的各类代码和二次开发复杂商城不同,延誉宝免费商城 ...

  5. Python版简易银行管理系统源代码,银行管理系统python代码、银行自助提款系统

    Python版简易银行管理系统源代码,银行管理系统python代码,实现开户.账户查询.存取款.转账.改密.锁定.解锁.补卡.销户等银行管理操作.账户信息存在allusers.txt中,通过该文件的读 ...

  6. 股软分析系统源代码,股软开发,行情写库程序

    沪深,外汇,期货数据开发,写库程序,股软源代码 1.类通达信分析系统源代码,类分析家类分析系统源代码 请登录:www.8858518.net 下载演示版本 行情服务器端OEM ,源代码出售. 2. 实 ...

  7. Python版名片管理系统源代码

    Python版名片管理系统,功能: 新增名片(记录用户的姓名,电话,QQ,邮箱): 显示所有名片: 查询名片: 查询成功后可以修改,删除名片 运行截图: cards_main.py :程序的入口,完整 ...

  8. Python版打字练习软件源代码,键盘练习软件源代码,含娱乐模式和训练模式

    Python版打字练习软件源代码,键盘练习软件源代码,含娱乐模式和训练模式 按ESC切换左手练习,右手练习.双手练习 完整代码下载地址:Python版打字练习软件源代码 核心代码: import ra ...

  9. Python版经典小游戏愤怒的小鸟源代码,基于pygame+pymunk

    Python版经典小游戏愤怒的小鸟源代码,基于pygame+pymunk 程序依赖:pygame2.0.1, pymunk5.5.0 直接运行main.py 完整代码下载地址:Python版经典小游戏 ...

最新文章

  1. SQL Server自定义字符串分割函数——Split
  2. java对象的参数传递,对象类型的参数传递是什么意思
  3. linux elf格式 全局指针表got call跳转表plt 简介
  4. ajax的核心有哪些,ajax的核心
  5. 主动防御型杀毒软件的技术探讨
  6. opengl三维图形绘制_Python matplotlib绘图示例 - 绘制三维图形
  7. chrome html 读写文件路径,Chrome浏览器支持直接读写本地文件了
  8. UITabBarController的一些基础设置
  9. Java基础篇:什么是线程优先级?
  10. 分享一个强大的4K/8K超高清视频下载器
  11. Head First 系列书籍分享,Head First Python (中文版·第2版),Head First Java(中文版):第二版——涵盖Java 5.0...
  12. 电压基准和稳压电源-BUCK\BOOST原理讲解
  13. CleanMyMac X2023最新版安装图文详解
  14. (附源码)springboot跨境电商系统 毕业设计 211003
  15. vue2.0怎么渲染html,vue采坑之——vue里面渲染html 并添加样式
  16. 查看jvm进程cpu火焰图工具
  17. 电脑使用android手机摄像头,电脑怎么使用安卓手机摄像头 电脑使用手机摄像头的方法-电脑教程...
  18. Xxl Job Helloworld
  19. Mysql5.7卸载
  20. Centos7修复OpenSSL拒绝服务漏洞(CVE-2022-0778)

热门文章

  1. 综述二 | 2020年最全的目标检测大综述(附下载链接)
  2. 评分卡--toad--scorecard函数,调整评分以整数形式输出
  3. 货运列车目标检测实验记录
  4. 基于JavaGUI实现的外卖点餐订餐平台系统
  5. 【学习记录】镭神激光雷达与PC机的NTP同步
  6. 微信红包php算法,基于PHP微信红包的算法探讨
  7. android无障碍服务网页,android无障碍
  8. 驰为平板装Android,驰为VX8 3G Win8刷安卓固件教程
  9. 多机docker部署fisco-bcos区块链
  10. 面试官:Redis集群有哪些方式,Leader选举又是什么原理呢?