¿Cómo implementar rápidamente worldquant 101 alpha usando señales de cuarzo?
Cómo encontrar inspiración para nuevos factores α se ha convertido en una cuestión inevitable para los investigadores cuantitativos.
Nos dimos cuenta de que el artículo 101 Formulated Alpha (/sol3/papers.cfm?Abstra…) publicado recientemente por Zura Kakushadze et al menciona muchos factores "alfa" basados en datos de precios, lo que nos proporcionó muchos. nueva inspiración.
Este artículo presentará brevemente la sintaxis y el significado de las expresiones del factor alfa mencionadas en el artículo, luego presentará cómo usar las señales de Quartz para implementar fácilmente estos alfa y, finalmente, proporcionará dos mejores factores alfa que aparecen en el artículo. Para referencia de todos.
Introducción al alfa formulado
Después de estudiar el artículo mencionado anteriormente, encontramos que el α formulado mencionado en el artículo usa una expresión para representar un factor α:
La expresión escrita es para calcular cada acción en función de la expresión de cada día de ajuste de posición.
Por ejemplo: 1/close; para cada acción del universo, calcula 1/closePrice y luego normaliza este vector dividiéndolo por la suma de sus valores (el resultado de sumar todos los valores es 1). Esto creará un vector de "ponderaciones" basado en todas las acciones, donde cada ponderación representará la proporción de los fondos de la cartera invertidos en esa acción.
Los datos admitidos incluyen: apertura (precio de apertura)/cierre (precio de cierre)/alto (precio más alto)/bajo (precio más bajo)/vwap (precio ponderado por volumen dentro del día)/retorno (precio único) tasa de retorno por día) y así sucesivamente.
Creemos que esta forma de expresión de la fórmula α tiene las siguientes características:
La expresión es concisa, pero oculta demasiados detalles y los usuarios no pueden ver la información de ajuste de posición específica.
Limitado por la falta de capacidad de expresión, proporciona una gran cantidad de funciones integradas para ayudar a los usuarios a completar el procesamiento de información transversal.
Las funciones integradas
se pueden dividir en dos categorías: funciones de sección transversal y funciones de series de tiempo. La mayoría de las funciones de series de tiempo llevan el nombre de ts_
ABS (x) log (x) representa el valor absoluto de x y el logaritmo natural de x respectivamente.
El rango (x) representa el orden ascendente del valor X de una acción en la sección transversal, y la clasificación cae en el intervalo cerrado de [0, 1].
El retraso (x, d) representa el valor de x d días atrás.
Delta (x, D) representa el último valor de X menos el valor de X D hace días.
Correlación (x, y, d) Covarianza (x, y, d) representa el coeficiente de correlación de Pearson y la covarianza de xey dentro de una ventana de tiempo de longitud d respectivamente.
Ts _ min (x, d) ts _ max (x, d) ts _ argmax (x, d) ts _ argmin (x, d) ts _ rango (x) suma (x, d) ) ) stddev (x, d) y así sucesivamente se pueden entender a través de los nombres de las funciones.
Para obtener explicaciones más funcionales, consulte el apéndice del artículo.
Introducción al módulo de señal Quartz
Como se menciona en el documento de ayuda de la API, el módulo de señal es una herramienta proporcionada por Friends of Minerals para facilitar la eliminación de usuarios de los investigadores de factores/señales. Los datos no relacionados con la investigación de señales se separan y la lógica de adquisición y clasificación permite a los usuarios concentrarse en desarrollar nuevas señales según sus propias ideas.
El proceso de implementación general del uso de Signal para personalizar señales es el siguiente:
def foo(data, dependencies =[' PE 39;], max_window=4):
devolver datos['PE 39;].average()
# en inicializar(cuenta)
a = señal("signal_a", foo)
Cuenta.signalgenerator=signalgenerator(a)
# en handle_data(cuenta)
cuenta señal _ resultado[' señal _ a ']
Podemos dividir el proceso de uso de señales de cuarzo en cuatro pasos:
Definir la función que implementa la lógica de la señal (la función foo en el ejemplo anterior).
Defina Signal en la función de inicialización y pase el nombre de la señal y la función de descripción como parámetros al crear una instancia de la clase Signal.
En la función de inicialización, registre la señal que se utilizará en account.signal_generator. Puede registrar múltiples señales.
Obtenga el valor de la señal calculado a través de account.signal_result en handle_data.
Nos centramos en la función de descripción de la señal que los usuarios deben completar:
La función de descripción de la señal es en realidad la lógica de procesamiento del usuario para los datos disponibles en cada día de ajuste de posición.
El nombre de la función de descripción de señal se puede definir arbitrariamente de acuerdo con la convención de nomenclatura de funciones de Python, pero sus parámetros deben ser datos de parámetros que no sean palabras clave y dos dependencias de parámetros de palabras clave y max_window.
El formato del parámetro de la relación de dependencia debe ser una lista compuesta por str. Los elementos de la lista son los nombres de los factores que utilizará la función. Para obtener una lista específica de factores de apoyo, consulte la documentación de ayuda.
El formato del parámetro de max_window es int, lo que indica que el usuario desea utilizar los datos de factor de los últimos días de max_window.
Los datos los obtiene el usuario en función de las dependencias y max_window, módulo de señal de Quartz. Su formato es un marco de datos dict Pandas, la clave es el nombre del factor y el valor es max_window*universe_length.
El valor de retorno de la función de descripción de señal debe ser una secuencia pandas con la misma longitud que el número de columnas para cada elemento de los datos.
Como se muestra en la siguiente figura:
La figura anterior describe la estructura de los datos, en la que los datos tienen un solo elemento, su clave es "PE" y su valor. es como se muestra en la tabla anterior Pandas DataFrame. Específicamente, su columna es el secID del universo y su índice es una cadena de fecha en el formato %Y%m%d.
Señal de cuarzo y fórmula α
Como se puede ver en la descripción anterior, la α formulada se puede implementar fácilmente con el módulo de señal de cuarzo. En comparación con la expresión α formulada, tiene. las siguientes ventajas:
Más intuitivo:
o Los usuarios pueden definir claramente los datos de factor requeridos y la ventana de tiempo al predefinir la función de descripción de la señal.
oLos usuarios pueden definir de manera flexible su propia frecuencia de ajuste de posición y lógica de orden en el marco de Quartz, y pueden ver intuitivamente la lista de acciones para cada ajuste de posición.
Más flexibilidad:
OFormulaic Alpha limita la evaluación de una expresión para representar el peso de las acciones correspondientes en la cartera, mientras que Quartz Signal no lo hace. Los usuarios pueden procesar valores de señal arbitrariamente según sus propias ideas en handle_data.
Los datos que describen la función de la señal O se transmiten en el formato de Pandas DataFrame, lo que permite a los usuarios ver datos transversales y datos de series de tiempo en la función al mismo tiempo, lo que brinda a los usuarios más posibilidades.
Más potente: los datos de la función de descripción de la señal se transmiten en el formato de Pandas DataFrame. Las ricas funciones integradas de Pandas pueden ayudarnos a completar tareas que solo pueden completar expresiones Alpha formuladas más complejas (consulte el artículo). ejemplo anterior).
Más datos: la señal de cuarzo no solo respalda el precio de apertura/precio de cierre/precio alto/precio bajo/volumen de negociación y otra información equivalente, sino que también respalda factores más ricos como PE y RSI.
A continuación, utilizamos el módulo de señal de cuarzo para implementar la fórmula α mencionada en el artículo:
Utiliza la señal de cuarzo para implementar la fórmula α
Utiliza el alfa en el documento WebSim 53, por ejemplo, su expresión original es:
(?1?△((((Off?Low)?(((Off?Low)?(((Off?Low)? ))?(((Apagado?Bajo))?(((Apagado?Bajo)))/((Apagado?Bajo))),9))
Simplifique para obtener ((Cerrar - Bajo) ) - (Cerrar - Alto))/(Cerrar - Bajo) Top 9 - Valor actual
Continúe simplificando: (2? ¿Cerrar? ¿Bajo? Alto)/(¿Cerrar? Bajo)
Profundizamos en este factor y encontramos:
(2? ¿Cerca? ¿Bajo? Alto)/(¿Cerca? Bajo)= 1? (¿Alto? Apagado)/(Apagado? Bajo)
La constante anterior 1 se puede eliminar mediante delta, pero en realidad se puede simplificar a (¿Alto? Apagado)/(Apagado? Bajo) - hace 9 días El valor actual de
y (Alto ? Close)/(¿Close? Low) en sí representa la posición del precio de cierre en la fluctuación intradiaria, lo que puede verse como un reflejo de la intención de compra.
Le recomendamos encarecidamente que se esfuerce por comprenderlo. la importancia económica de estos factores alfa formulados antes de implementarlos. Esto no solo profundizará su comprensión de sus principios, sino que también simplificará su implementación en algunos casos. p>
Tomamos Alpha 26 en el documento como ejemplo. Su expresión original es:
1?ts_max(correlation(ts_rank(volume, 5), ts_rank(high, 5) ), 5), 3)
Por supuesto, podemos siga su expresión original, ordene el volumen de transacciones y el precio más alto en los últimos cinco días paso a paso y luego tome el coeficiente de correlación, pero estamos familiarizados con la función incorporada de Panda DataFrame o los investigadores con amplios conocimientos estadísticos pueden encontrarlo; esa correlación (TS_rank (volumen, 5), TS_rank (alto, 5), 5) en realidad está calculando el coeficiente de correlación de rango de Spearman, utilizando la función incorporada corr (del método DataFrame = "spearman") puede completar el cálculo, que puede mejorar enormemente la eficiencia del desarrollo.
Durante nuestro proceso de simulación, descubrimos que si calculamos de acuerdo con la fórmula original, no se lograrán resultados largos ni cortos que superen al mercado y tengan una alta correlación. El volumen de operaciones y el precio más alto serán las acciones populares buscadas por el mercado y se les debe asignar mayor peso.
Por eso, en el código anterior, eliminamos el signo negativo delante de Alfa. p>
Por supuesto, puede resultar difícil comprender la importancia económica de algunos de los factores presentados en el artículo. Le recomendamos que los implemente utilizando señales de Quartz y los envíe a la comunidad para su discusión.
Si no está satisfecho con el módulo de señal de cuarzo, también puede enviarnos sus comentarios para ayudarnos a seguir mejorando.