首页 文章 精选 留言 我的

精选列表

搜索[Vite构建],共10000篇文章
优秀的个人博客,低调大师

从0到1,轻松构建数据预测模型

2 --> 说在前面: 大家好,我是爱学习的小xiong熊妹。 之前和大家分享了趋势型预测方法,很多小伙伴想看躺平型与周期型预测,今天他们来了。 首先回顾一下,常见的数据走势有三种: 趋势型:连续发展的态势。 躺平型:变动较少,一条直线。 周期型:有规律的周期性波动。 直接看图,能一眼认出来是哪一种(如下图) 认清楚走势以后,就能选择对应的模型啦。 先看躺平型的例子。举例:某门店业绩数据如下图所示,请预测2021年4月的业绩: 看到这张图,很多小伙伴会直呼:这个看起来,和100000的线很像呀,就是围绕100000的线在波动,我能直接按100000去预测吗? 答:当然可以呀。躺平型只要躺的够“平”,完全可以用平均值来做预测值。还有专门的方法叫:移动平均值法,即把近N期的数据平均值,作为预测值。 不过这样做有个问题:看起来不够高大上,领导们又说:“有没有大数据算法来搞搞……”哎,就是总有人迷信这个,那就弄个看起来复杂一点的:用指数平滑法来预测。 指数平滑法预测数据模型 用指数平滑法需要调用excel的分析工具,可以点击上方的:文件→选项,在加载项中选择:分析工具箱 设置好之后,就能在上方:数据 栏目,找到数据分析按钮。点下去,就能看到各种常见的分析工具了。 第一步:做好数据处理(如下图),选择指数平滑方法 第二步:选择输入区域,设好阻尼系数 阻尼系数是啥意思?阻尼系数是一个0到1之间数字,可以简单理解成: 阻尼越大,真实值权重越小,即历史情况参照意义越小 阻尼越小,真实值权重越大,即历史情况参照意义越大 不过大家完全不用纠结这个,完全可以设好几个阻尼系数,预测出来以后,看哪个预测的MSE值越小,就信哪个!简单迅速才能下班早!(关于MSE计算方法参见上一篇) 第三步:做好几个预测值,然后看哪个MSE小。比如设阻尼系数为0.95\0.9\0.8\0.7,分别计算预测数据及MSE值如下: 看图说话,阻尼系数0.8的时候MSE值最小,就它了,搞掂! 实例 再看个季节性预测的例子。举例,某线上店铺,销售业绩走势如下图(单位:万元)如何对2021年第一季度做预测呢? 显然,店铺业绩受双11、双12大促影响明显,4季度是旺季。这种走势也不能直接用趋势线来模拟,模拟出的趋势线R平方只有0.0几,完全不能用。但是,可以通过一个小技巧,把这个数据改造成可以用趋势线模拟的形式。 第一步:先对数据做改造。改造方法如下图,通过数据处理,模拟出季节变化趋势,这种方法叫:季节多元回归。 第二步:进行回归分析。既然叫季节多元回归,自然要调用回归分析,在同样的路径:数据→数据分析里,找到回归分析方法,然后输入参数: 第三步:解读分析数据。这里又是让人脑瓜子嗡嗡的时刻。不过不要怕,对大部分非数据分析专业的小伙伴,只要看几个关键数字就好了. 从结果上看: 1、R平方0.93,很好 2、各个参数的P值,除了X1以外都很小,很好 所以模型可用。还可以把X1:时间这个变量去掉。时间变量代表了长期发展趋势,本身这个数据几个周期也没有很大长期增长,所以去掉也是情理之中的。 有小伙伴可能好奇,做出来的模型为啥系数都是负的,真的没问题吗。没有,注意这个数据本身就是Q4数值很大,那Q1、Q2、Q3的参数肯定就是负的了。 这样就做完啦。想预测下个季度,可以增加一行:2021年1季度,对应的参数,t是21,Q1=1,Q2,Q3都是0,然后代入公式即可。这里留给读者们自己试一下。 总结 以上就是今天整理的简单预测方法。其实真只有几个数字要预测的话,即使丢给专业的算法工程师,他也是这么算的。我就亲眼看见隔壁算法组小哥哥,打开excel拖了几下,然后回个邮件给商品运营组的领导,说:“这是大数据方法预测的,blabla……”那一刻我整个人都震惊了,点赞、收藏、转发一键三连! 可能看完后,还有小伙伴会疑惑:领导们那么喜欢“建模”,他们真的不懂吗。其实这一点我还挺幸运的,因为我之前的领导就是接地气的陈老师,他会把客户的各种奇葩想法挡在门外,所以很少被不懂行的领导折腾。现在在互联网某厂,有专门的算法组处理这些问题,也很少被纠结了。 从我接触的客户/同事来看,还真的是:懂行的不迷信,迷信的不懂行。所以为了早点下班,用一些看似高大上实则轻松快捷的方法还是很有必要的。混过关就好。 小伙伴们自己掌握方法以后,也不用再纠结啦。遇到这些小问题打开excel拖一拖,我们这些查数姑们也能早点下班呢。毕竟拒绝内卷,从我做起,大家一起努力哦。 关注微信公众号【码工小熊】获取更多原创干货~

