Python之关于量化投资实现代码--根据策略提出的代码--还未完善
# 根据缺口的模式选股买股票
'''
--------------------------------------------
1、总体回测前要做的事情
initialize(context)
1.1、设置策略参数 ----> 全局常量
1.2、设置中间变量 ----> 全局变量
1.3、设置回测条件 ----> JoinQuant额外需要的
2、每天开盘前选股策略 (下面策略,发现这种股,不容错过)
2.1、设置手续费
2.2、设置可行股票池,比如过滤当日停牌股票
2.3、筛选上市满一年的全部A股
2.4、筛选上市发生向上缺口的时点
定义为:今日最低价>昨日最高价,删除涨停的个股
涨幅>5%
2.5、筛选前期盘整阶段,比如20-30个交易日,最高价-最低价/最低价<15%或者标准差较少的
2.6、缺口当日成交量 > 前20个交易日平均成交量的50%,也就是15倍以上。
3、每天交易时
3.1、买入/卖出信号判断
3.2、执行买入/卖出的操作
4、每天收盘
无 --------------------------------------------
关于什么时候卖?
策略有三,第一个就是设置止盈位。也就是不需要追求最高点卖出。
比如你设置一个从最近高点下滑3%(比例自调)的位置作为卖出点。
第二个就是利用技术分析,看重要的压力位,一方面是均线系统的压力,
要看的是日线,周线月线,周期越大,压力越强,其次是前期的高点,
密集成交区,这个区域是深度套牢区,因此可以暂时止盈。
还有就是识技术指标的图,比如看MACD顶背离,这个比较准,KDJ超卖等等。
建议多去分析大盘,80%的股票和大盘会保存一样走势,大盘触顶,个股一般也好不到哪去。
第三就是关注基本面,同行对比,分析当前的股价的PE,以及与同行业的公司来看,
比如营业总收入排第几,净利润排第几,收入增速排第几,它的总市值排在第几。
如果基本面排在行业第10,但是市值排在第一,这就表示高估了。可以择机止盈。 ''' #
import jqdata
import pandas as pd
import datetime as dt
import time '''
================================================================================
总体回测前
================================================================================
'''
# 初始化函数,设定基准等等
def initialize(context):
print '初始化方法'
set_params() # 设置策略常量
set_variables() # 设置中间变量
set_backtest() # 设置回测条件
print '--------------------------------------' #1
#设置策略参数
def set_params():
print '设置策略参数'
g.tc = 15 # 调仓天数
g.num_stocks = 10 # 每次调仓选取的最大股票数量 #
#设置中间变量
def set_variables():
print '设置中间变量'
g.t = 0 # 记录回测运行的天数
g.if_trade = False # 当天是否交易 #
#设置回测条件
def set_backtest():
print '设置回测条件' # 设定沪深300作为基准,就是基准收益
set_benchmark('000300.XSHG') # 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 输出内容到日志 log.info()
log.info('初始函数开始运行且全局只运行一次')
# 过滤掉order系列API产生的比error级别低的log
# log.set_level('order', 'error') ### 股票相关设定 ###
# 股票类每笔交易时的手续费是:买入时佣金万分之三,卖出时佣金万分之三加千分之一印花税, 每笔交易佣金最低扣5块钱
set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock') ## 运行函数(reference_security为运行时间的参考标的;传入的标的只做种类区分,因此传入'000300.XSHG'或'510300.XSHG'是一样的)
# 开盘前运行
run_daily(before_market_open, time='before_open', reference_security='000300.XSHG')
# 开盘时运行
run_daily(market_open, time='every_bar', reference_security='000300.XSHG')
# 收盘后运行
run_daily(after_market_close, time='after_close', reference_security='000300.XSHG') log.set_level('order','error') # 设置报错等级 '''
================================================================================
每天开盘前
================================================================================
2、每天开盘前选股策略 (下面策略,发现这种股,不容错过)
2.1、设置手续费
2.2、设置可行股票池,比如过滤当日停牌股票
2.3、筛选上市满一年的全部A股
2.4、筛选上市发生向上缺口的时点
定义为:今日最低价>昨日最高价,删除涨停的个股
涨幅>5%
2.5、筛选前期盘整阶段,比如20-30个交易日,最高价-最低价/最低价<15%或者标准差较少的
2.6、缺口当日成交量 > 前20个交易日平均成交量的50%,也就是15倍以上。
'''
## 开盘前运行函数
def before_market_open(context):
# 输出运行时间
log.info('函数运行时间(before_market_open):'+str(context.current_dt.time())) print '----每天开盘前要做的事情----' set_slip_fee(context) # 设置滑点与手续费
# g.stocks=get_index_stocks('000300.XSHG') # 设置沪深300为初始股票池
g.stocks=get_index_stocks('000002.XSHG') # 设置000002.XSHG全部上市A股
# 设置可行股票池
g.feasible_stocks = set_feasible_stocks(g.stocks,context) # 给微信发送消息(添加模拟交易,并绑定微信生效)
# send_message('美好的一天~') # 要操作的股票:平安银行(g.为全局变量)
# g.security = '000001.XSHE' #
# 设置可行股票池:过滤掉当日停牌的股票
# 输入:initial_stocks为list类型,表示初始股票池; context(见API)
# 输出:unsuspened_stocks为list类型,表示当日未停牌的股票池,即:可行股票池
def set_feasible_stocks(initial_stocks,context):
# 判断初始股票池的股票是否停牌,返回list
# print '设置可行股票池:过滤掉当日停牌的股票',context.current_dt.day
# print '当前时期%10s' %(context.current_dt.strftime("%Y-%m-%d"))
paused_info = []# 存储对应股票是否停牌的信息数组
liste_Date_info = []# 存储对应的上市时间
# 在股票基本信息表 - STK_STOCKINFO能找到
stock_info = get_all_securities(['stock']); # get_current_data ♠ - 获取当前时间数据
current_data = get_current_data()
print '打印--',initial_stocks
print '再打印--当前时间数据对象返回是空的',current_data for i in initial_stocks:
# i是遍历出来的每个股票的代码
# 然后paused是判断这个股票是否停牌,False表示没有停牌
paused_info.append(current_data[i].paused) # print '获取所有股票数据',stock_info[i].start_date
# 如何获取上市满一年的股票
# 先获取所有股票数据 .start_data
# print '当前时期:%10s--股票上市时期:%10s' %(context.current_dt.strftime("%Y-%m-%d"),stock_info.at[i,'start_date'])
# print '当前时期:%10s--股票上市时期' %((stock_info.at[i,'start_date']-context.current_dt).days)
# 存储上市时间是否满一年,如果满一年为YES
isGoPublicOneYear = calculate_goPublick_OneYear(context.current_dt.strftime("%Y-%m-%d"),str(stock_info.at[i,'start_date']))
liste_Date_info.append(isGoPublicOneYear)
if isGoPublicOneYear == False:
print '上市不满一年的股票%10s:%10s' %(i,stock_info.at[i,'display_name']) df_paused_public_info = pd.DataFrame({'paused_info':paused_info,'liste_Date_info':liste_Date_info},index = initial_stocks)
# print 'df_paused_public_info:\n',df_paused_public_info
unsuspened_stocks = list(df_paused_public_info.index[(df_paused_public_info.paused_info == False) and (df_paused_public_info.liste_Date_info == True)]) # print '最后获得的index',unsuspened_stocks return unsuspened_stocks # 计算当天交易时间是否为上市时间满一年
def calculate_goPublick_OneYear(currentTime,goPublicTime):
currentTimeDate = time.strptime(currentTime,"%Y-%m-%d")
y,m,d = currentTimeDate[0:3] goPublicTimeDate = time.strptime(goPublicTime,"%Y-%m-%d")
y2,m2,d2 = goPublicTimeDate[0:3] # print (dt.datetime(y,m,d)-dt.datetime(y2,m2,d2)).days if ((dt.datetime(y,m,d)-dt.datetime(y2,m2,d2)).days)>366:
return True
else:
return False #
# 根据不同的时间段设置滑点与手续费
# 输入:context(见API)
# 输出:none
def set_slip_fee(context):
print '根据不同的时间段设置滑点与手续费'
# 将滑点设置为0
set_slippage(FixedSlippage(0))
# 根据不同的时间段设置手续费
print '根据不同的时间段设置手续费'
dt=context.current_dt
if dt>datetime.datetime(2013,1, 1):
set_commission(PerTrade(buy_cost=0.0003, sell_cost=0.0013, min_cost=5)) elif dt>datetime.datetime(2011,1, 1):
set_commission(PerTrade(buy_cost=0.001, sell_cost=0.002, min_cost=5)) elif dt>datetime.datetime(2009,1, 1):
set_commission(PerTrade(buy_cost=0.002, sell_cost=0.003, min_cost=5))
else:
set_commission(PerTrade(buy_cost=0.003, sell_cost=0.004, min_cost=5)) '''
================================================================================
每天交易时
================================================================================
'''
## 开盘时运行函数
def market_open(context):
log.info('函数运行时间(market_open):'+str(context.current_dt.time()))
security = g.security
# 获取股票的收盘价
close_data = attribute_history(security, 5, '1d', ['close'])
# 取得过去五天的平均价格
MA5 = close_data['close'].mean()
# 取得上一时间点价格
current_price = close_data['close'][-1]
# 取得当前的现金
cash = context.portfolio.available_cash # 如果上一时间点价格高出五天平均价1%, 则全仓买入
if current_price > 1.01*MA5:
# 记录这次买入
log.info("价格高于均价 1%%, 买入 %s" % (security))
# 用所有 cash 买入股票
# order_value(security, cash)
# 如果上一时间点价格低于五天平均价, 则空仓卖出
elif current_price < MA5 and context.portfolio.positions[security].closeable_amount > 0:
# 记录这次卖出
log.info("价格低于均价, 卖出 %s" % (security))
# 卖出所有股票,使这只股票的最终持有量为0
# order_target(security, 0) '''
================================================================================
每天收盘后
================================================================================
''' ## 收盘后运行函数
def after_market_close(context):
log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))
#得到当天所有成交记录
trades = get_trades()
for _trade in trades.values():
log.info('成交记录:'+str(_trade))
log.info('一天结束')
log.info('##############################################################')
Python之关于量化投资实现代码--根据策略提出的代码--还未完善的更多相关文章
- 推荐学习《Python与量化投资从基础到实战》PDF及代码+《量化投资以Python为工具》PDF及代码
利用python分析量化投资问题是现在研究的热点,推荐两份资料用于学习 <Python与量化投资:从基础到实战>主要讲解如何利用Python进行量化投资,包括对数据的获取.整理.分析挖掘. ...
- python书籍推荐:量化投资:以Python为工具
所属网站分类: 资源下载 > python电子书 作者:mimi 链接:http://www.pythonheidong.com/blog/article/451/ 来源:python黑洞网 内 ...
- 《Python与量化投资:从基础到实战》PDF高清完整版-PDF|网盘下载附提取码
本书主要讲解如何利用Python进行量化投资,包括对数据的获取.整理.分析挖掘.信号构建.策略构建.回测.策略分析等.本书也是利用Python进行数据分析的指南,有大量的关于数据处理分析的应用,并将重 ...
- 量化投资学习笔记01——初识Pyalgotrade量化交易回测框架
年初学习量化投资,一开始想自己从头写,还是受了C/C++的影响.结果困在了计算回测数据那里,结果老也不对,就暂时放下了.最近试了一下python的各个量化投资框架,发现一个能用的——pyalgotra ...
- Python金融应用编程(数据分析、定价与量化投资)
近年来,金融领域的量化分析越来越受到理论界与实务界的重视,量化分析的技术也取得了较大的进展,成为备受关注的一个热点领域.所谓金融量化,就是将金融分析理论与计算机编程技术相结合,更为有效的利用现代计算技 ...
- Python量化投资知识总结贴
Ricequant 量化社区的初衷让各位爱好量化的人士可以碰撞思维,在分享和争辩中学习到有用且实战的量化知识.有赖于各位在社区中贡献满满的干货以及有质量的讨论,从编程入门教学到技术指标再到多因子选股. ...
- 量化投资与Python
目录: 一.量化投资第三方相关模块 NumPy:数组批量计算 Pandas:表计算与数据分析 Matplotlib:图表绘制 二.IPython的介绍 IPython:和Python一样 三.如何使用 ...
- 【转】用Python做股市量化策略投资数据分析
金融量化分析介绍 本文摘要; 金融量化分析介绍 1.什么是金融量化分析 2.金融量化分析可以干什么 3.为什么将python运用于金融 4.常用库简介 1.什么是金融量化分析 从标题中我们可以 ...
- Python与金融量化分析----金融与量化投资
一:金融了解 金融:就是对现有资源进行重新的整合之后,进行价值和利润的等效流通. 金融工具: 股票 期货 黄金 外汇 基金 ............. 股票: 股票是股份公司发给出资人多的一种凭证,股 ...
随机推荐
- windows系统nexus3安装和配置
一.前言 为什么要在本地开发机器上安装nexus?首先声明公司内部是有自己的nexus仓库,但是对上传jar包做了限制,不能畅快的上传自己测试包依赖.于是就自己在本地搭建了一个nexus私服,即可以使 ...
- ORA-01000
A ResultSet object is automatically closed by the Statement object that generated it when that State ...
- 使用SpringSecurity
前几天写了一个SpringBoot对拦截器的使用,在实际项目中,对一些情况需要做一些安全验证,比如在没有登录的情况下访问特定的页面应该解释的拦截处理.这一篇介绍使用SpringSecurity来做简单 ...
- BZOJ.4340.[BJOI2015]隐身术(后缀数组 搜索)
BZOJ \(Description\) 给定两个串\(S,T\)以及一个数\(k\),求\(T\)中有多少个子串,满足和\(S\)的编辑距离不超过\(k\). \(|S|+|T|\leq10^5,\ ...
- 【整理】Java 9新特性总结
距Java 8正式发布三年多时间,Java 9 于2017年9月21日正式发布, 你可能已经听说过 Java 9 的模块系统(讨论的最多的),但是这个新版本还有许多其它的更新. 这里我整理了Java ...
- [CC-ADJLEAF2]Adjacent Leaves
[CC-ADJLEAF2]Adjacent Leaves 题目大意: 给定一棵有根树,考虑从根开始进行DFS,将所有叶子按照被遍历到的顺序排列得到一个序列. 定义一个叶子集合合法,当且仅当存在一种DF ...
- No mapping found for HTTP request with URI [/webapp/] in DispatcherServlet with name 'SpringMVC'
可能有如下几个原因: 1.是否设置了web目录,在IDEA中,web目录是这样的 如果没有设置,按照下面的方法设置: 选中要设置的模块,点击file.project structure,设置web.x ...
- Spring AOP 配置通知方法的时候如何处理方法重载
如何在method属性里指定重载方法中的某一个?
- ReactNative用指定的设备/模拟器运行项目
命令行中React native项目目录下键入react-native run-ios会启动iOS模拟器, 默认是使用iPhone6,如果想要试用其他版本的模拟器则需要在react-native ru ...
- Python3从零开始爬取今日头条的新闻【二、首页热点新闻抓取】
Python3从零开始爬取今日头条的新闻[一.开发环境搭建] Python3从零开始爬取今日头条的新闻[二.首页热点新闻抓取] Python3从零开始爬取今日头条的新闻[三.滚动到底自动加载] Pyt ...