虽然说是学习的第一个指标,但是其实在上个月我是学过量化的,当时第一个学习的是均线策略,所以这里指的是我在网上开始分享式学习的第一个策略。

这里为什么选择EMV作为第一个策略进行学习呢,主要还是觉得相比均线这种只考虑价格的指标来说,EMV是兼顾量的指标可能更能真实反映市场行情。

为更好地编写代码和理解指标这里复习一下EMV的公式:首先EMV是由EM计算出来的,短均线和长均线组成。EM = ((当日最高价+当日最低价)/2 - (昨日最高价+昨日最低价)/2)*(当日最高-当日最低)/成交量。

接下来一步一步来:

1、定义获取本地股票数据的函数

def get_stock_data(inport_code, start_date=None, end_date=None,usecols=('trade_date','open','high','low','close','pre_close','pct_chg','vol','amount'),recover_type='后复权'):'''读取股票行情数据(只支持price):param inport_code: 股票代码(纯数字字符串):param start_date: 开始时间:param end_date: 截止时间:param usecols: 获取的列:param recover_type: 复权类型:return: '''# 判断所属市场if inport_code.startswith('6'):  # 判断市场标识market_code = inport_code + '.SH'else:market_code = inport_code + '.SZ'# 读取文件file_root = os.path.join(r'G:\PycharmProjects\DeltaTrader\data\data_tushare\{}.csv'.format(market_code))data = pd.read_csv(file_root, parse_dates=['trade_date'], index_col='trade_date', usecols=usecols)# 对起始时间参数进行处理if start_date is not None: start_date = datetime.datetime.strptime(start_date, '%Y-%m-%d')else:start_date = data.index[0]# 对结束时间参数进行处理if end_date is not None: end_date = datetime.datetime.strptime(end_date, '%Y-%m-%d')else:end_date = data.index[-1]# 获取指定日期的数据data = data.loc[start_date:end_date,]# 计算复权价data = cal_recover_price(data, recover_type)return data
if __name__ == '__main__':# passdf = get_stock_data('000001','2010-01-01')print(df)  

2、接下来计算指标并计算买卖信号(由于成交量会受到除权的影响,所以我采用成交额替代成交量,不合适的话可以指出来哪里有问题。)

3、根据买卖信号计算每日收益率

def account(data, slippage=1/1000, commision_rate=1/1000):'''根据每日仓位计算总资产的 日收益率:param df::param slippage: 滑点 默认千分一:param commision_rate: 手续费 默认千分一:return: df['capital_rtn']'''# 生成副本data = data.copy()data['capital_rtn'] = np.nandata.iloc[0, -1] = 0# 当加仓时,计算当天的计算曲线 capital_rtn = 昨天的position在今天的涨幅 + 今天开盘新买入position涨幅(扣除手续费)data['capital_rtn'] = np.where(data['position'] > data['position'].shift(1),data['position'].shift(1) * data['pct_chg'] * 0.01 + \(data['position'] - data['position'].shift(1)) * \(data['close'] / data['open'] - 1) * (1 - slippage - commision_rate),data['capital_rtn'])# 当减仓时,计算当天的计算曲线 capital_rtn = 今天的position的涨幅 + 今天开盘卖出position在今天的涨幅(扣除手续费)data['capital_rtn'] = np.where(data['position'] < data['position'].shift(1),data['position'] * data['pct_chg'] * 0.01 + \(data['position'].shift(1) - data['position']) * \(data['open'] / data['close'].shift(1) - 1) * \(1 - slippage - commision_rate),data['capital_rtn'])# 当仓位不变时,当天capital_rtn = 当天的ptc_change*positiondata['capital_rtn'] = np.where(data['position'] == data['position'].shift(1),data['position'] * data['pct_chg'] * 0.01, \data['capital_rtn'])return data

4、根据资产日收益率计算年化收益率,为了规避停牌造成的影响这里要用市场的交易日历为计算,另外顺便计算最大回撤。

