AVISO: Este desafío ahora está cerrado: ya no actualizaré la tabla de clasificación y no cambiaré la respuesta aceptada. Sin embargo, puede ejecutar el controlador y actualizar la tabla de clasificación usted mismo, si lo desea.
¡Únete al chat!
Introducción
Buenas tardes, comerciantes! Todos ustedes son comerciantes de la compañía de golf PPCG. Su tarea es ganar tanto dinero como sea posible.
Reto
Escriba un programa que compre y venda acciones en la Bolsa de Valores de Stack Exchange con el objetivo de ganar la mayor cantidad de dinero posible.
Jugabilidad
Todos los jugadores comenzarán con 5 acciones y $ 100 en su banco. El juego siempre comienza con un precio por acción de $ 10.
Cada juego tendrá 1000 rondas donde la primera ronda es redonda 1
. En cada ronda, su programa recibirá cuatro argumentos como entrada: el precio actual de las acciones, la cantidad de acciones que posee, la cantidad de dinero que posee y el número de ronda (1 indexado).
Por ejemplo, si mi programa es test1.py
, el precio de la acción es 100
, el número de acciones que tengo es 3
, la cantidad de dinero que tengo es 1200
, y el número redondo es 576
, mi programa se ejecutará de la siguiente manera:
python test1.py 100 3 1200 576
En una ronda, el precio de la acción dado a cada jugador será el mismo. Esto no cambia hasta el final de la ronda.
En respuesta, el jugador debe imprimir su comando. Hay dos opciones:
- Comprar acciones: este comando se da como
bn
dónden
está el número de acciones que desea comprar. Por ejemplo, si desea comprar 100 acciones, generaría:
b100
Al comprar acciones, se le permite un sobregiro de hasta $ 1000. Si intenta comprar suficientes acciones que excedan este sobregiro (su saldo bancario es inferior a $ -1000), se declarará en quiebra. Esto significa que perderá todas sus acciones y su saldo se establecerá en $ 50.
El precio de la acción no se verá afectado por su orden si se declara en quiebra.
(Si su saldo es de $ -1000, no está en bancarrota. Sin embargo, si su saldo es de $ -1001, está en bancarrota)
- Vender acciones: este comando se da como
sn
dónden
está el número de acciones que desea vender. Por ejemplo, si desea vender 100 acciones, generaría:
s100
No puede vender más acciones de las que posee. Si intenta hacer esto, su solicitud será denegada y omitirá la ronda.
Si desea omitir la ronda y no hacer nada, imprima ya sea b0
o s0
.
Su solicitud será denegada si intenta comprar o vender un número negativo de acciones y / o un número no entero de acciones.
Después de 5 rondas, al final de cada ronda, todos los jugadores recibirán un dividendo, cuyo valor es el 5% del precio promedio promedio de las últimas 5 rondas.
¿Como funciona?
Inicialmente, el precio de la acción será de $ 10. Al final de cada ronda, se volverá a calcular utilizando la fórmula:
El precio de la acción será limitado para que nunca caiga por debajo de $ 1.
Para evitar un cambio demasiado rápido, el cambio en el precio de la acción se limita a un máximo de .
Reglas
- Tu programa debe tener un nombre
- Su programa tiene permitido un solo archivo de texto para el almacenamiento de datos. Debe almacenarse en la misma carpeta que su programa
- Incluya en su respuesta detalles sobre cómo ejecutar su programa
- Este KotH está abierto a todos los lenguajes de programación que son gratuitos y se pueden ejecutar en Windows 10
- Su puntaje se basa únicamente en el contenido de su saldo. Cualquier dinero encerrado en acciones no será contado
- Puede editar su programa en cualquier momento. Antes de cada juego, el último código se guardará y compilará
- No debe escribir código que se dirija específicamente a otro bot.
Controlador
El controlador está escrito en Python y se puede encontrar aquí: https://gist.github.com/beta-decay/a6abe40fc9f4ff6cac443395377ec31f
Al final, imprimirá una tabla de clasificación y mostrará un gráfico de cómo cambió el precio de la acción a lo largo del juego.
Por ejemplo, cuando dos bots aleatorios estaban jugando
Victorioso
El jugador con la mayor cantidad de dinero en su saldo al final del último juego gana.
Tabla de clasificación
Juego 4: 16:14 08/10/2018
Name Balance
Experienced Greedy Idiot $14802860126910608746226775271608441476740220190868405578697473058787503167301288688412912141064764060957801420415934984247914753474481204843420999117641289792179203440895025689047561483400211597324662824868794009792985857917296068788434607950379253177065699908166901854516163240207641611196996217004494096517064741782361827125867827455285639964058498121173062045074772914323311612234964464095317202678432969866099864014974786854889944224928268964434751475446606732939913688961295787813863551384458839364617299883106342420461998689419913505735314365685264187374513996061826694192786379011458348988554845036604940421113739997490412464158065355335378462589602228039730
Equalizer $763185511031294813246284506179317396432985772155750823910419030867990447973211564091988995290789610193513321528772412563772470011147066425321453744308521967943712734185479563642323459564466177543928912648398244481744861744565800383179966018254551412512770699653538211331184147038781605464336206279313836606330
Percentage Trader $448397954167281544772103458977846133762031629256561243713673243996259286459758487106045850187688160858986472490834559645508673466589151486119551222357206708156491069820990603783876340193236064700332082781080188011584263709364962735827741094223755467455209136453381715027369221484319039100339776026752813930
OYAIB $8935960891618546760585096898089377896156886097652629690033599419878768424984255852521421137695754769495085398921618469764914237729576710889307470954692315601571866328742408488796145771039574397444873926883379666840494456194839899502761180282430561362538663182006432392949099112239702124912922930
Chimps on a Typewriter $176504338999287847159247017725770908273849738720252130115528568718490320252556133502528055177870
Greedy B*****d $17689013777381240
Illiterate Dividend Investor $2367418699671980
Lucky Number 6 $4382725536910
Lone Accountant $90954970320
Buy/Reinvest $127330
Technical Analysis Robot $126930
Dollar Cost Averager $106130
Fibonacci $69930
Novice Broker $28130
Buy Low $6130
Naive Statistician $6130
Fallacious Gambler $6130
Passive Trader $4980
Half More or Nothing $4920
Monkeys on a Typewriter $66
Ver gráficos de cada concursante
Relacionado, pero la jugabilidad y el criterio ganador son muy diferentes a este desafío.
fuente
Respuestas:
El idiota codicioso experimentado
PHP, probado en PHP> = 7, también debería funcionar en versiones anteriores.
Una versión actualizada de "The Greedy Idiot" con comportamiento reestructurado y correcciones de errores relacionados con el trabajo con grandes cantidades.
Notas:
php C:\path\path\stack_exchange.php 10 5 100 1
.txt
agrega al final. Por lo tanto, ejecute con un usuario con el permiso de escritura adecuado en la ruta del script.php.ini
deben comentarse (el punto y coma al inicio de la línea debe eliminarse, si aún no lo está):; extension_dir = "ext"
;extension=gmp
fuente
php -v
. El resto no es necesario para esto. ¡Creo que tendrás muchos problemas para configurar tantos idiomas diferentes para este desafío! Nunca me atrevería a hacer algo como esto: DChimpancés en una máquina de escribir
Los chimpancés son más inteligentes que los monos, no comprarán acciones que no puedan pagar ni venderán acciones que no tienen.
Sin embargo, sigue siendo bastante aleatorio.
Ejecutar con python3, pero también debería funcionar (?) Con python2
fuente
OYAIB
Siguiendo el viejo dicho de "posee tu edad en bonos", este programa intenta hacer lo mismo. De esta manera, no estamos sujetos a la volatilidad del mercado al final del juego.
Editar: Al mirar el controlador, muestra que solo podemos comprar / vender acciones completas, pero podemos tener un saldo de cuenta fraccional.
fuente
investments
no se cuentan en su puntaje).Contador solitario
buy-sell.py
:No almacena nada
buy-sell.txt
.En rondas impares, compra tantas acciones como puede. En rondas pares, vende todas sus acciones.
La intención es aumentar el precio de las acciones comprando tantas acciones como sea posible y luego venderlas para obtener más dinero. Funciona porque la ronda final es par (ronda 1000).
A pesar de que el precio de la acción seguirá siendo el mismo (
5
) después de cada par de rondas (suponiendo que el bot esté solo, por lo tanto, Contador Solitario ), el saldo del bot aumenta, ya que el precio de venta es más alto que el precio de compra, y más saldo conduce a la capacidad de comprar más acciones. Es un círculo vicioso, pero en el buen sentido (para mí).La mayor vulnerabilidad viene con los robots malvados que juegan junto con la venta para reducir el precio de la acción (no estoy seguro si es bueno para ellos tampoco). En este caso, el bot puede permanecer con un saldo de $ -890, siempre que haya suficientes bots malvados. Este contador realmente quiere su tranquilidad. ;-)
fuente
El comerciante pasivo
Este tipo no es grande en todo este asunto de las "acciones", pero escuchó que si gasta un poco de dinero ahora, con el tiempo obtendrá pequeñas cantidades de dinero que sumarán más de lo que gastó.
Comprará suficientes acciones para llegar a $ 0 (sin sobregiro para este tipo, no se endeudará para obtener una pequeña ganancia), luego se sentará y dejará que los dividendos se acumulen
Ejecutar con python3, pero también debería funcionar (?) Con python2.
fuente
Porcentaje Trader Python3
(tal vez funciona en python2)
Instrucciones para correr
Cómo funciona
Es de esperar que los cambios eliminen los problemas causados por la división de coma flotante
fuente
El estadístico ingenuo
Hecho para Python 3, podría funcionar en Python 2
Este es un estadístico ingenuo que intenta predecir los precios de las acciones comprando / vendiendo solo si el precio ha subido / caído por más tiempo de lo habitual, mientras que también compra acciones si el precio ha bajado a uno y vende todas las acciones en la última ronda.
fuente
El promedio del costo en dólares
(probado con Python 3.7)
Primera publicación en codegolf, así que dime si hice algo mal.
La idea básica es comprar una acción cada ronda si es posible y vender todas las acciones al final.
fuente
Igualada
Divide sus recursos financieros por igual entre efectivo y acciones en cada ronda, excepto en la última. Creo que esta estrategia es una forma matemáticamente sólida de ganar al menos algo de dinero, pero se me puede demostrar que estoy equivocado.
Puede haber o no errores que no haya detectado. También golf un poco.
fuente
p, n, b, r = map(float, argv[1:])
ap, n, b, r = map(int, argv[1:])
Monos en una máquina de escribir
Es un montón de monos en máquinas de escribir. Vende o compra al azar X acciones, donde:
0 <= X <= 1,000,000
Ejecutar con python3, pero también debería funcionar (?) Con python2
fuente
cmd=random.choose(['b','s'])
ynum = str(random.randint(0, 1000000))
?import lazy
from random import randint, choice;print("{}{}".format(choice(["b", "s"]), randint(0, 1e6)))
;-PComprar bajo
(Python 2 o 3)
fuente
Jugador Fallaz
(Python 2 o 3)
fuente
El (Dyalog) APL Farmer
Un TradFn que compra todas las acciones posibles en la primera ronda y solo vende cuando el precio actual de las acciones es más alto que el precio por el que se compraron. Después de vender, el bot solo comprará acciones que sean más baratas que el precio por el que las vendió por última vez.
Eso es porque el contador del agricultor le dijo que así es como se negocian las acciones. "Compra barato, vende caro" y todo eso.
Renuncia
Este es mi primer intento de un desafío KotH, y dado que básicamente solo hago APL aquí, decidí seguir adelante.
Dicho esto, no estoy completamente seguro de si esto se podrá ejecutar junto con los otros bots, ya que es un Tradfn y no se puede alimentar directamente a un shell CMD / Bash.
Entonces, para ejecutar esto en Bash, necesita el siguiente comando:
$ echo apl_stock_farmer args | dyalog 'stock_exchange.dws' -script
Dónde:
apl_stock_farmer
es el nombre de la función, que se encuentra en la primera línea de código.args
es un vector de argumentos separados por espacios (en la primera ronda, sería10 5 100 1
).dyalog
es el camino hacia el ejecutable Dyalog'stock_exchange.dws'
es el nombre (o ruta, si el archivo no está en el mismo directorio que el shell ha abierto) del espacio de trabajo que contiene la función. Ese archivo de espacio de trabajo se puede obtener abriendo un espacio de trabajo claro, escribiendo)ed apl_stock_farmer
, pegando el código anterior y luego haciendo un)save <path>
. También puedo proporcionar este archivo de espacio de trabajo si eso fuera más fácil.-script
es solo un argumento que hace que dyalog ejecute el código dado e imprima en stdout sin abrir REPL.Desafortunadamente, no he encontrado una manera de hacerlo funcionar con Windows CMD o Powershell, así que lo ejecuté usando Git Bash. No estoy seguro de qué tan factible es poner este bot en la competencia, pero me gusta demasiado este código para no publicarlo.
fuente
Inversores analfabetos de dividendos
Supone que después de los dividendos, las personas tienen más efectivo, por lo que es más probable que compren. Se vende justo antes de los dividendos, compra justo después. Pasa por otro ciclo de venta / compra en las otras 3 rondas.
fuente
¡Compre / reinvierta tanto como sea posible!
Similar a mi Promedio de costo en dólares que, sorprendentemente, fue bastante promedio, compra cada ronda tantas acciones como sea asequible y solo las vende en la última ronda.
fuente
if balance > share_price-1000:
bloque o no?Broker novato (pero tiene la idea básica)
se_stock_exchange.rb
:Espera hasta que el precio cambie, luego compra / vende todo. Quiero decir, eso es lo que dice hacer en Day Trading for Dummies Nota: este es probablemente un libro real, y eso es probablemente algo que alguien podría obtener de él .
Guarda datos en
se_stock_exchange.data
. Ejecutar conruby se_stock_exchange.rb ${SHARE_PRICE} ${SHARES} ${MONEY} ${ROUND}
(sustituyendo los valores apropiados).fuente
se_stock_exchange.rb:24:in `<main>': undefined method `+' for nil:NilClass (NoMethodError)
Mitad más o nada
Raramente uso Python, avíseme si esto genera un error en alguna parte.
La estrategia es esperar hasta que el precio de la acción sea al menos un 50% más grande que el precio en el momento de obtenerlos, luego venderlos e inmediatamente comprar nuevas acciones para que pueda esperar el nuevo aumento del precio de las acciones.
Con suerte, los chimpancés de la
genteno comenzarán a vender acciones cerca del final ... (parece que la mayoría de los robots solo esperan el momento correcto, sea lo que sea)fuente
Fibonacci
He reescrito esto en Python 3 para facilitar las cosas. ¡Ojalá!
Compra la mitad de la cantidad máxima de acciones que es asequible cuando la ronda es igual a un número impar de Fibonacci y vende la mitad de las acciones disponibles cuando la ronda es igual a un número de Fibonacci par y también cada 100 rondas. Vende todas las acciones en la ronda 1000. De lo contrario, solo espera. Solo compra acciones cuando el saldo es positivo.
fuente
Error in roundNum%%2 : non-numeric argument to binary operator Execution halted
Codicioso b ***** d
Él entrará todo cuando sea barato y lo venderá todo una vez que el precio suba ...
fuente
sell()
que solo se necesita unoRobot de análisis técnico
Estudio economía empresarial, así que traté de realizar el método más simple para analizar un mercado de valores (el análisis técnico). Según la teoría, solo tiene que analizar todos los mínimos del gráfico para ver si hay una tendencia (hacia arriba o hacia abajo). Durante una tendencia alcista tienes que comprar y durante una tendencia a la baja tienes que vender.
No creo que este método funcione demasiado bien, pero probémoslo :)
Probado con python3
fuente
Lucky Number 6
EDITAR: Oh ffs, creo que no convertir el recuento de ventas en int fue uno de mis problemas, bueno, aquí vamos de nuevo.
Probablemente mi última contribución, a menos que esté aburrido en el trabajo y haga algo un poco más sofisticado, pero me sentí como si los robots sofisticados ya llenen los nichos.
Este tipo básicamente vende algunas de sus acciones cada 6 rondas, porque hey 6 es su número de la suerte.
fuente