Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Azure Stream Analytics az SQL nyelv, a JavaScript felhasználó által definiált függvények (UDF-ek) és a felhasználó által definiált összesítések (UDA-k) kombinációjával támogatja a speciális elemzést. A fejlett elemzések közé tartozik az online gépi tanulás betanítása és pontozása, valamint az állapotalapú folyamatszimuláció. Ez a cikk azt ismerteti, hogyan hajthat végre lineáris regressziót egy Azure Stream Analytics feladatban, amely folyamatos betanítást és pontozást végez egy nagy gyakoriságú kereskedési forgatókönyvben.
Prerequisites
- Azure-előfizetés. Ha még nincs előfizetése, hozzon létre egy ingyenes fiókot.
- Egy Azure Stream Analytics feladat.
- Egy Azure Event Hubs névtér és eseményközpont.
- A Stream Analytics lekérdezési nyelvének ismerete.
- (Nem kötelező) Egy Power BI fiók, ha meg szeretné jeleníteni a kimenetet.
Nagy gyakoriságú kereskedési munkafolyamat
A nagy gyakoriságú kereskedés logikai folyamata a következő:
- Valós idejű árfolyamok lekérése egy értéktőzsdéről.
- Egy prediktív modell létrehozása az idézőjelek köré, hogy előre jelezhesse az ármozgást.
- Vételi vagy eladási megrendelések elhelyezése, hogy pénzt kereshessenek az ármozgások sikeres előrejelzéséből.
Ehhez a forgatókönyvhöz a következőre van szükség:
- Valós idejű idézetcsatorna.
- Prediktív modell, amely képes valós idejű idézőjeleken dolgozni.
- Kereskedési szimuláció, amely bemutatja a kereskedési algoritmus nyereségét vagy veszteségét.
Valós idejű árfolyamadat-folyam
Important
Az ebben a szakaszban hivatkozott IEX trading WebSocket API (iextrading.com) ki lett állítva. Az IEX Cloud mostantól különböző hitelesítéssel és végpontokkal biztosítja a piaci adatokat az IEX Cloudon keresztül. Ennek megfelelően frissítse az URL-címet és a hitelesítést a megvalósításban.
Important
Az ebben a mintában használt SocketIoClientDotNet és WindowsAzure.ServiceBus NuGet-csomagok elavultak. Új projektek esetén a régi EventHubClient helyett használja a jelenlegi Socket.IO klienskönyvtárat és a Azure.Messaging.EventHubs csomagot a(z) EventHubProducerClient használatával.
Az Investors Exchange (IEX) korábban ingyenes valós idejű vételi és eladási jegyzéseket kínált a socket.io használatával. Írhat egy egyszerű konzolprogramot, amely valós idejű idézőjeleket fogad, és adatforrásként leküldi őket Azure Event Hubs. Az alábbi kód a program váza. A kódból a rövidség kedvéért kimaradt a hibakezelés. A projektbe fel kell vennie a SocketIoClientDotNet és WindowsAzure.ServiceBus NuGet-csomagokat is.
using Quobject.SocketIoClientDotNet.Client;
using Microsoft.ServiceBus.Messaging;
var symbols = "msft,fb,amzn,goog";
var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, eventHubName);
var socket = IO.Socket("https://ws-api.iextrading.com/1.0/tops");
socket.On(Socket.EVENT_MESSAGE, (message) =>
{
eventHubClient.Send(new EventData(Encoding.UTF8.GetBytes((string)message)));
});
socket.On(Socket.EVENT_CONNECT, () =>
{
socket.Emit("subscribe", symbols);
});
Caution
Ez a kódminta csak illusztráció. Az IEX WebSocket API-végpont és az itt használt NuGet-csomagok már nem érhetők el. Ne használja ezt a kódot éles környezetben. Az aktuális alternatívákat a szakasz korábbi FONTOS megjegyzései között találja.
Íme néhány létrehozott mintaesemény:
{"symbol":"MSFT","marketPercent":0.03246,"bidSize":100,"bidPrice":74.8,"askSize":300,"askPrice":74.83,"volume":70572,"lastSalePrice":74.825,"lastSaleSize":100,"lastSaleTime":1506953355123,"lastUpdated":1506953357170,"sector":"softwareservices","securityType":"commonstock"}
{"symbol":"GOOG","marketPercent":0.04825,"bidSize":114,"bidPrice":870,"askSize":0,"askPrice":0,"volume":11240,"lastSalePrice":959.47,"lastSaleSize":60,"lastSaleTime":1506953317571,"lastUpdated":1506953357633,"sector":"softwareservices","securityType":"commonstock"}
{"symbol":"MSFT","marketPercent":0.03244,"bidSize":100,"bidPrice":74.8,"askSize":100,"askPrice":74.83,"volume":70572,"lastSalePrice":74.825,"lastSaleSize":100,"lastSaleTime":1506953355123,"lastUpdated":1506953359118,"sector":"softwareservices","securityType":"commonstock"}
{"symbol":"FB","marketPercent":0.01211,"bidSize":100,"bidPrice":169.9,"askSize":100,"askPrice":170.67,"volume":39042,"lastSalePrice":170.67,"lastSaleSize":100,"lastSaleTime":1506953351912,"lastUpdated":1506953359641,"sector":"softwareservices","securityType":"commonstock"}
{"symbol":"GOOG","marketPercent":0.04795,"bidSize":100,"bidPrice":959.19,"askSize":0,"askPrice":0,"volume":11240,"lastSalePrice":959.47,"lastSaleSize":60,"lastSaleTime":1506953317571,"lastUpdated":1506953360949,"sector":"softwareservices","securityType":"commonstock"}
{"symbol":"FB","marketPercent":0.0121,"bidSize":100,"bidPrice":169.9,"askSize":100,"askPrice":170.7,"volume":39042,"lastSalePrice":170.67,"lastSaleSize":100,"lastSaleTime":1506953351912,"lastUpdated":1506953362205,"sector":"softwareservices","securityType":"commonstock"}
{"symbol":"GOOG","marketPercent":0.04795,"bidSize":114,"bidPrice":870,"askSize":0,"askPrice":0,"volume":11240,"lastSalePrice":959.47,"lastSaleSize":60,"lastSaleTime":1506953317571,"lastUpdated":1506953362629,"sector":"softwareservices","securityType":"commonstock"}
Note
Az esemény időbélyege a lastUpdated, az időidőszakban van.
Prediktív modell a nagy gyakoriságú kereskedéshez
Ebben a bemutatóban a minta egy olyan lineáris modellt használ, amelyet az Order Imbalance Based Strategy in High Frequency Algorithmic Trading című cikk ismertet.
A megbízási volumen egyensúlyhiánya (VOI) az aktuális vételi/eladási ár és mennyiség, valamint az előző tickből származó vételi/eladási ár és mennyiség függvénye. A tanulmány azonosítja a VOI és a jövőbeli ármozgás közötti korrelációt. Lineáris modellt hoz létre az elmúlt öt VOI-érték és az árváltozás között a következő 10 ketyegésben. A modell lineáris regresszióval tanítja be az előző napi adatokat.
A betanított modell ezután valós időben készít árváltozási előrejelzéseket az aktuális kereskedési napon lévő árfolyamokra. Amikor a modell elég nagy árváltozást jelez előre, egy kereskedést hajt végre. A küszöbérték-beállítástól függően egyetlen részvény több ezer kereskedést hozhat létre egy kereskedési napon.
Az alábbi szakaszok bemutatják, hogyan fejezheti ki a betanítási és előrejelzési műveleteket egy Azure Stream Analytics feladatban. A teljes lekérdezés egyetlen WITH utasítás, amely egy folyamatot alkotó gyakori táblakifejezésekből (CTE-kből) áll:
| CTE-fázis | Alkalmazás célja |
|---|---|
typeconvertedquotes |
Nyers bemeneti mezők konvertálása megfelelő SQL-típusokká |
timefilteredquotes |
Árjegyzések szűrése kereskedési időre, és az érvénytelen adatok eltávolítása |
shiftedquotes |
Használja a LAG függvényt az előző tick vételi/eladási árainak lekéréséhez |
currentPriceAndVOI |
A forgalmi megbízási egyensúlyhiány (VOI) kiszámítása az aktuális és az előző tick alapján |
shiftedPriceAndShiftedVOI |
10 egymást követő középár és 2 egymást követő VOI-érték sorozatának összeállítása |
modelInput |
Adatok átalakítása funkcióvektorokká (VOI x-ként, árkülönbözet y-ként) |
modelagg / modelparambs / model |
Kétváltozós lineáris regressziós modell betanítása SZUM és AVG-aggregátumok használatával |
shiftedVOI / VOIAndModel / VOIANDModelJoined |
Az aktuális VOI-értékek összekapcsolása az előző napi betanított modellel |
prediction |
A modell várható jövőbeli árváltozásának (efpc) kiszámítása |
tradeSignal |
Vételi/eladási jelek generálása, ha az efpc túllépi a ±0.02 küszöbértéket |
Note
Ez a lekérdezés Azure Stream Analytics 1.1-es vagy újabb kompatibilitási szintet igényel, amely megőrzi a mezőnévházat a kiszámítható viselkedés érdekében az UDA-k esetében.
Idézetbeviteli mezők rendbetétele és átalakítása
A Azure Stream Analytics lekérdezés első CTE-ja megfelelően beírt SQL-oszlopokká alakítja az Event Hubsból származó nyers idézőjeladatokat. DATEADD az epoch időt (Unix-idő ezredmásodpercben) dátum-idő értékké alakítja. TRY_CAST a lekérdezés meghiúsulása nélkül kényszeríti az adattípusokat. A bemeneti mezőket a várt adattípusokra öntötte, hogy elkerülje a mezők manipulálásának vagy összehasonlításának váratlan viselkedését.
WITH
typeconvertedquotes AS (
/* convert all input fields to proper types */
SELECT
System.Timestamp AS lastUpdated,
symbol,
DATEADD(millisecond, CAST(lastSaleTime as bigint), '1970-01-01T00:00:00Z') AS lastSaleTime,
TRY_CAST(bidSize as bigint) AS bidSize,
TRY_CAST(bidPrice as float) AS bidPrice,
TRY_CAST(askSize as bigint) AS askSize,
TRY_CAST(askPrice as float) AS askPrice,
TRY_CAST(volume as bigint) AS volume,
TRY_CAST(lastSaleSize as bigint) AS lastSaleSize,
TRY_CAST(lastSalePrice as float) AS lastSalePrice
FROM quotes TIMESTAMP BY DATEADD(millisecond, CAST(lastUpdated as bigint), '1970-01-01T00:00:00Z')
),
timefilteredquotes AS (
/* filter between 7am and 1pm PST, 14:00 to 20:00 UTC */
/* clean up invalid data points */
SELECT * FROM typeconvertedquotes
WHERE DATEPART(hour, lastUpdated) >= 14 AND DATEPART(hour, lastUpdated) < 20 AND bidSize > 0 AND askSize > 0 AND bidPrice > 0 AND askPrice > 0
),
Korábbi tick-értékek lekérése a LAG függvénnyel
A Azure Stream Analytics lekérdezés következő CTE-ja a LAG függvényt használja az egyes részvényszimbólumok előző pipája szerinti ajánlat/ár és méret lekéréséhez. A LIMIT DURATION érték egy óra tetszőlegesen van kiválasztva. A jegyzési gyakoriság alapján az előző tick úgy található meg, hogy egy órát visszanéz.
shiftedquotes AS (
/* get previous bid/ask price and size in order to calculate VOI */
SELECT
symbol,
(bidPrice + askPrice)/2 AS midPrice,
bidPrice,
bidSize,
askPrice,
askSize,
LAG(bidPrice) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS bidPricePrev,
LAG(bidSize) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS bidSizePrev,
LAG(askPrice) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS askPricePrev,
LAG(askSize) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS askSizePrev
FROM timefilteredquotes
),
Mennyiségi sorrend kiegyensúlyozatlanságának kiszámítása (VOI)
A következő CTE kiszámítja a VOI-értéket az aktuális és az előző tick vételi/eladási adatai alapján. A lekérdezés kiszűri a nullértékeket azokban az esetekben, amikor nincs előző tick.
currentPriceAndVOI AS (
/* calculate VOI */
SELECT
symbol,
midPrice,
(CASE WHEN (bidPrice < bidPricePrev) THEN 0
ELSE (CASE WHEN (bidPrice = bidPricePrev) THEN (bidSize - bidSizePrev) ELSE bidSize END)
END) -
(CASE WHEN (askPrice < askPricePrev) THEN askSize
ELSE (CASE WHEN (askPrice = askPricePrev) THEN (askSize - askSizePrev) ELSE 0 END)
END) AS VOI
FROM shiftedquotes
WHERE
bidPrice IS NOT NULL AND
bidSize IS NOT NULL AND
askPrice IS NOT NULL AND
askSize IS NOT NULL AND
bidPricePrev IS NOT NULL AND
bidSizePrev IS NOT NULL AND
askPricePrev IS NOT NULL AND
askSizePrev IS NOT NULL
),
Funkcióütemezések létrehozása modellbetanításhoz
A következő CTE ismét a LAG használatával hoz létre egy sorozatot 2 egymást követő VOI-értékkel, majd 10 egymást követő középárértékkel. Ezek a sorozatok alkotják a lineáris regressziós modell betanítási adatait.
shiftedPriceAndShiftedVOI AS (
/* get 10 future prices and 2 previous VOIs */
SELECT
symbol,
midPrice AS midPrice10,
LAG(midPrice, 1) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS midPrice9,
LAG(midPrice, 2) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS midPrice8,
LAG(midPrice, 3) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS midPrice7,
LAG(midPrice, 4) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS midPrice6,
LAG(midPrice, 5) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS midPrice5,
LAG(midPrice, 6) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS midPrice4,
LAG(midPrice, 7) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS midPrice3,
LAG(midPrice, 8) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS midPrice2,
LAG(midPrice, 9) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS midPrice1,
LAG(midPrice, 10) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS midPrice,
LAG(VOI, 10) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS VOI1,
LAG(VOI, 11) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS VOI2
FROM currentPriceAndVOI
),
Adatok átalakítása funkcióvektorokká
A következő CTE átalakítja az árat és a VOI-sorozatokat egy kétváltozós lineáris modell jellemzővektorává, ahol a VOI-értékek a független változók (x1, x2), az átlagos jövőbeli árváltozás pedig a függő változó (y). A rendszer kiszűri a hiányos adatokat tartalmazó eseményeket.
modelInput AS (
/* create feature vector, x being VOI, y being delta price */
SELECT
symbol,
(midPrice1 + midPrice2 + midPrice3 + midPrice4 + midPrice5 + midPrice6 + midPrice7 + midPrice8 + midPrice9 + midPrice10)/10.0 - midPrice AS y,
VOI1 AS x1,
VOI2 AS x2
FROM shiftedPriceAndShiftedVOI
WHERE
midPrice1 IS NOT NULL AND
midPrice2 IS NOT NULL AND
midPrice3 IS NOT NULL AND
midPrice4 IS NOT NULL AND
midPrice5 IS NOT NULL AND
midPrice6 IS NOT NULL AND
midPrice7 IS NOT NULL AND
midPrice8 IS NOT NULL AND
midPrice9 IS NOT NULL AND
midPrice10 IS NOT NULL AND
midPrice IS NOT NULL AND
VOI1 IS NOT NULL AND
VOI2 IS NOT NULL
),
A lineáris regressziós modell betanítása SUM és AVG használatával
Mivel Azure Stream Analytics nem rendelkezik beépített lineáris regressziós függvénnyel, a lekérdezés SUM és AVG aggregátumokat használ a kétváltozós lineáris regressziós modell együtthatóinak (a, b1, b2) kiszámításához. A modell naponta újratanul egy 24 órás ugróablak használatával.
modelagg AS (
/* get aggregates for linear regression calculation,
http://faculty.cas.usf.edu/mbrannick/regression/Reg2IV.html */
SELECT
symbol,
SUM(x1 * x1) AS x1x1,
SUM(x2 * x2) AS x2x2,
SUM(x1 * y) AS x1y,
SUM(x2 * y) AS x2y,
SUM(x1 * x2) AS x1x2,
AVG(y) AS avgy,
AVG(x1) AS avgx1,
AVG(x2) AS avgx2
FROM modelInput
GROUP BY symbol, TumblingWindow(hour, 24, -4)
),
modelparambs AS (
/* calculate b1 and b2 for the linear model */
SELECT
symbol,
(x2x2 * x1y - x1x2 * x2y)/(x1x1 * x2x2 - x1x2 * x1x2) AS b1,
(x1x1 * x2y - x1x2 * x1y)/(x1x1 * x2x2 - x1x2 * x1x2) AS b2,
avgy,
avgx1,
avgx2
FROM modelagg
),
model AS (
/* calculate a for the linear model */
SELECT
symbol,
avgy - b1 * avgx1 - b2 * avgx2 AS a,
b1,
b2
FROM modelparambs
),
Pontozza az aktuális ajánlatokat az előző napi modell segítségével
Ha az előző napi betanított lineáris regressziós modellt szeretné használni az aktuális esemény pontozásához, a lekérdezés összekapcsolja az idézőjeleket a modell együtthatóival. A JOIN használata helyett a lekérdezés az UNION használatával egyesíti a modelleseményeket és az idézőjeles eseményeket egyetlen streamben. Ezután lag használatával párosítja az eseményeket az előző napi modellel, így pontosan egy egyezést kap. A hétvége miatt a lekérdezés három napra (72 órára) tekint vissza. Ha egyszerű JOIN-t használna, három modellt kapna minden idézőjeles eseményhez.
shiftedVOI AS (
/* get two consecutive VOIs */
SELECT
symbol,
midPrice,
VOI AS VOI1,
LAG(VOI, 1) OVER (PARTITION BY symbol LIMIT DURATION(hour, 1)) AS VOI2
FROM currentPriceAndVOI
),
VOIAndModel AS (
/* combine VOIs and models */
SELECT
'voi' AS type,
symbol,
midPrice,
VOI1,
VOI2,
0.0 AS a,
0.0 AS b1,
0.0 AS b2
FROM shiftedVOI
UNION
SELECT
'model' AS type,
symbol,
0.0 AS midPrice,
0 AS VOI1,
0 AS VOI2,
a,
b1,
b2
FROM model
),
VOIANDModelJoined AS (
/* match VOIs with the latest model within 3 days (72 hours, to take the weekend into account) */
SELECT
symbol,
midPrice,
VOI1 as x1,
VOI2 as x2,
LAG(a, 1) OVER (PARTITION BY symbol LIMIT DURATION(hour, 72) WHEN type = 'model') AS a,
LAG(b1, 1) OVER (PARTITION BY symbol LIMIT DURATION(hour, 72) WHEN type = 'model') AS b1,
LAG(b2, 1) OVER (PARTITION BY symbol LIMIT DURATION(hour, 72) WHEN type = 'model') AS b2
FROM VOIAndModel
WHERE type = 'voi'
),
Kereskedelmi jelek generálása előrejelzésekből
A végleges CTE-k kiszámítják a várható jövőbeli árváltozást (efpc) a lineáris regressziós képlet (a + b1 * x1 + b2 * x2) alkalmazásával, majd vételi/eladási jeleket generálnak egy ±0.02 küszöbérték alapján. A 10-es kereskedelmi érték vételt jelent. A -10-es kereskedelmi érték eladás.
prediction AS (
/* make prediction if there is a model */
SELECT
symbol,
midPrice,
a + b1 * x1 + b2 * x2 AS efpc
FROM VOIANDModelJoined
WHERE
a IS NOT NULL AND
b1 IS NOT NULL AND
b2 IS NOT NULL AND
x1 IS NOT NULL AND
x2 IS NOT NULL
),
tradeSignal AS (
/* generate buy/sell signals */
SELECT
DateAdd(hour, -7, System.Timestamp) AS time,
symbol,
midPrice,
efpc,
CASE WHEN (efpc > 0.02) THEN 10 ELSE (CASE WHEN (efpc < -0.02) THEN -10 ELSE 0 END) END AS trade,
DATETIMEFROMPARTS(DATEPART(year, System.Timestamp), DATEPART(month, System.Timestamp), DATEPART(day, System.Timestamp), 0, 0, 0, 0) as date
FROM prediction
),
A kereskedési stratégia tesztelése szimulációval
A kereskedési jelzések generálása után tesztelje, mennyire hatékony a kereskedési stratégia anélkül, hogy valódi kereskedést végezne.
Ez a teszt egy UDA-t használ egy felugró ablakkal, amely percenként ugra. A dátum szerinti csoportosítás és a HAVING záradék biztosítja, hogy az ablak csak az ugyanazon naphoz tartozó eseményeket számlálja. Két napra kiterjedő ugró ablak esetén a GROUP BY dátum szerint külön csoportosítja az előző és az aktuális napot. A HAVING záradék kiszűri az aktuális napon végződő, de az előző napon csoportosított ablakokat.
simulation AS
(
/* perform trade simulation for the past 7 hours to cover an entire trading day, and generate output every minute */
SELECT
DateAdd(hour, -7, System.Timestamp) AS time,
symbol,
date,
uda.TradeSimulation(tradeSignal) AS s
FROM tradeSignal
GROUP BY HoppingWindow(minute, 420, 1), symbol, date
Having DateDiff(day, date, time) < 1 AND DATEPART(hour, time) < 13
)
A JavaScript UDA inicializálja a init függvény összes akkumulátorát, kiszámítja az állapotváltást az ablakhoz hozzáadott összes eseménysel, és visszaadja a szimuláció eredményeit az ablak végén. A szimuláció ügyletenként 10 részvényre vesz fel long vagy short pozíciót. A tranzakciós költség fix $8. Az alábbi táblázat az UDA által végrehajtott négy kereskedési műveletet mutatja be:
| Condition | Szignál | Action | Pozíció ez után |
|---|---|---|---|
| Nincs jelenlegi pozíció | Vásárlás (10) | Vásárlás megnyitáshoz | Long |
| Jelenleg nincs pozíció | Eladás (-10) | Értékesítés megnyitásra (rövid) | Short |
| Hosszú pozíció | Eladás (-10) | Értékesítés bezárni, majd eladni a megnyitáshoz (rövid) | Short |
| Rövid pozíció | Vásárlás (10) | Vásárlás a bezáráshoz, majd vásárlás a megnyitáshoz | Long |
function main() {
var TRADE_COST = 8.0;
var SHARES = 10;
this.init = function () {
this.own = false;
this.pos = 0;
this.pnl = 0.0;
this.tradeCosts = 0.0;
this.buyPrice = 0.0;
this.sellPrice = 0.0;
this.buySize = 0;
this.sellSize = 0;
this.buyTotal = 0.0;
this.sellTotal = 0.0;
}
this.accumulate = function (tradeSignal, timestamp) {
if(!this.own && tradeSignal.trade == 10) {
// Buy to open
this.own = true;
this.pos = 1;
this.buyPrice = tradeSignal.midprice;
this.tradeCosts += TRADE_COST;
this.buySize += SHARES;
this.buyTotal += SHARES * tradeSignal.midprice;
} else if(!this.own && tradeSignal.trade == -10) {
// Sell to open
this.own = true;
this.pos = -1
this.sellPrice = tradeSignal.midprice;
this.tradeCosts += TRADE_COST;
this.sellSize += SHARES;
this.sellTotal += SHARES * tradeSignal.midprice;
} else if(this.own && this.pos == 1 && tradeSignal.trade == -10) {
// Sell to close
this.own = false;
this.pos = 0;
this.sellPrice = tradeSignal.midprice;
this.tradeCosts += TRADE_COST;
this.pnl += (this.sellPrice - this.buyPrice)*SHARES - 2*TRADE_COST;
this.sellSize += SHARES;
this.sellTotal += SHARES * tradeSignal.midprice;
// Sell to open
this.own = true;
this.pos = -1;
this.sellPrice = tradeSignal.midprice;
this.tradeCosts += TRADE_COST;
this.sellSize += SHARES;
this.sellTotal += SHARES * tradeSignal.midprice;
} else if(this.own && this.pos == -1 && tradeSignal.trade == 10) {
// Buy to close
this.own = false;
this.pos = 0;
this.buyPrice = tradeSignal.midprice;
this.tradeCosts += TRADE_COST;
this.pnl += (this.sellPrice - this.buyPrice)*SHARES - 2*TRADE_COST;
this.buySize += SHARES;
this.buyTotal += SHARES * tradeSignal.midprice;
// Buy to open
this.own = true;
this.pos = 1;
this.buyPrice = tradeSignal.midprice;
this.tradeCosts += TRADE_COST;
this.buySize += SHARES;
this.buyTotal += SHARES * tradeSignal.midprice;
}
}
this.computeResult = function () {
var result = {
"pnl": this.pnl,
"buySize": this.buySize,
"sellSize": this.sellSize,
"buyTotal": this.buyTotal,
"sellTotal": this.sellTotal,
"tradeCost": this.tradeCost
};
return result;
}
}
Note
A Azure Stream Analytics Power BI kimeneti összekötője a kivonásra van ütemezve. Érdemes lehet olyan alternatív kimeneti célhelyeket használni, mint például Azure Data Explorer, Azure Synapse Analytics vagy olyan adattárat, amelyhez Power BI csatlakozhat DirectQuery vagy importálás útján. További információkért lásd: Azure Stream Analytics kimenete a Power BI-ba.
Végül az Power BI irányítópulton való kimenet megjelenítése vizualizációhoz.
SELECT * INTO tradeSignalDashboard FROM tradeSignal /* output tradeSignal to PBI */
SELECT
symbol,
time,
date,
TRY_CAST(s.pnl as float) AS pnl,
TRY_CAST(s.buySize as bigint) AS buySize,
TRY_CAST(s.sellSize as bigint) AS sellSize,
TRY_CAST(s.buyTotal as float) AS buyTotal,
TRY_CAST(s.sellTotal as float) AS sellTotal
INTO pnlDashboard
FROM simulation /* output trade simulation to PBI */
Összefoglalás
Ez a cikk bemutatja, hogyan valósíthat meg reális, nagy gyakoriságú kereskedési modellt egy közepesen összetett lekérdezéssel Azure Stream Analytics. A modell öt helyett két bemeneti változót használ, mert Azure Stream Analytics nem tartalmaz beépített lineáris regressziós függvényt. Azonban javaScript UDA-kként is implementálhat kifinomultabb, magasabb dimenziójú algoritmusokat.
A lekérdezések többségét a JavaScript UDA-n kívül a Azure Stream Analytics Visual Studio Code eszközökkel is tesztelheti és hibakeresést végezhet a lekérdezések fejlesztéséhez, teszteléséhez és hibakereséséhez.
Kapcsolódó tartalom
- Azure Stream Analytics áttekintése
- Az Azure Stream Analytics lekérdezési nyelvének referenciája
JavaScript felhasználó által definiált összesítések Azure Stream Analytics - Azure Stream Analytics kimenet a Power BI-ba