当前位置: 首页 > news >正文

网站内容seovps wordpress 安装

网站内容seo,vps wordpress 安装,网站建设中 翻译,wordpress 附件插件文章目录 什么是回测框架?回测框架交易历史数据回测报告回测示例关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道… 文章目录 什么是回测框架?回测框架交易历史数据回测报告回测示例关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 什么是回测框架? 无论是传统股票交易还是量化交易无法避免的一个问题是我们需要检验自己的交易策略是否可行而最简单的方式就是利用历史数据检验交易策略而回测框架就是提供这样的一个平台让交易策略在历史数据中不断交易最终生成最终结果通过查看结果的策略收益年化收益最大回测等用以评估交易策略的可行性。 代码地址在最后。 本项目并不是一个已完善的项目, 还在不断的完善。 回测框架 回测框架应该至少包含两个部分, 回测类, 交易类. 回测类提供各种钩子函数用于放置自己的交易逻辑交易类用于模拟市场的交易平台这个类提供买入卖出的方法。 代码架构 以自己的回测框架为例。主要包含下面两个文件 backtest/ backtest.py broker.py backtest.py主要提供BackTest这个类用于提供回测框架暴露以下钩子函数. def initialize(self):在回测开始前的初始化passdef before\_on\_tick(self, tick):passdef after\_on\_tick(self, tick):passdef before\_trade(self, order):在交易之前会调用此函数可以在此放置资金管理及风险管理的代码如果返回True就允许交易否则放弃交易return Truedef on\_order\_ok(self, order):当订单执行成功后调用passdef on\_order\_timeout(self, order):当订单超时后调用passdef finish(self):在回测结束后调用passabstractmethoddef on\_tick(self, bar):回测实例必须实现的方法并编写自己的交易逻辑pass玩过量化平台的回测框架或者开源框架应该对这些钩子函数不陌生只是名字不一样而已大多数功能是一致的除了on_tick. 之所以是on_tick而不是on_bar, 是因为我希望交易逻辑是一个一个时间点的参与交易在这个时间点我可以获取所有当前时间的所有股票以及之前的股票数据用于判断是否交易而不是一个时间点的一个一个股票参与交易逻辑。 而broker.py主要提供buy,sell两个方法用于交易。 def buy(self, code, price, shares, ttl-1):限价提交买入订单---------Parameters:code:str股票代码price:float or None最高可买入的价格, 如果为None则按市价买入shares:int买入股票数量ttl:int订单允许存在的最大时间默认为-1永不超时---------return:dict{type: 订单类型, buy,code: 股票代码,date: 提交日期,ttl: 存活时间, 当ttl等于0时则超时往后不会在执行shares: 目标股份数量,price: 目标价格,deal\_lst: 交易成功的历史数据如\[{price: 成交价格,date: 成交时间,commission: 交易手续费,shares: 成交份额}\]}if price is None:stock\_info self.ctx.tick\_data\[code\]price stock\_info\[self.deal\_price\]order {type: buy,code: code,date: self.ctx.now,ttl: ttl,shares: shares,price: price,deal\_lst: \[\]}self.submit(order)return orderdef sell(self, code, price, shares, ttl-1):限价提交卖出订单---------Parameters:code:str股票代码price:float or None最低可卖出的价格, 如果为None则按市价卖出shares:int卖出股票数量ttl:int订单允许存在的最大时间默认为-1永不超时---------return:dict{type: 订单类型, sell,code: 股票代码,date: 提交日期,ttl: 存活时间, 当ttl等于0时则超时往后不会在执行shares: 目标股份数量,price: 目标价格,deal\_lst: 交易成功的历史数据如\[{open\_price: 开仓价格,close\_price: 成交价格,close\_date: 成交时间,open\_date: 持仓时间,commission: 交易手续费,shares: 成交份额,profit: 交易收益}\]}if code not in self.position:returnif price is None:stock\_info self.ctx.tick\_data\[code\]price stock\_info\[self.deal\_price\]order {type: sell,code: code,date: self.ctx.now,ttl: ttl,shares: shares,price: price,deal\_lst: \[\]}self.submit(order)return order由于我很讨厌抽象出太多类抽象出太多类及方法我怕我自己都忘记了所以对于对象的选择都是尽可能的使用常用的数据结构如list, dict. 这里用一个dict代表一个订单。 上面的这些方法保证了一个回测框架的基本交易逻辑而回测的运行还需要一个调度器不断的驱动这些方法这里的调度器如下。 class Scheduler(object):整个回测过程中的调度中心, 通过一个个时间刻度(tick)来驱动回测逻辑所有被调度的对象都会绑定一个叫做ctx的Context对象,由于共享整个回测过程中的所有关键数据, 可用变量包括: ctx.feed: {code1: pd.DataFrame, code2: pd.DataFrame}对象 ctx.now: 循环所处时间 ctx.tick\_data: 循环所处时间的所有有报价的股票报价 ctx.trade\_cal: 交易日历 ctx.broker: Broker对象 ctx.bt/ctx.backtest: Backtest对象可用方法: ctx.get\_histdef \_\_init\_\_(self):self.ctx Context()self.\_pre\_hook\_lst \[\]self.\_post\_hook\_lst \[\]self.\_runner\_lst \[\]def run(self):# runner指存在可调用的initialize, finish, run(tick)的对象runner\_lst list(chain(self.\_pre\_hook\_lst, self.\_runner\_lst, self.\_post\_hook\_lst))# 循环开始前为broker, backtest, hook等实例绑定ctx对象及调用其initialize方法for runner in runner\_lst:runner.ctx self.ctxrunner.initialize()# 创建交易日历if trade\_cal not in self.ctx:df list(self.ctx.feed.values())\[0\]self.ctx\[trade\_cal\] df.index# 通过遍历交易日历的时间依次调用runner# 首先调用所有pre-hook的run方法# 然后调用broker,backtest的run方法# 最后调用post-hook的run方法for tick in self.ctx.trade\_cal:self.ctx.set\_currnet\_time(tick)for runner in runner\_lst:runner.run(tick)# 循环结束后调用所有runner对象的finish方法for runner in runner\_lst:runner.finish()在Backtest类实例化的时候就会自动创建一个调度器对象然后通过Backtest实例的start方法就能启动调度器而调度器会根据历史数据的一个一个时间戳不断驱动Backtest, Broker实例被调用。 为了处理不同实例之间的数据访问隔离所以通过一个将一个Context对象绑定到Backtest, Broker实例上通过self.ctx访问共享的数据共享的数据主要包括feed对象即历史数据一个数据结构如下的字典对象。 {code1: pd.DataFrame, code2: pd.DataFrame} 而这个Context对象也绑定了Broker, Backtest的实例, 这就可以使得数据访问接口统一但是可能导致数据访问混乱这就要看策略者的使用了这样的一个好处就是减少了一堆代理方法通过添加方法去访问其他的对象的方法真不嫌麻烦那些人。 绑定及Context对象代码如下: class Context(UserDict):def \_\_getattr\_\_(self, key):# 让调用这可以通过索引或者属性引用皆可return self\[key\]def set\_currnet\_time(self, tick):self\[now\] ticktick\_data {}# 获取当前所有有报价的股票报价for code, hist in self\[feed\].items():df hist\[hist.index tick\]if len(df) 1:tick\_data\[code\] df.iloc\[-1\]self\[tick\_data\] tick\_datadef get\_hist(self, codeNone):如果不指定code, 获取截至到当前时间的所有股票的历史数据if code is None:hist {}for code, hist in self\[feed\].items():hist\[code\] hist\[hist.index self.now\]elif code in self.feed:return {code: self.feed\[code\]}return hist class Scheduler(object):整个回测过程中的调度中心, 通过一个个时间刻度(tick)来驱动回测逻辑所有被调度的对象都会绑定一个叫做ctx的Context对象,由于共享整个回测过程中的所有关键数据, 可用变量包括: ctx.feed: {code1: pd.DataFrame, code2: pd.DataFrame}对象ctx.now: 循环所处时间ctx.tick\_data: 循环所处时间的所有有报价的股票报价ctx.trade\_cal: 交易日历ctx.broker: Broker对象ctx.bt/ctx.backtest: Backtest对象可用方法: ctx.get\_histdef \_\_init\_\_(self):self.ctx Context()self.\_pre\_hook\_lst \[\]self.\_post\_hook\_lst \[\]self.\_runner\_lst \[\]def add\_feed(self, feed):self.ctx\[feed\] feeddef add\_hook(self, hook, typpost):if typ post and hook not in self.\_post\_hook\_lst:self.\_post\_hook\_lst.append(hook)elif typ pre and hook not in self.\_pre\_hook\_lst:self.\_pre\_hook\_lst.append(hook)def add\_broker(self, broker):self.ctx\[broker\] brokerdef add\_backtest(self, backtest):self.ctx\[backtest\] backtest# 简写self.ctx\[bt\] backtestdef add\_runner(self, runner):if runner in self.\_runner\_lst:returnself.\_runner\_lst.append(runner)为了使得整个框架可扩展回测框架中框架中抽象了一个Hook类这个类可以在在每次回测框架调用前或者调用后被调用这样就可以加入一些处理逻辑比如统计资产变化等。 这里创建了一个Stat的Hook对象用于统计资产变化。 class Stat(Base):def \_\_init\_\_(self):self.\_date\_hist \[\]self.\_cash\_hist \[\]self.\_stk\_val\_hist \[\]self.\_ast\_val\_hist \[\]self.\_returns\_hist \[\]def run(self, tick):self.\_date\_hist.append(tick)self.\_cash\_hist.append(self.ctx.broker.cash)self.\_stk\_val\_hist.append(self.ctx.broker.stock\_value)self.\_ast\_val\_hist.append(self.ctx.broker.assets\_value)propertydef data(self):df pd.DataFrame({cash: self.\_cash\_hist,stock\_value: self.\_stk\_val\_hist,assets\_value: self.\_ast\_val\_hist}, indexself.\_date\_hist)df.index.name datereturn df而通过这些统计的数据就可以计算最大回撤年化率等。 def get\_dropdown(self):high\_val -1low\_val Nonehigh\_index 0low\_index 0dropdown\_lst \[\]dropdown\_index\_lst \[\]for idx, val in enumerate(self.\_ast\_val\_hist):if val high\_val:if high\_val low\_val or high\_index low\_index:high\_val low\_val valhigh\_index low\_index idxcontinuedropdown (high\_val - low\_val) / high\_valdropdown\_lst.append(dropdown)dropdown\_index\_lst.append((high\_index, low\_index))high\_val low\_val valhigh\_index low\_index idxif low\_val is None:low\_val vallow\_index idxif val low\_val:low\_val vallow\_index idxif low\_index high\_index:dropdown (high\_val - low\_val) / high\_valdropdown\_lst.append(dropdown)dropdown\_index\_lst.append((high\_index, low\_index))return dropdown\_lst, dropdown\_index\_lstpropertydef max\_dropdown(self):最大回车率dropdown\_lst, dropdown\_index\_lst self.get\_dropdown()if len(dropdown\_lst) 0:return max(dropdown\_lst)else:return 0propertydef annual\_return(self):年化收益率y (v/c)^(D/T) - 1v: 最终价值c: 初始价值D: 有效投资时间(365)注: 虽然投资股票只有250天但是持有股票后的非交易日也没办法投资到其他地方所以这里我取365参考: [https://wiki.mbalib.com/zh-tw/%E5%B9%B4%E5%8C%96%E6%94%B6%E7%9B%8A%E7%8E%87](https://wiki.mbalib.com/zh-tw/%E5%B9%B4%E5%8C%96%E6%94%B6%E7%9B%8A%E7%8E%87) D 365c self.\_ast\_val\_hist\[0\]v self.\_ast\_val\_hist\[-1\]days (self.\_date\_hist\[-1\] - self.\_date\_hist\[0\]).daysret (v / c) \*\* (D / days) - 1return ret至此一个笔者需要的回测框架形成了。 交易历史数据 在回测框架中我并没有集成各种获取数据的方法因为这并不是回测框架必须集成的部分规定数据结构就可以了数据的获取通过查看数据篇 回测报告 回测报告我也放在了回测框架之外这里写了一个Plottter的对象用于绘制一些回测指标等。结果如下: 回测示例 下面是一个回测示例。 import json from backtest import BackTest from reporter import Plotter class MyBackTest(BackTest):def initialize(self):self.info(initialize)def finish(self):self.info(finish)def on\_tick(self, tick):tick\_data self.ctx\[tick\_data\]for code, hist in tick\_data.items():if hist\[ma10\] 1.05 \* hist\[ma20\]:self.ctx.broker.buy(code, hist.close, 500, ttl5)if hist\[ma10\] hist\[ma20\] and code in self.ctx.broker.position:self.ctx.broker.sell(code, hist.close, 200, ttl1) if \_\_name\_\_ \_\_main\_\_:from utils import load\_histfeed {}for code, hist in load\_hist(000002.SZ):# hist hist.iloc\[:100\]hist\[ma10\] hist.close.rolling(10).mean()hist\[ma20\] hist.close.rolling(20).mean()feed\[code\] histmytest MyBackTest(feed)mytest.start()order\_lst mytest.ctx.broker.order\_hist\_lstwith open(report/order\_hist.json, w) as wf:json.dump(order\_lst, wf, indent4, defaultstr)stats mytest.statstats.data.to\_csv(report/stat.csv)print(策略收益 {:.3f}%.format(stats.total\_returns \* 100))print(最大回彻率: {:.3f}% .format(stats.max\_dropdown \* 100))print(年化收益: {:.3f}% .format(stats.annual\_return \* 100))print(夏普比率: {:.3f} .format(stats.sharpe))plotter Plotter(feed, stats, order\_lst)plotter.report(report/report.png)项目地址 https://github.com/youerning/stock_playground 关于Python技术储备 学好 Python 不论是就业还是做副业赚钱都不错但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料希望提供给那些想学习 Python 的小伙伴们一点帮助 保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】 一、Python所有方向的学习路线 Python所有方向的技术点做的整理形成各个领域的知识点汇总它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。 二、Python基础学习视频 ② 路线对应学习视频 还有很多适合0基础入门的学习视频有了这些视频轻轻松松上手Python~在这里插入图片描述 ③练习题 每节视频课后都有对应的练习题哦可以检验学习成果哈哈 因篇幅有限仅展示部分资料 三、精品Python学习书籍 当我学到一定基础有自己的理解能力的时候会去阅读一些前辈整理的书籍或者手写的笔记资料这些笔记详细记载了他们对一些技术点的理解这些理解是比较独到可以学到不一样的思路。 四、Python工具包项目源码合集 ①Python工具包 学习Python常用的开发软件都在这里了每个都有详细的安装教程保证你可以安装成功哦 ②Python实战案例 光学理论是没用的要学会跟着一起敲代码动手实操才能将自己的所学运用到实际当中去这时候可以搞点实战案例来学习。100实战案例源码等你来拿 ③Python小游戏源码 如果觉得上面的实战案例有点枯燥可以试试自己用Python编写小游戏让你的学习过程中增添一点趣味 五、面试资料 我们学习Python必然是为了找到高薪的工作下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料并且有阿里大佬给出了权威的解答刷完这一套面试资料相信大家都能找到满意的工作。 六、Python兼职渠道 而且学会Python以后还可以在各大兼职平台接单赚钱各种兼职渠道兼职注意事项如何和客户沟通我都整理成文档了。 这份完整版的Python全套学习资料已经上传CSDN朋友们如果需要可以保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
http://www.zqtcl.cn/news/706349/

