羊驼策略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. 基于U-Net图像分割的划痕缺陷分割(课程设计)
  2. JS 点击弹出图片/ 仿QQ商城点击左右滚动幻灯片/ 相册模块,点击弹出图片,并左右滚动幻灯片...
  3. 郑州网络推广教你如何“悄悄”做网站SEO,惊艳竞争对手?
  4. 读书笔记12:观察者模式
  5. leetcode1053. 交换一次的先前排列(贪心算法)
  6. c++ file* 句柄泄漏_C++核心指南:P.8 勿泄漏任务资源
  7. python文件分块读取_Python多进程分块读取超大文件的方法
  8. python中的while循环语句的数组循环_while循环
  9. 基础篇:6.6)形位公差-基准 Datum
  10. 手把手教你封装属于自己的Windows7安装镜像
  11. 对于react的json.parse解析错误
  12. 计算机安装重装出现错误,如何解决重装系统失败无法开机进入系统的问题
  13. 【转】objective-c基本数据类型之输出格式符
  14. MySQL 第四章索引与完整性约束
  15. 2021-01-09T18:00:00.000Z格式时间存数据库,字段类型为datetime,直接出现报错
  16. PAT 1069.微博转发抽奖
  17. 计算机组成原理课内实验,【计算机基础论文】计算机组成原理课程实验教学改革(共2885字)...
  18. 悟空crm php 部署,悟空crm开源版本环境搭建
  19. 华为桌面云 服务器可以虚拟多少,一个桌面云服务器支持多少用户
  20. 验证https证书过期时间

热门文章

  1. 视频的基本参数及H264编解码相关概念
  2. 2021普华集团数字经济年度盛典在三亚盛大举行
  3. docker虚拟化容器技术
  4. bootstrap4笔记
  5. MyEclipse 8.5 6.x 最新注册码(有效期至2016年)
  6. svg动画 html,30个超棒的 SVG 动画展示【上篇】
  7. 统信 Deepin为什么要摆脱Ubuntu和Debian?
  8. gsoap 的好网站 http://www.cs.fsu.edu/~engelen/soapexamples.html
  9. 解决Steam需要在线进行更新。请确定您的网络连接正常,然后重试。的问题
  10. socket中的TCP编程(调用免费聊天的机器人实现自动回复)