tło
Wszyscy jesteście traderami dla nieco mniej renomowanej firmy giełdowej. Wszyscy jesteście częścią grupy traderów, którzy koncentrują się tylko na jednym konkretnym akcie.
Co godzinę każdy trader ma szansę na zakup X akcji lub sprzedaż X akcji. Istnieje 50 godzin na rundę i 3 rundy na zawody. Pod koniec wszystkich rund handlowiec o najwyższej średniej wartości wygrywa wycieczkę na Jamajkę!
Rozgrywka
Istnieją 3 rundy po 50 tur każda.
Każdy inwestor rozpoczyna rundę z 5000 $ i losową liczbą akcji od 20 do 30 akcji. Cena akcji zaczyna się od przypadkowej liczby od 10 do 150.
W każdej turze każdy handlowiec może kupić dowolną liczbę akcji, na jaką może sobie pozwolić, lub sprzedać dowolną liczbę aktualnie posiadanych akcji, każdą za bieżącą cenę za akcję.
Cena za akcję wzrasta o losową liczbę od 1 do 5 za każdy zakupiony udział i maleje o losową wartość od 2 do 6 za każdy sprzedany udział. Cena minimalna to 1 USD.
Ważne jest, aby pamiętać, że wszyscy handlowcy przetwarzają swoje transakcje w tym samym czasie, co oznacza, że każdy handlowiec kupujący / sprzedający akcje nie wpłynie na cenę do następnej tury.
Gracz z najwyższą średnią wartością na koniec 3 rund wygrywa. Wartość jest ustalana na podstawie ilości pieniędzy pozostałych na koniec rundy i dodanej liczby akcji posiadanych przez zamykającą cenę rynkową tradera *.
Argumenty
Twój program zostanie uruchomiony ponownie na początku każdej tury, otrzymując aktualną cenę rynkową, bieżącą kwotę pieniężną tradera i liczbę akcji posiadanych przez tego tradera.
Dawny:
120 5000 0
Wydajność
Twój program tradera musi wypisać literę odpowiadającą akcji, którą chciałby podjąć, a następnie ilość.
Dawny:
B10 //Buy 10 shares
lub
S3 //Sell 3 shares
Inwestor ma również opcję, aby nie robić nic, co się zmieni. Można tego dokonać, wysyłając W lub dowolne inne polecenie, które nie jest „B> amnt <” lub „S> amnt <”
Zgłoszenia
Twój program będzie w katalogu „odtwarzacze /> nazwa twojego programu <”:
+-- players
| +-- BotNameFolder
| +-- BotProgram
Podaj swój kod wraz z argumentem wiersza poleceń, aby uruchomić go z katalogu „odtwarzaczy”. Na przykład można uruchomić tradera Test1java -cp "Test1" Test1
Dodatkowe zasady
Śmiało, zastrzel się EmoWolf, Idc.
Bez bałaganu z niczym poza katalogiem BotNameFolder, możesz tworzyć tam pliki, aby uzyskać trwałe informacje podczas rund / tur.
Nie twórz celowo programów, które mogą zawiesić symulację.
Przyjmę wiele wpisów na użytkownika, o ile będą one działały jako osobne podmioty (bez wykorzystywania informacji poufnych).
Tabela liderów
[java&-cp&"TestPlayer"&Test1]:$10027395221
[python&daydreamer/daydreamer.py]:$5000
[java&-cp&"DayTrader"&DayTrader]:$4713199930331196453
Spróbuję zaktualizować tabelę wyników przynajmniej raz dziennie
Kontroler
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.Random;
public class Controller {
public static BigInteger marketValue = BigInteger.valueOf(100);
public static BigInteger newValue = BigInteger.valueOf(100);
public static final char BUY = 'B';
public static final char SELL = 'S';
public static final int MARKET_INDEX = 1;
public static final int MONEY_INDEX = 2;
public static final int SHARE_INDEX = 3;
public static int numRunning = 0;
public static final int MAX_RUNNING = 10;
public static void main(String[] args){
try {
BufferedReader br1 = new BufferedReader(new InputStreamReader(new FileInputStream("resources/config")));
int numRounds = Integer.parseInt(br1.readLine());
int turnsPerRound = Integer.parseInt(br1.readLine());
//Create the array of players
List<String> players = new LinkedList<String>();
String line1 = null;
while((line1 = br1.readLine()) != null){
players.add(line1);
}
BigInteger[] totalVals = new BigInteger[players.size()];
for(int i = 0; i < totalVals.length; i++){
totalVals[i] = BigInteger.valueOf(0);
}
br1.close();
//Begin processing
for(int round = 0; round < numRounds; round++){
//Create players' shares and currency array
Map<String,BigInteger[]> vals = new HashMap<String, BigInteger[]>();
for(int i = 0; i < players.size(); i++){
vals.put(players.get(i), new BigInteger[]{BigInteger.valueOf(5000), BigInteger.valueOf(getRandInt(20,30))});
}
marketValue = BigInteger.valueOf(getRandInt(10,150));
newValue = marketValue;
for(int turn = 0; turn < turnsPerRound; turn++){
marketValue = newValue;
Queue<Object[]> processQueue = new LinkedList<Object[]>();
for(String playerKey : vals.keySet()){
BigInteger[] valSet = vals.get(playerKey);
String[] pkParts = playerKey.split("&");
String[] parts = new String[pkParts.length + 3];
for(int i = 0; i < pkParts.length; i++){
parts[i] = pkParts[i];
}
parts[pkParts.length] = marketValue + "";
parts[pkParts.length + 1] = valSet[0] + "";
parts[pkParts.length + 2] = valSet[1] + "";
processQueue.add(new Object[]{playerKey, parts});
}
while(!processQueue.isEmpty() || numRunning > 0){
if(numRunning < MAX_RUNNING && !processQueue.isEmpty()){
numRunning++;
Object[] o = processQueue.poll();
String pKey = (String)(o[0]);
String[] p = (String[])(o[1]);
try {
Process proc = new ProcessBuilder(p).directory(new File("resources/players").getAbsoluteFile()).start();
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = br.readLine();
br.close();
switch(line.charAt(0)){
case BUY :
BigInteger numShares = new BigInteger(line.substring(1).trim());
if(numShares.multiply(marketValue).compareTo(vals.get(pKey)[0]) <= 0){
BigInteger[] tempVals = vals.get(pKey);
tempVals[0] = tempVals[0].subtract(numShares.multiply(marketValue));
tempVals[1] = tempVals[1].add(numShares);
vals.put(pKey, tempVals);
newValue = newValue.add(numShares.multiply(BigInteger.valueOf(getRandInt(0,2))));
if(newValue.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) >= 1){
newValue = BigInteger.valueOf(Integer.MAX_VALUE - 1);
}
}
break;
case SELL:
BigInteger shares = new BigInteger(line.substring(1).trim());
if(shares.compareTo(vals.get(pKey)[1]) <= 0){
BigInteger[] tempVals = vals.get(pKey);
tempVals[0] = tempVals[0].add(shares.multiply(marketValue));
tempVals[1] = tempVals[1].subtract(shares);
vals.put(pKey, tempVals);
newValue = newValue.subtract(shares.multiply(BigInteger.valueOf(getRandInt(5,10))));
if(newValue.compareTo(BigInteger.valueOf(1)) <= -1){
newValue = BigInteger.valueOf(1);
}
}
break;
}
} catch (Exception e) {
System.err.println("[" + pKey + "] threw error:");
e.printStackTrace();
} finally{
numRunning--;
}
}else{
try{
Thread.sleep(50);
continue;
}catch(InterruptedException e){
continue;
}
}
}
System.out.println("Turn " + turn + " over: " + marketValue);
}
System.out.println("End of round market value is: " + marketValue);
int count = 0;
for(String player : vals.keySet()){
totalVals[count] = totalVals[count].add(vals.get(player)[0].add(vals.get(player)[1].multiply(marketValue)));
count++;
}
newValue = BigInteger.valueOf(100);
}
for(int i = 0; i < players.size(); i++){
System.out.println("[" + players.get(i) + "]:$" + (totalVals[i].divide(BigInteger.valueOf(numRounds))));
}
} catch (Exception e) {
System.err.println("An exception occured while running the controller.");
e.printStackTrace();
}
}
public static Random r = new Random(new Date().getTime());
public static int getRandInt(int min, int max){
return r.nextInt(max - min) + min;
}
}
Skompiluj to java Controller.java
i uruchom z katalogu zawierającego katalog taki jak poniżej:
+-- resources
| +-- config
| +-- players
| +-- Player1Folder
| +-- Player1Program
| +-- Player2Folder
| +-- Player2Program
Plik config
powinien wyglądać mniej więcej tak:
3
50
java&-cp&"TestPlayer"&Test1
python&daydreamer/daydreamer.py
java&-cp&"DayTrader"&DayTrader
Pierwsza liczba to liczba rund, druga to liczba rund na rundę, a następnie polecenia uruchomienia każdego gracza.
Zastąp spacje znakami ampersands! („&”)
~ Daj mi znać, czy w ogóle mogę poprawić treść tego postu i życzę szczęśliwego handlu!
źródło
Odpowiedzi:
Przedstawiam „marzyciela”, który zawsze śpi i zapomina kupić lub sprzedać cokolwiek. Ma nadzieję, że inni gracze stracą netto. Kod Python:
działaj z
python daydreamer\daydreamer.py 120 5000 0
dowolnymi wartościami.Później odpowiem bardziej poważnie, to po prostu żeby piłka się potoczyła :)
źródło
DayTrader
Zaktualizowano dla zmiany zasad dokonanej w dniu 21.08.2014, w której gracze zaczynają teraz od 20-30 akcji.
Kupuje jak najwięcej, a następnie sprzedaje jak najwięcej.
Filozofia
Mamy nadzieję, że poniższy wzór będzie się powtarzał w kółko. Pamiętaj, że przestrzegając tego wzoru, również się do niego przyczyniamy.
Wzór na początku jest krystalicznie czysty. Wartość będzie wzrastać po pierwszej rundzie. Powinien się zmniejszyć po drugiej rundzie. Poza tym projekcje stają się rozmyte. Spodziewam się, że dobrze poradzę sobie na początku rundy, zanim rynek się ustabilizuje.
Kompiluj z
javac DayTrader.java
. Uruchom zjava -cp "DayTrader" DayTrader
.źródło
Walt Disney - Python 3
Walt czeka, aż akcje osiągną dno, a następnie kupuje tyle, ile pozwalają mu pieniądze. Następnie, gdy cena rośnie, sprzedaje je wszystkie.
Oparty na strategii Disneya, kiedy „przeżył” podczas katastrofy na Wall Street. Niestety mój program nie może budować parków rozrywki ... Jeśli tylko ...
Biegać:
Kod:
źródło
Tommy
wie tylko, co ma, ale jest zdecydowany zaryzykować wszystko na rynku. Jeśli będzie mógł kupić, zrobi to. Jeśli nie może, sprzedaje wszystko, co ma, aby mógł w następnej turze. (Będzie to działać dobrze z ekstremalnymi, takimi jak DayTrader, ale będzie autokorekty, jeśli wartość spadnie, gdy myśli, że wzrośnie.)
Golfscript
To jest ten sam kod, ale jeśli jest to preferowane. Napisałem po Javie na wypadek, gdyby potrzebna była sprawa BigInteger. Używaj tego, co jest łatwiejsze.
źródło
BuyAndHold - C
Skompiluj z: gcc buyandhold.c -o buyandhold
Uruchom z ./buyandhold AKCJE PIENIĘŻNE CENY
źródło
Alfred Pennyworth - Python 2
Pewnej nocy, kiedy byłem na patrolu, Alfred próbował stworzyć program handlu akcjami bez mojej wiedzy. Myślał, że może to przede mną ukryć, ale znalazłem to i zorientowałem się, co to zrobiło. Ponieważ jestem Batmanem. Teraz postanowiłem wziąć udział w konkursie, aby nauczyć go lekcji.
Pieniądze nie są przedmiotem Alfreda, ponieważ NAPRAWDĘ jestem bogaty, ale nadal jest mądry w swoim handlu. Kiedy nie ma akcji, kupuje tyle, ile może sobie pozwolić, bez względu na cenę rynkową. Następnie sprzedaje 10 (lub wszystkie pozostałe) akcje za każdym razem, gdy cena rynkowa jest wyższa niż cena, za którą została zakupiona.
Biegnij z:
python GoAwayMasterBruce.py <args>
źródło
AttributeError: 'ArgumentParser' object has no attribute 'parseargs'
Jakiej wersji Pythona potrzebuje?parse_args()
NaiveBot
NaiveBot jest nowy w całym tym „giełdzie”. Po prostu zakłada, że gdy cena rośnie, powinien kupować, a gdy cena spada, powinien sprzedawać. Ale nie jest sokiem, ma podstęp w rękawie! Kupuje tylko połowę tego, na co go stać, i tylko sprzedaje połowę tego, co ma.
NaiveBot nigdy więcej nie mieszka w pudełku pod autostradą!
Uruchom z
php Naivebot.php $1 $2 $3
, tworzycache.json
w bieżącym folderze.źródło
Zysk - Haskell
Kompiluj
ghc profit.hs
i uruchamiaj z./profit price money stock
.Jeśli nie jest wystarczająco wydajny, dodaj
-O3
flagę, chociaż prawdopodobnie jest to przesada: DEdytować:
„zoptymalizowany”, teraz sprzedaje wszystko, gdy cena jest równa
Integer.MAX_VALUE
.źródło
main = putStrLn . trade . map read =<< getArgs
? Mniej hałaśliwycabal install pointfree
, teraz wszyscy będą myśleć, że jesz monady na śniadanie.WaitForCrash
EDYCJA: naprawiono błąd w koncepcji
EDYCJA: teraz używając long long int
To moja pierwsza próba. Zachowuje się bardzo prosto i pozwala jednemu udziałowi rozróżnić, czy jest to pierwsza runda, czy później. W pierwszej rundzie nic nie można stracić, więc kupuje akcje. Jeśli ma akcje, to je sprzedaje. Jeśli ostatecznie ceny akcji spadną do 10, kupi ponownie.
Połącz z:
gcc waitforcrash.c -o waitforcrash
uruchom to jako
./waitforcrash PRICE MONEY SHARES
źródło
Trzęsienie ziemi
Alternatywą jest kupowanie wszystkiego i sprzedawanie wszystkiego (oprócz jednego). Tak naprawdę nie ma na celu wygrania tak bardzo, jak zakłóca wszystkich innych.
Kompiluj z
csc Earthquaker.cs
. Uruchom zEarthquaker
.źródło
System.IO.File.ReadAllText
iWriteAllText
, dzięki czemu można nieco uprościć śledzenie historii.brain.txt
pliku.MonkeyTrader (w JAVA)
Jest takie powiedzenie, że małpy są dobrymi kupcami. Robię dowód. Decyzje między „kup” a „sprzedaj” są całkowicie losowe.
źródło
IntelliTrader
W pierwszej rundzie sprzedaje swoje akcje, jeśli są w dobrej cenie: 80 USD lub więcej. Następnie sprzedaje się, jeśli cena jest taka sama lub lepsza niż ostatnia cena, w której sprzedawał, kup, jeśli cena jest taka sama lub niższa niż ostatnia cena, którą kupił.
IntelliTrader.java
Kompiluj z javac IntelliTrader . Uruchom z java -cp „IntelliTrader” IntelliTrader
źródło
theAnswerOfLifeIs42.py
Mój program uwielbia liczbę 42
Zasada jest prosta: mogę kupić 42 akcje lub sprzedać 42 akcje.
źródło
LeesonLearnt v1.1 (Java, konserwatywny)
Ponieważ zmiana reguły oznacza, że zaczynamy teraz od niektórych akcji, nie ma już gwarantowanego najlepszego pierwszego ruchu, więc uprościłem to, usuwając specjalny przypadek dla pierwszej tury.
Wywołaj jako
źródło
Uśrednianie kosztów dolara - Python 3
Ta strategia próbuje wykorzystać uśrednianie kosztu dolara, kupując (tak blisko, jak to możliwe) stałą ilość pieniędzy (arbitralnie ustaloną na 150, aby prawdopodobnie zużyła większość swoich pieniędzy do końca) w każdej turze.
źródło
Cash Is King - Python 2 lub 3
Ten facet jest bardzo pesymistycznie nastawiony do rynku akcji. Wolałby przechowywać pieniądze w gotówce, gdzie mógłby je bezpiecznie przechowywać pod swoim materacem.
źródło
Powoli i spokojnie
Tak długo, jak ma pieniądze, kupuje akcje warte 165 USD. W przeciwnym razie sprzedaje wszystkie swoje akcje, aby uzyskać więcej pieniędzy i kupić więcej akcji. W 50 rundzie zapewnia sprzedaż wszystkich akcji, ponieważ ostatecznie chcemy gotówki.
Skompiluj z javac SlowAndSteady.java. Uruchom z java -cp „SlowAndSteady” SlowAndSteady. Licznik powinien się resetować między rundami, ale jeśli plik zostanie usunięty, będzie również działał.
źródło
BuyHighSellLow
Śledzi historię rynku i kupuje, gdy cena jest niska, i sprzedaje, gdy jest wysoka.
Biegnij z:
źródło
Czas jest właściwy - Python 3
Nudziłem się, więc napisałem kolejny uczestnik ...
Ten młody przedsiębiorca żyje przez całą dobę. Kiedy nadejdzie właściwy czas, podejmuje decyzję. Irytująco używa francuskiego poza kontekstem ...;)
Biegać:
Kod:
źródło
Timer Ol '- Fortran 77
Ten starzec zmarnuje swoją emeryturę po sześćdziesięciu latach pracy jako urzędnik biurowy. Jednak w podeszłym wieku stał się dość ślepy, więc widzi tylko pierwszą liczbę każdego argumentu, więc szacuje cenę. Jego metoda jest podobna do metody Walta, z tym wyjątkiem, że Ol 'Timer jest trochę bardziej nieostrożny.
Z powodu problemów z drukowaniem w Fortranie napisałem program w Pythonie, który pomoże. Program pobiera dostarczone argumenty i przekazuje je do programu Fortran. Następnie program Python ponownie formatuje dane wyjściowe do oczekiwanego formatu.
Skompilować:
Biegać:
Kod asystenta Python:
Główny kod FORTRAN:
źródło
Test1 Trader
Kompiluj z
javac Test1.java
uruchom zjava -cp "Test1" Test1
źródło
Jeż - python2.7
Ma to głównie na celu zastrzeżenie nazwy
Uruchom jako
źródło
BuyAndSell - C
Podobny, ale nie duplikat Tommy'ego. Na przemian można kupować jak najwięcej paniki i sprzedawać wszystko. Prawie duplikat Earthquakera, który zachowuje jedną akcję, podczas gdy BuyAndSell sprzedaje wszystkie akcje. BuyAndSell nie podejmuje żadnych działań, gdy nie ma akcji do sprzedaży, ale nie ma wystarczającej ilości pieniędzy, aby kupić jedną akcję.
Skompiluj z „gcc buyandsell.c -o buyandsell”
Uruchom jako „./buyandsell AKCJE PIENIĘŻNE CENY
źródło
Gorge Soros
Kupuje powoli, niż sprzedaje wszystko, próbując załamać rynek.
Biegnij z:
Soros.rb price money stock
źródło
Do not intentionally create programs to crash the simulation.