def market_calendar():# 获取交易日历calendars = pd.read_csv(r'G:\PycharmProjects\DeltaTrader\data\finance\2021-08-07_tsc.csv',index_col='cal_date', parse_dates=['cal_date'])return calendarsdef annual_return(date_line, capital_line):'''计算年化收益率:param date_line: 时间序列:param capital_line: 账户价值序列:return:'''# 将数据合并为DateFrame,并按日期排列data = pd.DataFrame({'capital':capital_line}, index=date_line)# 计算年化收益率calendars = market_calendar()periods = data.index # 获取个股交易日days = calendars.loc[periods[0]:periods[-1]] # 计算股市开市天数annual = np.divide(data.iloc[-1]['capital'], data.iloc[0]['capital']) ** (243/len(days.index))-1return annualdef max_drawdown(date_line, capital_line):'''计算最大回撤:param date_line: 时间序列:param capital_line: 账户价值序列:return: 返回最大回撤的值'''# 将数据合并为DateFrame,并按日期排列data = pd.DataFrame({'date': date_line, 'capital': capital_line})# 计算最大净值data['max_here'] = data['capital'].expanding().max()# 计算当日回撤data['dd_here'] = data['capital']/data['max_here']# 找的最大化回撤的 结束时间 和 值end_date, remains = tuple(data.sort_values('capital',ascending=False).iloc[0][['date', 'dd_here']])# 找到最大回撤开始时间start_date = data.sort_values('capital').iloc[0]['date']# print(f'最大回撤为:{(1-remains)*100}%\n开始时间:{start_date}\n结束时间:{end_date}')return 1-remains

5、最后写一段代码,对所有股票进行回撤

if __name__ == '__main__':# 遍历所有股票文件获取文件名,得到股票代码for root, dirs, files in os.walk(r'G:\PycharmProjects\DeltaTrader\data\data_tushare'):# 结果容器result = []for code in files:try:# 获取对应股票数据df = dt.get_stock_data(code.split('.', maxsplit=1)[0])# 剔除空数据except IndexError as e:print(e, code)continue# 剔除数据长度不满一年半if len(df.index) < 366:continueprint(code)# 策略数据容器re = pd.DataFrame(columns=['code', 'start', 'param', 'strategy_rtn', 'stock_rtn', 'strategy_ma', 'stock_ma', 'excessive_rtn'])# 计算股票累计收益df['stock_capital'] = (df['pct_chg'] * 0.01 +1).cumprod()# 调整parami = 0for p in range(5,27,2):for q in range(5,27,2):if p >= q:continue# 计算交易信号df_stg = EMV2(df, p, q)# 计算策略单次收益df_stg = account(df_stg)# 计算策略资金曲线df_stg['capital'] = (df_stg['capital_rtn']+1).cumprod()# 获取时间序列 和 股票and策略 资金曲线date_line = df_stg.indexcapital_line = df_stg['capital']stock_total = df_stg['stock_capital']# 策略的年化收益strategy_rtn = annual_return(date_line, capital_line)# 股票的年化收益stock_rtn = annual_return(date_line, stock_total)# 股票最大回撤stock_md = max_drawdown(date_line, stock_total)# 策略最大回撤strategy_md = max_drawdown(date_line, capital_line)# ========根据资金曲线计算相关评价指标========re.loc[i, 'code'] = df_stg.iloc[0]['ts_code']re.loc[i, 'start'] = df_stg.index[0]re.loc[i, 'param'] = str(p)+'_'+str(q)re.loc[i, 'strategy_rtn'] = strategy_rtnre.loc[i, 'stock_rtn'] = stock_rtnre.loc[i, 'strategy_md'] = strategy_mdre.loc[i, 'stock_md'] = stock_mdre.loc[i, 'excessive_rtn'] = re.loc[i, 'strategy_rtn'] - re.loc[i, 'stock_rtn']i +=1print(f'循环{i}遍')# 获取最优参数和数据re.sort_values('excessive_rtn', ascending=False, inplace=True)result.append(re.iloc[0])# 合并表格re = pd.concat(result, ignore_index=True, axis=0)re.to_csv(r'G:\PycharmProjects\DeltaTrader\data\example\EMV.csv',header=False, index=False, mode='a')

搞定!由于数据量特别大,这里就不贴结果了,感兴趣的可以去看下这个帖子:https://blog.csdn.net/xingbuxing_py/article/details/78545509?spm=1001.2014.3001.5501

