羊驼策略1

基本原理
  • 在本策略中,每天按照收益率从小到大对股票池中的所有股票进行排序,起始时买入num_of_stocks只股票,然后每天在整个股票池中选出收益率前num_of_stocks,如果这些股票已持有,则继续持有,如果未持有则买入,并卖掉收益率不是排在前num_of_stocks的股票
策略实现
  • 选取市盈率在0~20之间的股票,作为待选股(若用所有股票,计算量过于庞大),一共332支股票

  • 初始资金100万,时间段为:2016-01-01~2018-05-01

  • 设置策略参数,初始买入的股票数num_of_stocks,收益率计算所用天数period

  • 其中收益率=昨天的收盘价/period天之前的收盘价

  • 将股票池内的股票按照收益率排序,买入收益率最高的num_of_stocks只股票(num_of_stocks默认为10)各1000股。

  • 之后的每天都将所有股票按收益率排序,如果股票池中有处于收益率前num_of_stocks而未持有的则买入,并卖掉收益率不处于前num_of_stocks的

  • (一天操作股票数量为20)运行截图:

  • (一天操作股票数量为10)运行截图:

代码如下:

# coding: utf-8
# @author: lin
# @date: 2018/11/9import QUANTAXIS as QA
import datetime
import pandas as pd
import time
import matplotlib.pyplot as plt
import numpy as nppd.set_option('max_colwidth', 5000)
pd.set_option('display.max_columns', 5000)
pd.set_option('display.max_rows', 5000)class Alpaca:def __init__(self, start_time, stop_time, n_stock=10, stock_init_cash=1000000, n_days_before=1):self.Account = QA.QA_Account()  # 初始化账户self.Account.reset_assets(stock_init_cash)  # 初始化账户self.Account.account_cookie = 'alpaca'self.Broker = QA.QA_BacktestBroker()self.time_quantum_list = ['-12-31', '-09-30', '-06-30', '-03-31']self.start_time = start_timeself.stop_time = stop_timeself.n_days_before = n_days_beforeself.stock_pool = []self.data = Noneself.ind = Noneself.n_stock = n_stockself.get_stock_pool()def get_financial_time(self):"""得到此日期前一个财务数据的日期:return:"""year = self.start_time[0:4]while (True):for day in self.time_quantum_list:the_financial_time = year + dayif the_financial_time <= self.start_time:return the_financial_timeyear = str(int(year) - 1)@staticmethoddef get_assets_eps(stock_code, the_financial_time):"""得到高级财务数据:param stock_code::param the_financial_time: 离开始时间最近的财务数据的时间:return:"""financial_report = QA.QA_fetch_financial_report(stock_code, the_financial_time)if financial_report is not None:return financial_report.iloc[0]['totalAssets'], financial_report.iloc[0]['EPS']return None, Nonedef get_stock_pool(self):"""选取哪些股票"""stock_code_list = QA.QA_fetch_stock_list_adv().code.tolist()the_financial_time = self.get_financial_time()for stock_code in stock_code_list:# print(stock_code)assets, EPS = self.get_assets_eps(stock_code, the_financial_time)if assets is not None and EPS != 0:data = QA.QA_fetch_stock_day_adv(stock_code, self.start_time, self.stop_time)if data is None:continueprice = data.to_pd().iloc[0]['close']if 0 < price / EPS < 20:  # 满足条件才添加进行排序# print(price / EPS)self.stock_pool.append(stock_code)# 成交量因子def alpaca(self, data):data['yesterday_price'] = 0data['previous_n_price'] = 0data.reset_index(inplace=True)   # 重置后,索引以数字for index, row in data.iterrows():yes_index = index - 1pre_n_index = index - (self.n_days_before+1)if yes_index >= 0:data.loc[index, 'yesterday_price'] = data.loc[yes_index, 'close']if pre_n_index >= 0:data.loc[index, 'previous_n_price'] = data.loc[pre_n_index, 'close']data['yield_rate'] = 0data['yield_rate'] = data['yesterday_price'] / data['previous_n_price']data.set_index(['date', 'code'], inplace=True)return datadef solve_data(self):self.data = QA.QA_fetch_stock_day_adv(self.stock_pool, self.start_time, self.stop_time)self.ind = self.data.add_func(self.alpaca)def run(self):self.solve_data()for items in self.data.panel_gen:today_time = items.index[0][0]one_day_data = self.ind.loc[today_time]      # 得到有包含因子的DataFrameone_day_data['date'] = items.index[0][0]one_day_data.reset_index(inplace=True)one_day_data.sort_values(by='yield_rate', axis=0, ascending=False, inplace=True)today_stock = list(one_day_data.iloc[0:self.n_stock]['code'])one_day_data.set_index(['date', 'code'], inplace=True)one_day_data = QA.QA_DataStruct_Stock_day(one_day_data)  # 转换格式,便于计算bought_stock_list = list(self.Account.hold.index)print("SELL:")for stock_code in bought_stock_list:# 如果直接在循环中对bought_stock_list操作,会跳过一些元素if stock_code not in today_stock:try:item = one_day_data.select_day(str(today_time)).select_code(stock_code)order = self.Account.send_order(code=stock_code,time=today_time,amount=self.Account.sell_available.get(stock_code, 0),towards=QA.ORDER_DIRECTION.SELL,price=0,order_model=QA.ORDER_MODEL.MARKET,amount_model=QA.AMOUNT_MODEL.BY_AMOUNT)self.Broker.receive_order(QA.QA_Event(order=order, market_data=item))trade_mes = self.Broker.query_orders(self.Account.account_cookie, 'filled')res = trade_mes.loc[order.account_cookie, order.realorder_id]order.trade(res.trade_id, res.trade_price, res.trade_amount, res.trade_time)except Exception as e:print(e)print('BUY:')for stock_code in today_stock:try:item = one_day_data.select_day(str(today_time)).select_code(stock_code)order = self.Account.send_order(code=stock_code,time=today_time,amount=1000,towards=QA.ORDER_DIRECTION.BUY,price=0,order_model=QA.ORDER_MODEL.CLOSE,amount_model=QA.AMOUNT_MODEL.BY_AMOUNT)self.Broker.receive_order(QA.QA_Event(order=order, market_data=item))trade_mes = self.Broker.query_orders(self.Account.account_cookie, 'filled')res = trade_mes.loc[order.account_cookie, order.realorder_id]order.trade(res.trade_id, res.trade_price, res.trade_amount, res.trade_time)except Exception as e:print(e)self.Account.settle()Risk = QA.QA_Risk(self.Account)print(Risk.message)# plt.show()Risk.assets.plot()  # 总资产plt.show()Risk.benchmark_assets.plot()  # 基准收益的资产plt.show()Risk.plot_assets_curve()  # 两个合起来的对比图plt.show()Risk.plot_dailyhold()  # 每只股票每天的买入量plt.show()start = time.time()
sss = Alpaca('2017-01-01', '2018-01-01', 10)
stop = time.time()
print(stop - start)
print(len(sss.stock_pool))
sss.run()
stop2 = time.time()
print(stop2 - stop)

