"""C06与C08独立构造实验。只使用标准库;不冒称某个行情软件实测。""" from pathlib import Path from datetime import date,timedelta from statistics import mean,pstdev,stdev import json,math out={} def smoother(xs,n,alpha): ans=[None]*len(xs) if len(xs)down else 0,'mdm':max(down,0) if down>up else 0}) series={} for name,alpha in [('wilder',1/3),('ema',2/4)]: tr=smoother([x['tr'] for x in raw],3,alpha);p=smoother([x['pdm'] for x in raw],3,alpha);mi=smoother([x['mdm'] for x in raw],3,alpha);dx=[] for i in range(len(raw)): dx.append(None if tr[i] is None else (100*abs(p[i]-mi[i])/(p[i]+mi[i]) if p[i]+mi[i] else 0)) valid=[x for x in dx if x is not None];adx=[None]*2+smoother(valid,3,alpha) series[name]=[{'bar':raw[i]['bar'],'sm_tr':tr[i],'sm_pdm':p[i],'sm_mdm':mi[i],'dx':dx[i],'adx':adx[i]} for i in range(len(raw))] out['DJ051']={'period':3,'seed_ohlc':ohlc[0],'raw':raw,'series':series} samples={'全涨':[10,11,12,13],'全跌':[13,12,11,10],'全平':[10,10,10,10]};rows=[] for label,prices in samples.items(): changes=[b-a for a,b in zip(prices,prices[1:])];g=mean(max(x,0) for x in changes);l=mean(max(-x,0) for x in changes) val=50 if g+l==0 else 100*g/(g+l) rows.append({'label':label,'closes':prices,'changes':changes,'avg_gain':g,'avg_loss':l,'defined_rsi':val,'flat_other_convention':0 if g+l==0 else None}) out['DJ052']={'n':3,'rows':rows} prices=[10,12,11,13,14,12,15];rows=[] for i in range(2,len(prices)): w=prices[i-2:i+1];av=mean(w);pop=pstdev(w);sample=stdev(w) rows.append({'bar':i+1,'window':w,'mean':av,'sum_squares':sum((x-av)**2 for x in w),'pop_std':pop,'sample_std':sample,'pop_lower':av-2*pop,'pop_upper':av+2*pop,'sample_lower':av-2*sample,'sample_upper':av+2*sample}) out['DJ053']={'n':3,'multiple':2,'closes':prices,'rows':rows,'sample_pop_ratio':math.sqrt(3/2)} prices=[10,11,9,12,13,10,11];fast=slow=prices[0];signal=0;rows=[] for i,p in enumerate(prices): if i:fast=fast+(p-fast)*2/3;slow=slow+(p-slow)*2/5 dif=fast-slow signal=signal+(dif-signal)*2/4 hist=dif-signal rows.append({'bar':i+1,'close':p,'fast_ema':fast,'slow_ema':slow,'dif':dif,'dea':signal,'hist':hist,'hist_times2':2*hist}) out['DJ054']={'fast_period':2,'slow_period':4,'signal_period':3,'closes':prices,'rows':rows} prices=[10,10,10,11,9,10];rs=[];cases={} for i in range(2,len(prices)): w=prices[i-2:i+1];hi=max(w);lo=min(w) rs.append(None if hi==lo else 100*(prices[i]-lo)/(hi-lo)) for label,initial in [('填零',0),('填中点',50),('沿用前值',80)]: k=d=50;rows=[] for i,r in enumerate(rs): v=initial if r is None else r;k=2*k/3+v/3;d=2*d/3+k/3 rows.append({'bar':i+3,'rsv':v,'k':k,'d':d,'j':3*k-2*d}) cases[label]=rows out['DJ055']={'closes':prices,'period':3,'initial_k':50,'initial_d':50,'saved_previous_rsv':80,'cases':cases} bars=[(100,102,98,101),(108,110,107,108),(108,109,105,106),(98,99,95,96),(96,98,94,97)];rows=[] pc=100 for i,(o,h,l,c) in enumerate(bars,1): terms=[h-l,abs(h-pc),abs(l-pc)];rows.append({'bar':i,'o':o,'h':h,'l':l,'c':c,'prev_close':pc,'range':terms[0],'high_prev':terms[1],'low_prev':terms[2],'tr':max(terms)});pc=c out['DJ056']={'seed_previous_close':100,'rows':rows,'atr3':smoother([x['tr'] for x in rows],3,1/3)} calendar=[('2026-01-05',10),('2026-01-06',11),('2026-01-07',None),('2026-01-08',None),('2026-01-09',14),('2026-01-10',None),('2026-01-11',None),('2026-01-12',13)];obs=[];filled=[];rows=[];last=None for d,p in calendar: if p is not None:obs.append(p);last=p filled.append(last) rows.append({'date':d,'weekday':date.fromisoformat(d).weekday(),'observed_close':p,'filled_close':last,'observation_ma3':mean(obs[-3:]) if len(obs)>=3 else None,'calendar_ma3':mean(filled[-3:]) if len(filled)>=3 else None,'label':'有观测' if p is not None else ('周末' if date.fromisoformat(d).weekday()>=5 else '停牌假设')}) out['DJ057']={'rows':rows,'n':3} tp=[10,11,10,12,11,13];vol=[10,20,30,40,50,60];rows=[] obv=0 for i in range(len(tp)): direction=0 if i==0 else (1 if tp[i]>tp[i-1] else -1 if tp[i]tp[i-1]);neg=sum(tp[i]*vol[i] for i in range(3,6) if tp[i]=5 for x in out['DJ057']['rows'] if x['label']=='周末')) Path(__file__).with_suffix('.json').write_text(json.dumps({'as_of':'2026-10-23','notice':'全部数据与规则假设为教学构造;算法定义和初始化以正文为准。','checks':checks,'articles':out},ensure_ascii=False,indent=2),encoding='utf-8') for k,v in out.items():print(k,json.dumps(v,ensure_ascii=False))