相关文章:

  • 网站导航栏设计要求wordpress直达按钮
  • 网站建设寻找可以途径网站制作的目的
  • 私募基金网站建设wordpress快讯插件
  • 无锡网站搜索引擎优化校园二级网站建设
  • 用vps刷网站流量要怎么做云主机开网站教程
  • 个体户经营异常如何网上解除深圳seo云哥
  • 网站建设科研申报书沧州网站建设定制价格
  • 家纺营销型网站wordpress演示数据
  • 中卫建设厅网站中国纪检监察报
  • 网站建设费如何核算如何给网站做权重
  • 东莞营销型高端网站建设网页专题设计
  • 神兵网站建设互联网个人用户网站
  • 类似视频教程网站的wordpress主题网页设计用什么尺寸的画布好
  • 仿模板电影网站线上销售的方法和技巧
  • 漳州建设银行网站首页速成建站
  • 网站建立的链接不安全怎么解决学校网站怎样建设
  • 信阳市工程建设信息网站wordpress段子
  • 网站建设和网络搭建是一回事吗长沙网站搭建优化
  • 基础网站怎么做石景山公司
  • 吉他谱网站如何建设wordpress主题字体用隶书
  • 做一个宣传网站的策划书自己怎样推广呢
  • 网站建设布局利于优化火狐搜索引擎
  • 公司给别人做的网站违法吗hexo插件wordpress
  • 网站用什么语言做动易网站迁移
  • 网站备案上传照片几寸织梦模板网站好吗
  • 怎么通过数据库做网站的登录wordpress 注册登录插件
  • 读书网站排名大的网站建设公司好
  • 电商网站建设系统公司 网站建
  • 西安建站费用优化系统是什么意思
  • 做网站认证对网站有什么好处中信建设有限责任公司四川分公司电话