[QUANTAXIS量化分析]羊驼策略1相关推荐

  1. [QUANTAXIS量化分析]三因素模型

    基本原理 三因素模型表达式: E(Rit) − Rft = βi[E(Rmt − Rft] + siE(SMBt) + hiE(HMIt) 根据一篇文章,选择三个因子作测试: 财务因子:EPS 成交量 ...

  2. python量化分析数据_Python数据分析_量化分析.pdf

    法律声明  本课件包括:演示文稿,示例,代码,题库,视频和声 音等,小象学院拥有完全知识产权的权利:只限于善意 学习者在本课程使用,不得在课程范围外向任何第三方 散播.任何其他人或机构不得盗版.复制 ...

  3. python量化分析系列之---使用python获取股票历史数据和实时分笔数据

    财经数据接口包tushare的使用(一) Tushare是一款开源免费的金融数据接口包,可以用于获取股票的历史数据.年度季度报表数据.实时分笔数据.历史分笔数据,本文对tushare的用法,已经存在的 ...

  4. 添加布林带择时策略有多便捷!股票量化分析工具QTYX-V2.4.7

    前言 布林带通道(Bollinger Bands)是非常经典的技术指标,常用于研判市场中长期运动趋势. 比如我们以[350, 2,2] 这组长线参数来绘制恒瑞医药.贵州茅台10年行情走势的布林带通道, ...

  5. 如何借助现有股票量化交易平台编写策略和回测分析

    每个交易日的股票都会上涨或者下跌,在这个过程中笔者们偶尔会想针对部分股票进行股价的涨跌幅进行监控,或者自动进行交易,在这个需求前提下,现有券商.股票分析软件都会带有机器人自动交易策略功能,大部分都需要 ...

  6. 线上培训!如何添加自定义形态选股策略!股票量化分析工具QTYX-V2.5.6

    前言 股票分析中选股是很重要的一个环节,特别是随着A股市场的逐步扩容,存量资金有限,主力们会偏重于某些板块和概念去操作,从而出现结构化的上涨行情. 因此,要想资金的使用效率最大化,选股比择时更为重要. ...

  7. 不知如何选股?不知哪种指标策略可靠?量化分析比较ASI、VR、ARBR、DPO、TRIX指标策略收益情况

    前言 从股票市场开始到现在,已经研究出了众多的指标,但是在使用的时候会发现,由于第二天股价的未知波动,指标显示的情况并不一定每次都准确,总是会存在误判的情况.对于这种不可避免的情况而言,我们只能想办法 ...

  8. 不知如何选股?不知哪种指标策略可靠?量化分析比较VRSI、BBIBOLL、WR、BIAS、RSI指标策略收益情况

    前言 从股票市场开始到现在,已经研究出了众多的指标,但是在使用的时候会发现,由于第二天股价的未知波动,指标显示的情况并不一定每次都准确,总是会存在误判的情况.对于这种不可避免的情况而言,我们只能想办法 ...

  9. 不知如何选股?不知哪种指标策略可靠?量化分析比较BBI、MTM、OBV、CCI、PRICEOSC指标策略收益情况

    前言 从股票市场开始到现在,已经研究出了众多的指标,但是在使用的时候会发现,由于第二天股价的未知波动,指标显示的情况并不一定每次都准确,总是会存在误判的情况.对于这种不可避免的情况而言,我们只能想办法 ...

最新文章

  1. 推荐一个非常好用的Chrome扩展应用,用于美化Json字符串
  2. php2018面试题20块,php最新面试题2018届毕业生专享
  3. Android快速阅读依赖的代码,Java Android快速阅读完整文件
  4. udp和tcp是服务器响应,HTTP,TCP,UDP的理解和使用
  5. linux清空文件内容的几种方式与区别
  6. sql中exists替换in的区别
  7. Django博客功能实现—文章评论功能
  8. 用户登录查全表好还是用用户名好_外贸人/货代人不要为海运难过了:请看如何查运价和调配舱位解决缺箱!...
  9. JSR 303 - Bean Validation 简介及使用方法
  10. TensorFlow model
  11. 有效的括号——字符串匹配问题
  12. excel打开空白不显示内容 没有隐藏_办公软件操作技巧097:如何隐藏excel表格中没有数据的空白区域...
  13. 将具体处理交给子类——模板方法模式
  14. fme坐标转换器_利用FME做坐标转换
  15. unity学习笔记-uniwebview3的使用以及一些补充(视频问题已解决)
  16. python英文分词统计词频_Python 分词并统计词频
  17. Dr_can模型预测控制笔记与代码实现
  18. ip地址解析,ip归属地识别
  19. win10 更新计算机时间,win10更新时间太长怎么回事_windows10更新时间太久解决教程...
  20. ps最大兼容 计算机一级,Photoshop最大兼容是什么意思?最大兼容使用解析

热门文章

  1. 矩阵中的entries是什么
  2. 因为计算机丢失user32.dll,Win7系统出现无法定位动态链接库user32.dll错误提示解决方法...
  3. 编程达人海哥c语言,编程达人 我在写海哥初级班39课作业的时候遇到了问题,希望有兄弟帮忙解答一下...
  4. 深入浅出Docker 读书笔记(九)
  5. 2.10 zio入门——总结
  6. Metropolis Method Condition Derivation
  7. 微带线与带状线的区别
  8. HFSS 快速建立微带线
  9. 商场抽奖软件 android,召唤抽奖系统3.0正式版
  10. python vimdiff_技巧:Vimdiff 使用