优秀的个人博客,低调大师

利用SQLite构建发明者量化数据库

摘要 数据是量化交易的源头,如何高效地管理大量数据是非常关键的环节,数据库是最佳的解决方案之一,现如今数据库的应用已经是各类日内交易、高频交易等策略的量化标准配置。本篇我们来研究一下发明者量化(FMZ.COM)内置的数据库,内容包括:如何创建数据表、存储数据、修改数据、删除数据、引用数据以及如何应用于实战。 如何选择数据库 熟悉发明者量化平台的应该知道,在这之前要想把数据保存到本地复用,只能用_G()函数,每次停止策略时,_G()函数会自动保存需要的信息。但如果想要保存更多更复杂的格式化数据,_G()函数显然就不太适用了,于是很多人想到了自建数据库来解决这个问题。 提到自建数据库,想必大家能想到Oracle、MySQL、KDB、OneTick、NoSQL...这些都是非常优秀的企业级别的应用,不管是功能还是性能都非常强大。但也面临几个问题:上手难度大,配置繁琐维护起来麻烦,这对于量化交易散户来说,有点用大炮打苍蝇的感觉,即使上手也只是用到很少一部分功能。 发明者量化内置数据库 接下来让我们认识一下发明者量化内置的轻型数据库,DBExec是发明者量化内置的一个关系型数据管理系统接口,基于SQLite开发,其本身是用C写的,不但体积小巧,占用资源低,而且处理速度快,非常适合用于金融量化分析爱好者在本地实现数据管理,因为可以将不同的“对象”(例如交易所,数据源,价格)分成不同的表,并在表之间定义关系。此外用户无需单独安装和配置,只要调用DBExec()函数就可以直接使用! 另外,SQLite语言的学习成本很低,在数据库上执行的大部分工作都由SQLite语句完成。熟悉基本语法就能满足大部分需求,以下是SQLite的基础语法。 基础语法 SQLite的语法是不区分大小写的,不过有一些命令对大小写敏感,如GLOB和glob代表不同的含义。SQLite语句可以以任何关键字开始,如SELECT、INSERT、UPDATE、DELETE、ALTER、DROP等,它们分别表示:提取数据、插入数据、更新数据、删除数据、修改数据库、删除数据表。所有的语句以英文分号结束。下面是一个简单的数据库创建、增、删、改、查等操作: function main() { // 创建:如果“users”表不存在就创建一个,“id”是整数且自动增加,“name”是文本形式且不为空 Log(DBExec('CREATE TABLE IF NOT EXISTS "users" (id INTEGER PRIMARY KEY AUTOINCREMENT, name text not NULL);')); // 增加: Log(DBExec("INSERT INTO users(name) values('张三')")); Log(DBExec("INSERT INTO users(name) values('李四')")); // 删除: Log(DBExec("DELETE FROM users WHERE id=1;")); // 修改 Log(DBExec("UPDATE users SET name='王五' WHERE id=2")); // 查询 Log(DBExec('select 2, ?, ?, ?, ?', 'ok', true,9.8,null)); Log(DBExec('select * from kvdb')); Log(DBExec('select * from cfg')); Log(DBExec('select * from log')); Log(DBExec('select * from profit')); Log(DBExec('select * from chart')); Log(DBExec("selEct * from users")); } 一个数据库通常包含一个或多个表,每个表都有一个名字标识,需要注意的是系统保留表分别: kvdb, cfg, log, profit, chart。也就是说在创建表时,应该避开系统保留的名字。让我们运行上面的代码,输出以下内容: 策略实例 了解了SQLite的基础语法,我们趁热打铁使用发明者量化内置的数据库,创建一个收集和使用Tick数据的实例。 第一步:更新托管者 首先确保您使用的是最新版本的托管者,如果之前下载使用过托管者,需要先删除,并在https://www.fmz.com/m/add-node页面重新下载和部署。 第二步:创建策略 function main() { // 订阅合约 _C(exchange.SetContractType, 'swap'); // 创建数据表 DBExec('CREATE TABLE IF NOT EXISTS "tick" (id INTEGER PRIMARY KEY AUTOINCREMENT,'.concat( 'High FLOAT not NULL,', 'Low FLOAT not NULL,', 'Sell FLOAT not NULL,', 'Buy FLOAT not NULL,', 'Last FLOAT not NULL,', 'Volume INTEGER not NULL,', 'Time INTEGER not NULL);' )); // 获取10个tick数据 while (true) { let tick = exchange.GetTicker(); // 在tick表中增加数据 DBExec(`INSERT INTO tick(High, Low, Sell, Buy, Last, Volume, Time) values(${tick.High}, ${tick.Low}, ${tick.Sell}, ${tick.Buy}, ${tick.Last}, ${tick.Volume}, ${tick.Time})`); // 查询所有数据 let allDate = DBExec('select * from tick'); if (allDate.values.length > 10) { break; } Sleep(1000); } // 查询所有数据 Log(DBExec('select * from tick')); // 查询第一个数据 Log(DBExec('select * from tick limit 1')); // 查询前两个数据 Log(DBExec('select * from tick limit 0,2')); // 删除第一个数据 Log(DBExec('DELETE FROM tick WHERE id=1;')); // 修改第二个数据 Log(DBExec('UPDATE tick SET High=10000 WHERE id=2')); // 查询所有数据 let allDate = DBExec('select * from tick') Log(allDate); } 第三步:运行策略 以Windows为例,运行策略之后,会在托管者目录的“\logs\storage”目录中生成一个以机器人编号命名的文件夹,打开该文件夹,里面有一个以“.db3”作为后缀的文件,这个文件就是发明者量化内置数据库的文件。以下图所示: 上面的代码首先创建了一个以“tick”命名的数据表,然后给该表添加tick数据字段,接着在循环中从交易所获取tick数据,并把这些数据插入到“tick”数据表中,同时判断该数据表中的数据量超过10个就跳出循环。最后分别用5个SQLite命令查询、删除、修改数据表中的数据。并在日志中打印出来,以下图所示: 第四步:创建状态栏 最后我们增加一些代码,通过获取发明者量化数据库中的数据,给策略创建一个状态栏,把数据更直观的展示出来,新增代码如下: // 创建状态栏 let table = { type: 'table', title: '币安Tick数据', cols: allDate.columns, rows: allDate.values } LogStatus('`' + JSON.stringify(table) + '`'); 上面的代码通过数据库中的数据,创建了一个“币安Tick数据”表。其中数据库中的“columns”字段代表状态栏中的“行”,“values”字段代表状态栏中的“列”。如下图所示: 完整策略代码 /*backtest start: 2020-07-19 00:00:00 end: 2020-08-17 23:59:00 period: 15m basePeriod: 15m exchanges: [{"eid":"Binance","currency":"LTC_USDT"}] */ function main() { Log(DBExec('DROP TABLE tick;')); // 订阅合约 _C(exchange.SetContractType, 'swap'); // 创建数据表 DBExec('CREATE TABLE IF NOT EXISTS "tick" (id INTEGER PRIMARY KEY AUTOINCREMENT,'.concat( 'High FLOAT not NULL,', 'Low FLOAT not NULL,', 'Sell FLOAT not NULL,', 'Buy FLOAT not NULL,', 'Last FLOAT not NULL,', 'Volume INTEGER not NULL,', 'Time INTEGER not NULL);' )); // 获取10个tick数据 while (true) { let tick = exchange.GetTicker(); // 在tick表中增加数据 DBExec(`INSERT INTO tick(High, Low, Sell, Buy, Last, Volume, Time) values(${tick.High}, ${tick.Low}, ${tick.Sell}, ${tick.Buy}, ${tick.Last}, ${tick.Volume}, ${tick.Time})`); // 查询所有数据 let allDate = DBExec('select * from tick'); if (allDate.values.length > 10) { break; } Sleep(1000); } // 查询所有数据 Log(DBExec('select * from tick')); // 查询第一个数据 Log(DBExec('select * from tick limit 1')); // 查询前两个数据 Log(DBExec('select * from tick limit 0,2')); // 删除第一个数据 Log(DBExec('DELETE FROM tick WHERE id=1;')); // 修改第二个数据 Log(DBExec('UPDATE tick SET High=10000 WHERE id=2')); // 查询所有数据 let allDate = DBExec('select * from tick') Log(allDate); // 创建状态栏 let table = { type: 'table', title: '币安Tick数据', cols: allDate.columns, rows: allDate.values } LogStatus('`' + JSON.stringify(table) + '`'); } 点击该链接https://www.fmz.com/strategy/265906即可复制完整策略代码。 内存数据库 如果操作的数据不希望永久保存到磁盘,可以在SQL语句前加上:符号就可以在内存数据库里操作, 机器人重启后数据重置 DBExec(":select 1,2,3"); 总结 数据库不仅可以承载海量数据,更能承载众多量化交易爱好者的宽客梦想。对于数据库的使用绝非仅限于本文的例子,更多使用方法可以参考SQLite教程,以及发明者量化后续推出的系列文章。

优秀的个人博客,低调大师

Linux设备驱动 | 如何进行构建和运行模块

作者:世至其美 原文地址:https://hqber.com 内核功能模块 ​ ​ 设备和模块的分类 字符设备:可通过字节流(类似文件)进行访问的设备,字符设备驱动程序通常至少要实现open、close、read和write系统调用。 块设备:进行IO操作,可进行传输若干个完整的块的设备。 网络接口:任何网络事务都经过一个网络接口形成,网络接口由内核中的网络子系统驱动,负责发送和接收数据包,不需要了解数据包结构和具体的映射。 ​ 内核模块和应用程序的区别 内核模块是运行在内核空间,应用程序是运行在用户空间。 内核模块的编程方式类似应用程序中事件驱动的编程方式,模块需要预先进行注册,用于服务将来的某个请求。 应用程序在退出时,可以不管资源的释放或者其他清除工作;而内核模块的退出函数却必须全部撤销初始化函数所做的一切,否则,系统重新引导之前某些东西就会残留在系统中。 应用程序可以调用未定义的函数,可以通过解析外部引用链接对应的函数库。内核模块仅仅是被链接到内核,只能使用内核中导出的函数,不存在任何可链接库。 应用程序开发过程中的段错误是无害的,能通过调试器定位到问题源头;内核错误即使不影响系统,也至少会杀死进程。 ​ 将模块链接到内核 ​ 内核具有非常小的栈,可能和一个4096字节大小的页那样小。 在内核API中,函数名称中(__)通常表示接口底层组件,谨慎使用。 内核代码不能实现浮点数运算,如果打开浮点支持,在某些架构上,需要在进入和退出内核空间时保存和恢复浮点处理器的状态。这种额外的开销没有任何价值,内核代码中也不需要浮点运算。 ​ 装载和卸载模块 insmod:将模块的代码和数据装入内核,然后使用内核的符号表解析模块中任何未解析的符号,如果内核中没有定义,则报告命令有误,并在系统日志文件中记录“unresolved symbols(未解析的符号)”消息。insmod可以接受一些命令行选项,可以在模块链接到内核之前进行配置参数,变量参数必须经过module_param(变量,类型,sysfs入口项的访问许可掩码)宏(moduleparam.h)来声明。数组参数必须经过module_param_array(数组名称,类型,最大个数,perm访问许可值)来声明。 insmod是依赖于kernel/module.c中的系统调用。 insmod工作原理: ​ ​ modprobe:将模块的代码和数据装入内核,同时会检查装载的模块是否有引用内核中不存在的符号,如果存在这类符号,则在当前模块搜索路径中查找定义这些符号的其他模块,并进行装载该模块所依赖的其他模块到内核中,可以在它的配置文件(/etc/modprob.conf)进行读取参数值. rmmod:将所有模块从内核中移除,如果内核认为模块还在使用状态或者内核被配置为禁止移除的状态,则无法移除该模块。 lsmod:列出当前装载在内核中的所有模块,并提供其他信息,lsmod是通过读取/proc/modules虚拟文件来获取这些信息。已装载模块的信息也可以在sysf虚拟文件系统的/sys/module下找到。 ​ Linux内核提供一种方法来管理符号对模块外部的可见性,减少命名空间的污染。 导出符号: EXPORT_SYMBOL(name) EXPORT_SYMBOL_GPL(name) 注意:符号只能在模块文件的全局导出,不能在函数中导出,导出的变量必须是全局的,存放在模块的可执行文件的一个ELF段。装载时,内核可通过这个段寻找模块导出的代码段。 ​ 初始化和关闭 module_init的使用是强制的,这个宏会在模块的目标代码中增加一个特殊的段,标识内核初始化函数所在的位置。 module_exit是帮助内核标识模块清除函数所在的位置。 在初始化过程中,可能会发生错误导致无法继续装载模快,则需要将出错之前的任何注册工作撤销掉,否则系统会残留指向不存在的指针。 作者:世至其美 原文地址:https://hqber.com

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册