"""R608:独立标准库合成方法样例,不是实际历史绩效。""" prices=[10,20,30,40,30,25,20,15,18,22] lookbacks=[3,5] common=max(lookbacks) def run(n,start): cash,shares=1000,0 rows=[] for fill_t in range(start,len(prices)): signal_t=fill_t-1 assert signal_t>=n-1 signal=int(prices[signal_t]>sum(prices[signal_t-n+1:signal_t+1])/n) qty=signal-shares cash-=qty*prices[fill_t] shares=signal rows.append((fill_t,signal,cash+shares*prices[fill_t])) return rows aligned=[run(n,common) for n in lookbacks] assert [rows[-1][2] for rows in aligned] == [1000, 995] assert run(3,3)[-1][2] == 985 assert all(len(rows)==5 for rows in aligned) assert [r[0] for r in aligned[0]]==[r[0] for r in aligned[1]] assert run(3,3)[-1][2]!=run(3,5)[-1][2] assert max(lookbacks)-1==4 and common==5 try: run(5,3) except AssertionError: pass else: raise AssertionError('insufficient warmup accepted') print('first_signal=[2,4] first_fill=[3,5] common_fill=5 scored_sessions=5') print('aligned_ending='+str([rows[-1][2] for rows in aligned])+' short_own_start='+str(run(3,3)[-1][2]))