期貨量化軟件:赫茲量化中并行粒子群優(yōu)化的研究
根據(jù)這個代碼,每個粒子都有一個當(dāng)前的位置、速度和過去“最佳”點的記憶。這里,“最佳”點是指達到該粒子目標(biāo)函數(shù)最高值的點(一組EA輸入?yún)?shù))。讓我們在類里面描述一下。
?class Particle ?{ ? ?public: ? ? ?double position[]; ? ?// current point ? ? ?double best[]; ? ? ? ?// best point known to the particle ? ? ?double velocity[]; ? ?// current speed ? ? ? ? ? ?double positionValue; // EA performance in current point ? ? ?double bestValue; ? ? // EA performance in the best point ? ? ?int ? ?group; ? ? ? ? ? ?Particle(const int params) ? ? ?{ ? ? ? ?ArrayResize(position, params); ? ? ? ?ArrayResize(best, params); ? ? ? ?ArrayResize(velocity, params); ? ? ? ?bestValue = -DBL_MAX; ? ? ? ?group = -1; ? ? ?} ?};
所有數(shù)組的大小都等于優(yōu)化空間的維數(shù),因此它等于正在優(yōu)化的專家顧問參數(shù)的數(shù)目(傳遞給構(gòu)造函數(shù))。默認情況下,目標(biāo)函數(shù)值越大,優(yōu)化效果越好。因此,用最小可能的 -DBL_MAX 數(shù)值來初始化 bestValue 字段。其中一個交易指標(biāo)通常被用來作為評估EA的標(biāo)準(zhǔn),如利潤、盈利能力、夏普比率等。如果通過較低值被認為更好的參數(shù),例如回撤,來執(zhí)行優(yōu)化,則可以進行適當(dāng)?shù)霓D(zhuǎn)換以最大化相反的值。
數(shù)組和變量是公有的,以簡化訪問和它們的重新計算代碼。嚴(yán)格遵守OOP原則需要使用“private”修飾符隱藏它們,并描述讀取和修改方法。
除了單個粒子外,該算法還處理所謂的“拓撲”或粒子子集。它們可以根據(jù)不同的原則來創(chuàng)建?!吧鐣后w拓撲”將用于我們的案例。這樣的組存儲有關(guān)其所有粒子中最佳位置的信息。
?class Group ?{ ? ?private: ? ? ?double result; ? ?// best EA performance in the group ? ? ? ?public: ? ? ?double optimum[]; // best known position in the group ? ? ? ? ? ?Group(const int params) ? ? ?{ ? ? ? ?ArrayResize(optimum, params); ? ? ? ?ArrayInitialize(optimum, 0); ? ? ? ?result = -DBL_MAX; ? ? ?} ? ? ? ? ? ?void assign(const double x) ? ? ?{ ? ? ? ?result = x; ? ? ?} ? ? ? ? ? ?double getResult() const ? ? ?{ ? ? ? ?return result; ? ? ?} ? ? ? ? ? ?bool isAssigned() ? ? ?{ ? ? ? ?return result != -DBL_MAX; ? ? ?} ?};
通過在粒子類的“group”字段中指定組名,我們可以指示粒子所屬的組(見上文)。
現(xiàn)在,讓我們繼續(xù)對粒子群算法本身進行編碼。它將作為一個單獨的類實現(xiàn)。讓我們從粒子和群的數(shù)組開始。
?class Swarm ?{ ? ?private: ? ? ?Particle *particles[]; ? ? ?Group *groups[]; ? ? ?int _size; ? ? ? ? ? ? // number of particles ? ? ?int _globals; ? ? ? ? ?// number of groups ? ? ?int _params; ? ? ? ? ? // number of parameters to optimize
對于每個參數(shù),我們需要指定執(zhí)行優(yōu)化的值的范圍,以及增量(步長)。
? ? ?double highs[]; ? ? ?double lows[]; ? ? ?double steps[];