自学量化投资之旅-学习第一个策略EMV指标相关推荐

  1. 自学量化投资之旅 - 建立股票数据库 (下)

    路过的大兄弟好,我是阿尔法电波脑.昨天我已经把要获取的股票代码,以及上市退市日期的数据整理到本地了.今天我将根据这份列表,批量获取股票数据,建立自己的本地股票数据库.那正式开始吧! 功能:根据股票列表 ...

  2. 自学量化投资之旅 - 建立股票数据库 (拓展)

    今天在学习策略开发的时候发现一个问题,下面这张是获取的股票数据 可以看出日期是按照降序进行排列的,这对后期策略的开发不是很友好.当然如果在读取数据后再进行升序的处理也是可以的哈,不过我个人是比较倾向于 ...

  3. 自学量化投资之旅-计算股票的复权价

    在学习策略的开发之前,有一个必须要做的事,那就是对股票价格进行复权.tushare有提供复权数据的,不过鉴于很多软件对于复权处理都存在一些问题,(不知道tushare是否和其他的软件不一样,欢迎指正) ...

  4. 宅家自学量化投资 - 建立股票数据库 (上)

    路过的大兄弟好,我是阿尔法电波脑,现在是宅家学习量化投资的73天. 最近这一个月有点松懈了哈,这个月开始想改变一下之前闭门造车式的学习,用通俗易懂的话在B站.CSDN上分享自己的所学所思所想,并用采用 ...

  5. 量化投资:第3节 滑点策略与交易手续费

    作者: 阿布 阿布量化版权所有 未经允许 禁止转载 abu量化系统github地址(欢迎+star) 本节ipython notebook 上一节使用AbuFactorBuyBreak和AbuFact ...

  6. 量化投资-基本面组合-10大基本面策略的简单组合

    策略: 1.从上面介绍的10几个策略中,选出来10个策略,每个品种使用50万资金,每次交易一手 2.手续费万一,3元或者10元每手,滑点各一跳 3.从2008年1月1日或者开始上市日期最近的开始回测 ...

  7. 量化投资_止盈止损在策略中的有效性(改编)

    何时卖出恐怕是我们遇到最多的一个问题,而止盈与止损又是卖出最常见的两个策略. 我们假设最常见的理论有四种:随机游走(分为正态分布与对数正态分布).趋势理论与均值回归理论,来一一验证. 第一种:随机游走 ...

  8. 量化投资学习之路——搜集资料篇———入门文章+入门书籍+量化知识社区

    本文为量化投资小白的学习之旅第一篇,主要介绍量化投资领域的一些资料和学习平台.文章的内容会根据自己的学习进程不定期更新.文章分为三个部分 1.初步了解量化投资 2.量化投资姿势社区 3.入门书籍 1. ...

  9. 如何利用ChatGPT学习量化投资?

    引言 最近,ChatGPT持续火了很长时间,占领各大热点和头版头条,成为A股开年以来最大的热点之一.ChatGPT是OpenAI开发的一种语言生成模型,可以理解为智能问答机器人.最近围绕量化投资在上面 ...

  10. 如何使用强化学习进行量化投资?

    如何使用强化学习进行量化投资? 文章目录 如何使用强化学习进行量化投资? 直观使用强化学习进行量化投资 使用强化学习进行量化投资 量化投资强化学习流程图 行为决定(买入.卖出.持有) 执行行为 批量生 ...

最新文章

  1. 一个小团队使用的知识管理方案与工具
  2. JavaWeb 使用nginx负载均衡
  3. 一名优秀的初创企业员工怎么做好工作计划
  4. 服务器无法执行该事务_分布式事务、MVCC、事务隔离级别
  5. 华为手机像素密度排行_2020上半年手机芯片十大排行:华为麒麟990第四,骁龙865第一...
  6. virtualbox安装ubuntu时需要全屏显示的解决办法
  7. Android Studio之package org.junit does not exist解决办法
  8. 通汇手机为何卖得那么红火
  9. Spring MVC访问不到静态资源
  10. Extracting Text From Image
  11. 外行人都能看懂的SpringCloud
  12. mac上启用tftp服务器
  13. 四方支付系统,聚合平台搭建
  14. 尚硅谷微服务分布式电商项目《谷粒商城》基础篇学习总结
  15. 第四届泰迪杯数据挖掘挑战赛B题数据预处理-数据导入(Matlab)
  16. ubuntu挂载windows分区
  17. ubuntu16如何开wifi
  18. 【故障分析】基于主成分分析实现三容水箱故障诊断附matlab代码
  19. IndexedDB踩坑必须注意点!!!
  20. “专精特新”背后的京东动力

热门文章

  1. Golang源码探索----GC的实现原理(3)
  2. SharePoint Project导入(mpp文件导入)
  3. c语言输出宽度右对齐,输出宽度设置
  4. BPEL和XPDL的区别
  5. i春秋-CTF-web文件上传
  6. python-selenium学习笔记:利用ec模块的定位方法,登陆百度并验证是否登陆成功
  7. 《植物大战僵尸》游戏存档修改
  8. android按钮悬停吸附,Android简单实现悬浮吸附的FloatingView
  9. 小程序悬浮按钮可拖动自动靠边
  10. JS的Date函数Date方法的相关汇总