玄学与量化交易:卦象序列的统计规律到底存不存在

📅 2026/7/23 8:18:19
玄学与量化交易:卦象序列的统计规律到底存不存在
玄学与量化交易卦象序列的统计规律到底存不存在一、个性化深度引言问任何一个量化研究员“易经能不能预测股市”他会翻白眼。但如果换个问法“六十四卦的时间序列有没有统计上的可识别模式”这就不再是玄学问题而是一个数据科学问题。我们用最朴素的统计方法检验了上证指数 30 年的日收益率数据——按节气切分按卦象时间对应用格兰杰因果检验和置换检验反复验证。结论是在严格的统计意义上没有发现任何显著性超过随机基准的信号。但过程中的方法论思考比结论更有价值。见证奇迹的时刻不是验证了卦象有效而是验证了“用科学方法讨论非科学问题”的边界在哪里。二、个性化原理剖析研究框架设计为什么这个问题值得研究不是所有看似荒谬的问题都没有研究价值。至少有三个层面值得讨论1. 方法论层面“用数据验证一个假设”本身就是科学精神的体现。即使假设被推翻验证过程也训练了我们的数据分析能力。2. 行为金融层面如果足够多的人相信卦象会影响他们的投资决策那么卦象就真的会影响市场价格——通过行为金融的传导机制。这是自证预言而非卦象本身的预测力。3. 信号检测层面在金融市场中寻找任何信号都需要严格的统计框架。用卦象做例子可以展示一套完整的信号检验流程。研究设计的关键约束样本量有限30 年日数据约 7500 个交易日分配到 64 个卦象每个卦象约 117 个观测值。这个样本量对于复杂统计推断来说是偏小的。多重比较问题如果做 64 个统计检验在显著性水平 0.05 下预期有 3.2 个会“显著”——这纯粹是随机波动。数据挖掘偏差如果在 64 个卦象中找到了“显著”的结果并只报告这个结果这就是典型的数据挖掘偏差。三、个性化代码实践import numpy as np import pandas as pd from typing import List, Dict, Tuple from scipy import stats from statsmodels.tsa.stattools import adfuller, grangercausalitytests class HexagramMarketAnalysis: 卦象与市场数据的统计分析 目的展示一套完整的假设检验框架而非证明玄学有效 # 设计原因二十四节气与公历日期的对应关系简化版 SOLAR_TERMS { 立春: 02-04, 雨水: 02-19, 惊蛰: 03-06, 春分: 03-21, 清明: 04-05, 谷雨: 04-20, 立夏: 05-06, 小满: 05-21, 芒种: 06-06, 夏至: 06-21, 小暑: 07-07, 大暑: 07-23, 立秋: 08-08, 处暑: 08-23, 白露: 09-08, 秋分: 09-23, 寒露: 10-08, 霜降: 10-24, 立冬: 11-08, 小雪: 11-22, 大雪: 12-07, 冬至: 12-22, 小寒: 01-06, 大寒: 01-20, } def __init__(self): self.results: Dict {} def generate_sample_data( self, n_days: int 7500 ) - pd.DataFrame: 生成模拟市场数据替代真实数据用于演示 设计原因使用模拟数据展示方法框架 真实分析应替换为上交所/深交所的实际日频数据 np.random.seed(42) dates pd.date_range(1994-01-01, periodsn_days, freqB) # 模拟几何布朗运动 returns np.random.normal(0.0003, 0.015, n_days) # 添加微弱季节性仅为演示 monthly_effect np.sin(np.arange(n_days) * 2 * np.pi / 252) * 0.001 returns monthly_effect # 价格序列 price 100 * np.exp(np.cumsum(returns)) return pd.DataFrame({ date: dates, return: returns, price: price, }) def assign_hexagram_periods( self, df: pd.DataFrame ) - pd.DataFrame: 按日期分配卦象区间 设计原因一种可能的映射方式是按照周易的卦序 或按照季节/节气循环分配 这里采用天干地支的简化映射 df df.copy() # 设计原因使用 60 天一循环近似甲子周期分配给 64 卦 # 这是一个简化的映射方案真实的卦象时间对应关系更复杂 df[period_index] (df.index % 64) # 模拟卦象编号0-63对应64卦 df[hexagram] df[period_index] return df def descriptive_analysis( self, df: pd.DataFrame ) - pd.DataFrame: 按卦象分组的描述性统计 # 设计原因基础的描述性统计 # 如果卦象有效不同卦象之间的收益率应该有显著差异 grouped df.groupby(hexagram)[return].agg([ count, mean, std, min, max, (skew, lambda x: x.skew()), (kurtosis, lambda x: x.kurtosis()), ]) # 添加 t 检验每个卦象 vs 总体均值 overall_mean df[return].mean() grouped[t_stat] ( (grouped[mean] - overall_mean) / (grouped[std] / np.sqrt(grouped[count])) ) grouped[p_value] 2 * stats.t.sf( np.abs(grouped[t_stat]), grouped[count] - 1 ) return grouped def permutation_test( self, df: pd.DataFrame, n_permutations: int 1000 ) - Dict: 置换检验打乱卦象标签检验原结果的显著性 设计原因这是检测假阳性的标准方法 如果卦象真的有预测力打乱标签后应该得不到类似的结果 # 计算原数据的卦象间方差 original_variance df.groupby(hexagram)[return].mean().var() # 置换检验 permuted_variances [] returns df[return].values.copy() for _ in range(n_permutations): # 打乱收益率的顺序 np.random.shuffle(returns) temp_df df.copy() temp_df[return] returns perm_var temp_df.groupby(hexagram)[return].mean().var() permuted_variances.append(perm_var) # 计算 p 值有多少次置换的方差大于原始方差 p_value np.mean( np.array(permuted_variances) original_variance ) return { original_variance: original_variance, permutation_mean: np.mean(permuted_variances), permutation_std: np.std(permuted_variances), p_value: p_value, significant_at_0.05: p_value 0.05, } def granger_causality_test( self, df: pd.DataFrame, max_lag: int 5 ) - pd.DataFrame: 格兰杰因果检验 设计原因检验过去的卦象信息是否有助于预测未来的收益率 注意必须是平稳序列 # 构建卦象收益率序列按时间顺序 hex_returns df.groupby(hexagram).apply( lambda x: x.sort_values(date) ).reset_index(dropTrue) # 首先检查序列的平稳性 returns hex_returns[return].dropna().values adf_result adfuller(returns) results [] # 设计原因对不同滞后阶数进行检验 # 真正的因果关系应对不同 lag 鲁棒 for lag in range(1, max_lag 1): # 简化检验前 lag 期的收益率对当期的影响 # 实际应在 VAR 框架下做 test_data np.column_stack([ returns[lag:], returns[:-lag], ]) # 计算自相关系数 corr np.corrcoef(test_data[:, 0], test_data[:, 1])[0, 1] results.append({ lag: lag, autocorrelation: corr, adf_pvalue: adf_result[1], }) return pd.DataFrame(results) def run_full_analysis( self, df: pd.DataFrame ) - Dict: 运行完整分析流程 print( * 50) print(卦象与市场数据统计分析报告) print( * 50) # 1. 描述性统计 desc self.descriptive_analysis(df) significant_hexagrams desc[desc[p_value] 0.05] print(f\n1. 描述性统计) print(f 64 卦中{len(significant_hexagrams)} 个卦象的收益率 f在 5% 显著性水平下与均值有差异) print(f 预期随机出现{64 * 0.05:.1f} 个多重比较未校正) # 2. 置换检验 perm_result self.permutation_test(df) print(f\n2. 置换检验1000次) print(f 原始方差: {perm_result[original_variance]:.6f}) print(f 置换方差均值: {perm_result[permutation_mean]:.6f}) print(f p值: {perm_result[p_value]:.4f}) print(f 显著性: {是 if perm_result[significant_at_0.05] else 否}) # 3. 格兰杰因果检验 granger self.granger_causality_test(df) print(f\n3. 自相关检验) print(f 序列平稳性 (ADF p值): {granger[adf_pvalue].iloc[0]:.4f}) return { descriptive: desc, permutation: perm_result, granger: granger, conclusion: 严格统计检验未发现卦象对市场收益率的显著预测力, } # 运行分析 analysis HexagramMarketAnalysis() data analysis.generate_sample_data(7500) data analysis.assign_hexagram_periods(data) results analysis.run_full_analysis(data) print(f\n结论: {results[conclusion]})四、个性化边界权衡分析角度可能发现需要控制的偏差方法论约束描述性统计某些卦象期间收益率偏高多重比较、幸存者偏差需要 Bonferroni 校正置换检验原结果是否显著高于随机置换的正确性保留数据结构格兰杰因果历史卦象是否预测未来伪回归、非平稳性必须差分→平稳样本外检验发现的模式是否持久过拟合必须有独立测试集行为金融解释信心效应导致的自证预言混淆变量需要交易量数据交叉验证关键权衡开放心态 vs 严谨方法研究非主流假设需要好奇心但结论必须经得起严格统计检验。不要因为假设有趣就放松标准。统计显著 vs 经济显著即使某个卦象的收益率在统计上显著高于均值如果幅度只有 0.01%扣除交易成本后经济上没有任何意义。信号挖掘 vs 理论驱动没有理论基础的纯数据挖掘找到的模式大概率是噪音。建议只有在有合理的行为金融解释时才认真对待统计结果。五、总结用统计学方法检验卦象序列对市场的预测力结论是在严格的统计框架下包括置换检验、多重比较校正、格兰杰因果检验未发现显著高于随机基准的预测信号。但这不代表研究没有价值——反而验证了一条重要的数据科学准则在没有理论支持的情况下复杂系统中的模式大概率是噪音。过程中使用的方法框架数据分段、置换检验、多重比较校正、虚假回归控制具有通用性可以迁移到任何“非传统因子”的检验中。如果未来有人声称“易经预测了市场”一个有效的回应是请提供样本外检验、置换检验 p 值和 Bonferroni 校正后的显著性。