crowdcent-challenge 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- crowdcent_challenge-0.1.0/.github/workflows/ci.yml +37 -0
- crowdcent_challenge-0.1.0/.gitignore +15 -0
- crowdcent_challenge-0.1.0/.python-version +1 -0
- crowdcent_challenge-0.1.0/CNAME +1 -0
- crowdcent_challenge-0.1.0/LICENSE +21 -0
- crowdcent_challenge-0.1.0/PKG-INFO +28 -0
- crowdcent_challenge-0.1.0/README.md +16 -0
- crowdcent_challenge-0.1.0/docs/CNAME +1 -0
- crowdcent_challenge-0.1.0/docs/about.md +5 -0
- crowdcent_challenge-0.1.0/docs/changelog.md +8 -0
- crowdcent_challenge-0.1.0/docs/cli.md +142 -0
- crowdcent_challenge-0.1.0/docs/cli_reference.md +9 -0
- crowdcent_challenge-0.1.0/docs/contributing.md +27 -0
- crowdcent_challenge-0.1.0/docs/data.md +115 -0
- crowdcent_challenge-0.1.0/docs/disclaimer.md +2 -0
- crowdcent_challenge-0.1.0/docs/examples.md +176 -0
- crowdcent_challenge-0.1.0/docs/index.md +44 -0
- crowdcent_challenge-0.1.0/docs/installation.md +17 -0
- crowdcent_challenge-0.1.0/docs/overrides/assets/images/cc_logo.png +0 -0
- crowdcent_challenge-0.1.0/docs/overrides/assets/stylesheets/extra.css +417 -0
- crowdcent_challenge-0.1.0/docs/python_reference.md +35 -0
- crowdcent_challenge-0.1.0/docs/quickstart.md +172 -0
- crowdcent_challenge-0.1.0/docs/rules.md +0 -0
- crowdcent_challenge-0.1.0/docs/scoring.md +0 -0
- crowdcent_challenge-0.1.0/mkdocs.yml +113 -0
- crowdcent_challenge-0.1.0/pyproject.toml +32 -0
- crowdcent_challenge-0.1.0/src/crowdcent_challenge/__init__.py +17 -0
- crowdcent_challenge-0.1.0/src/crowdcent_challenge/cli.py +281 -0
- crowdcent_challenge-0.1.0/src/crowdcent_challenge/client.py +443 -0
- crowdcent_challenge-0.1.0/src/crowdcent_challenge/py.typed +0 -0
- crowdcent_challenge-0.1.0/src/crowdcent_challenge/scoring.py +0 -0
- crowdcent_challenge-0.1.0/uv.lock +809 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
name: ci
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches:
|
|
5
|
+
- master
|
|
6
|
+
- main
|
|
7
|
+
permissions:
|
|
8
|
+
contents: write
|
|
9
|
+
jobs:
|
|
10
|
+
deploy:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v4
|
|
14
|
+
- name: Configure Git Credentials
|
|
15
|
+
run: |
|
|
16
|
+
git config user.name github-actions[bot]
|
|
17
|
+
git config user.email 41898282+github-actions[bot]@users.noreply.github.com
|
|
18
|
+
- uses: actions/setup-python@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: 3.x
|
|
21
|
+
- run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV
|
|
22
|
+
- uses: actions/cache@v4
|
|
23
|
+
with:
|
|
24
|
+
key: mkdocs-material-${{ env.cache_id }}
|
|
25
|
+
path: .cache
|
|
26
|
+
restore-keys: |
|
|
27
|
+
mkdocs-material-
|
|
28
|
+
- name: Install uv
|
|
29
|
+
run: |
|
|
30
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
31
|
+
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
|
|
32
|
+
- name: Install dependencies
|
|
33
|
+
run: |
|
|
34
|
+
uv pip install mkdocs-material mkdocs-click mkdocstrings[python] mkdocs-marimo --system
|
|
35
|
+
# Install the package itself so CLI docs can be generated
|
|
36
|
+
uv pip install -e . --system
|
|
37
|
+
- run: mkdocs gh-deploy --force
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
docs.crowdcent.com
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 CrowdCent LLC
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: crowdcent-challenge
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Crowdcent Challenge Python Client
|
|
5
|
+
Author-email: Jason Rosenfeld <jason@crowdcent.com>
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Requires-Python: >=3.12
|
|
8
|
+
Requires-Dist: click>=8.1.8
|
|
9
|
+
Requires-Dist: python-dotenv>=1.1.0
|
|
10
|
+
Requires-Dist: requests>=2.32.3
|
|
11
|
+
Description-Content-Type: text/markdown
|
|
12
|
+
|
|
13
|
+

|
|
14
|
+

|
|
15
|
+

|
|
16
|
+
[](https://github.com/astral-sh/uv)
|
|
17
|
+
[](https://github.com/astral-sh/ruff)
|
|
18
|
+

|
|
19
|
+

|
|
20
|
+
|
|
21
|
+
# CrowdCent Challenge
|
|
22
|
+
The CrowdCent Challenge is an open data science competition. This documentation is currently being updated. Please check back soon for detailed information about the challenge rules and format.
|
|
23
|
+
|
|
24
|
+
**Documentation**: [docs.crowdcent.com](https://docs.crowdcent.com)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
## Have Questions?
|
|
28
|
+
If you need immediate assistance, please email us at info@crowdcent.com or join our [Discord server](https://discord.gg/crowdcent).
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+

|
|
2
|
+

|
|
3
|
+

|
|
4
|
+
[](https://github.com/astral-sh/uv)
|
|
5
|
+
[](https://github.com/astral-sh/ruff)
|
|
6
|
+

|
|
7
|
+

|
|
8
|
+
|
|
9
|
+
# CrowdCent Challenge
|
|
10
|
+
The CrowdCent Challenge is an open data science competition. This documentation is currently being updated. Please check back soon for detailed information about the challenge rules and format.
|
|
11
|
+
|
|
12
|
+
**Documentation**: [docs.crowdcent.com](https://docs.crowdcent.com)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## Have Questions?
|
|
16
|
+
If you need immediate assistance, please email us at info@crowdcent.com or join our [Discord server](https://discord.gg/crowdcent).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
docs.crowdcent.com
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# About CrowdCent
|
|
2
|
+
|
|
3
|
+
CrowdCent is on a mission to decentralize investment management by changing the way investment funds make decisions and allocate capital. We are the machine learning and coordination layer for online investment communities looking to turn their data into actionable, investable portfolios.
|
|
4
|
+
|
|
5
|
+
More information about CrowdCent can be found on [crowdcent.com](https://crowdcent.com).
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Command Line Interface (CLI) Usage
|
|
2
|
+
|
|
3
|
+
The package provides a command-line interface (CLI) called `crowdcent` for quick interactions with the API.
|
|
4
|
+
|
|
5
|
+
## Authentication
|
|
6
|
+
|
|
7
|
+
The CLI requires your API key for authentication. It looks for the key in the following order:
|
|
8
|
+
|
|
9
|
+
1. The `CROWDCENT_API_KEY` environment variable.
|
|
10
|
+
2. A `.env` file in the current working directory containing `CROWDCENT_API_KEY=your_key_here`.
|
|
11
|
+
|
|
12
|
+
If the key is not found, the CLI commands will fail with an authentication error.
|
|
13
|
+
|
|
14
|
+
## General Usage
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
crowdcent [OPTIONS] COMMAND [ARGS]...
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Get help on the main command or subcommands:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
crowdcent --help
|
|
24
|
+
crowdcent list-challenges --help
|
|
25
|
+
crowdcent submit --help
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Commands
|
|
29
|
+
|
|
30
|
+
### Challenges
|
|
31
|
+
|
|
32
|
+
* List active challenges:
|
|
33
|
+
```bash
|
|
34
|
+
crowdcent list-challenges
|
|
35
|
+
```
|
|
36
|
+
Output is JSON formatted.
|
|
37
|
+
|
|
38
|
+
* Get specific challenge details:
|
|
39
|
+
```bash
|
|
40
|
+
crowdcent get-challenge <CHALLENGE_SLUG>
|
|
41
|
+
```
|
|
42
|
+
Replace `<CHALLENGE_SLUG>` with the actual challenge slug (e.g., `crowdcent get-challenge stock-prediction`). Output is JSON formatted.
|
|
43
|
+
|
|
44
|
+
### Training Data
|
|
45
|
+
|
|
46
|
+
* List training datasets for a challenge:
|
|
47
|
+
```bash
|
|
48
|
+
crowdcent list-training-data <CHALLENGE_SLUG>
|
|
49
|
+
```
|
|
50
|
+
Output is JSON formatted.
|
|
51
|
+
|
|
52
|
+
* Get the latest training dataset for a challenge:
|
|
53
|
+
```bash
|
|
54
|
+
crowdcent get-latest-training-data <CHALLENGE_SLUG>
|
|
55
|
+
```
|
|
56
|
+
Output is JSON formatted.
|
|
57
|
+
|
|
58
|
+
* Get specific training dataset details:
|
|
59
|
+
```bash
|
|
60
|
+
crowdcent get-training-data <CHALLENGE_SLUG> <VERSION>
|
|
61
|
+
```
|
|
62
|
+
Replace `<CHALLENGE_SLUG>` with the challenge slug and `<VERSION>` with the version string (e.g., `1.0`). Output is JSON formatted.
|
|
63
|
+
|
|
64
|
+
* Download training dataset file:
|
|
65
|
+
```bash
|
|
66
|
+
crowdcent download-training-data <CHALLENGE_SLUG> <VERSION> [-o <OUTPUT_PATH>]
|
|
67
|
+
```
|
|
68
|
+
- Replace `<CHALLENGE_SLUG>` with the challenge slug.
|
|
69
|
+
- Replace `<VERSION>` with the version string or `latest` for the latest version.
|
|
70
|
+
- The `-o` or `--output` flag is optional. If omitted, the file is saved as `<CHALLENGE_SLUG>_training_v<VERSION>.parquet` in the current directory.
|
|
71
|
+
|
|
72
|
+
Example:
|
|
73
|
+
```bash
|
|
74
|
+
crowdcent download-training-data stock-prediction 1.0 -o data/training_data.parquet
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Inference Data
|
|
78
|
+
|
|
79
|
+
* List inference data periods for a challenge:
|
|
80
|
+
```bash
|
|
81
|
+
crowdcent list-inference-data <CHALLENGE_SLUG>
|
|
82
|
+
```
|
|
83
|
+
Output is JSON formatted.
|
|
84
|
+
|
|
85
|
+
* Get the current inference data period for a challenge:
|
|
86
|
+
```bash
|
|
87
|
+
crowdcent get-current-inference-data <CHALLENGE_SLUG>
|
|
88
|
+
```
|
|
89
|
+
Output is JSON formatted.
|
|
90
|
+
|
|
91
|
+
* Get specific inference data period details:
|
|
92
|
+
```bash
|
|
93
|
+
crowdcent get-inference-data <CHALLENGE_SLUG> <RELEASE_DATE>
|
|
94
|
+
```
|
|
95
|
+
Replace `<CHALLENGE_SLUG>` with the challenge slug and `<RELEASE_DATE>` with the date in `YYYY-MM-DD` format. Output is JSON formatted.
|
|
96
|
+
|
|
97
|
+
* Download inference features file:
|
|
98
|
+
```bash
|
|
99
|
+
crowdcent download-inference-data <CHALLENGE_SLUG> <RELEASE_DATE> [-o <OUTPUT_PATH>]
|
|
100
|
+
```
|
|
101
|
+
- Replace `<CHALLENGE_SLUG>` with the challenge slug.
|
|
102
|
+
- Replace `<RELEASE_DATE>` with the date in `YYYY-MM-DD` format or `current` for the current period.
|
|
103
|
+
- The `-o` or `--output` flag is optional. If omitted, the file is saved as `<CHALLENGE_SLUG>_inference_<RELEASE_DATE>.parquet` in the current directory.
|
|
104
|
+
|
|
105
|
+
Example:
|
|
106
|
+
```bash
|
|
107
|
+
crowdcent download-inference-data stock-prediction 2025-01-15 -o data/inference_features.parquet
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Submissions
|
|
111
|
+
|
|
112
|
+
* List your submissions for a challenge:
|
|
113
|
+
```bash
|
|
114
|
+
crowdcent list-submissions <CHALLENGE_SLUG> [--period <PERIOD>]
|
|
115
|
+
```
|
|
116
|
+
- Replace `<CHALLENGE_SLUG>` with the challenge slug.
|
|
117
|
+
- The `--period` flag is optional. It can be set to `current` for the current period or a date in `YYYY-MM-DD` format to filter by period.
|
|
118
|
+
|
|
119
|
+
Output is JSON formatted.
|
|
120
|
+
|
|
121
|
+
* Get specific submission details:
|
|
122
|
+
```bash
|
|
123
|
+
crowdcent get-submission <CHALLENGE_SLUG> <SUBMISSION_ID>
|
|
124
|
+
```
|
|
125
|
+
Replace `<CHALLENGE_SLUG>` with the challenge slug and `<SUBMISSION_ID>` with the actual ID. Output is JSON formatted.
|
|
126
|
+
|
|
127
|
+
* Submit predictions:
|
|
128
|
+
```bash
|
|
129
|
+
crowdcent submit <CHALLENGE_SLUG> <PATH_TO_PREDICTIONS_PARQUET>
|
|
130
|
+
```
|
|
131
|
+
Replace `<CHALLENGE_SLUG>` with the challenge slug and `<PATH_TO_PREDICTIONS_PARQUET>` with the path to your prediction file.
|
|
132
|
+
|
|
133
|
+
The file must be a valid Parquet file with the required columns: `id`, `pred_1M`, `pred_3M`, `pred_6M`, `pred_9M`, and `pred_12M`.
|
|
134
|
+
|
|
135
|
+
Example:
|
|
136
|
+
```bash
|
|
137
|
+
crowdcent submit stock-prediction results/my_submission.parquet
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Error Handling
|
|
141
|
+
|
|
142
|
+
The CLI will print error messages to standard error if an API call fails or if invalid arguments are provided.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
Contributions are welcome! The `crowdcent-challenge` API client and documentation are open-source projects and contributions can be as simple as a fact check or as complex as a new feature.
|
|
3
|
+
|
|
4
|
+
Here's a breakdown of the standard GitHub workflow:
|
|
5
|
+
|
|
6
|
+
1. Fork the [repository](https://github.com/crowdcent/crowdcent-challenge)
|
|
7
|
+
2. Clone your fork:
|
|
8
|
+
```bash
|
|
9
|
+
git clone https://github.com/<your-username>/crowdcent-challenge.git
|
|
10
|
+
cd crowdcent-challenge
|
|
11
|
+
uv pip install -e .[dev]
|
|
12
|
+
```
|
|
13
|
+
3. Branch off:
|
|
14
|
+
```bash
|
|
15
|
+
git checkout -b my-feature
|
|
16
|
+
```
|
|
17
|
+
4. Make changes & test
|
|
18
|
+
5. Commit with clear messages:
|
|
19
|
+
```bash
|
|
20
|
+
git commit -m "feat: Add new feature"
|
|
21
|
+
```
|
|
22
|
+
6. Push & open a PR from your fork
|
|
23
|
+
```bash
|
|
24
|
+
git push origin my-feature
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Include tests where appropriate. Keep PRs focused - one feature/fix per PR.
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# Data
|
|
2
|
+
|
|
3
|
+
## Data Structure
|
|
4
|
+
|
|
5
|
+
The CrowdCent Challenge platform organizes data into the following hierarchy:
|
|
6
|
+
|
|
7
|
+
1. **Challenges** - The top-level competitions (e.g., "Stock Price Prediction Challenge")
|
|
8
|
+
2. **Training Datasets** - Versioned datasets used for training your models
|
|
9
|
+
3. **Inference Data** - Periodic releases of new data for making predictions
|
|
10
|
+
4. **Submissions** - Your predictions for inference data periods
|
|
11
|
+
|
|
12
|
+
### Challenge Data
|
|
13
|
+
|
|
14
|
+
Each challenge focuses on a specific prediction task. A challenge has:
|
|
15
|
+
|
|
16
|
+
- A unique slug (identifier in URLs)
|
|
17
|
+
- A name and description
|
|
18
|
+
- Start and end dates
|
|
19
|
+
- Associated training datasets and inference periods
|
|
20
|
+
|
|
21
|
+
### Training Datasets
|
|
22
|
+
|
|
23
|
+
Training datasets provide labeled data for building your models. Each training dataset has:
|
|
24
|
+
|
|
25
|
+
- A version (e.g., "1.0", "2.1")
|
|
26
|
+
- Feature and target descriptions
|
|
27
|
+
- A Parquet file containing training data with features and ground truth labels
|
|
28
|
+
|
|
29
|
+
Training datasets may be updated with new versions over time, but only one version is marked as "latest" at any time.
|
|
30
|
+
|
|
31
|
+
### Inference Data
|
|
32
|
+
|
|
33
|
+
Inference data represents periodic releases of new data for which you will make predictions. Each inference data period has:
|
|
34
|
+
|
|
35
|
+
- A release date
|
|
36
|
+
- A submission deadline
|
|
37
|
+
- A Parquet file containing features (but not targets) for inference
|
|
38
|
+
|
|
39
|
+
## Data Features and Format
|
|
40
|
+
|
|
41
|
+
All data is provided in Parquet format, a columnar storage file format optimized for analytical processing.
|
|
42
|
+
|
|
43
|
+
### Dataset Components
|
|
44
|
+
|
|
45
|
+
#### Identifier (`id`)
|
|
46
|
+
- A unique numerical identifier assigned to each investment idea submission
|
|
47
|
+
- This `id` is obfuscated and does not directly reveal the underlying security or analyst
|
|
48
|
+
|
|
49
|
+
#### Features
|
|
50
|
+
The features are derived from the content and context of the investment idea submission:
|
|
51
|
+
|
|
52
|
+
**NLP Features**
|
|
53
|
+
- Generated by processing the analyst's investment write-up text
|
|
54
|
+
- Include embeddings related to different aspects discussed in the write-up (e.g., catalysts, financials, management)
|
|
55
|
+
- Named like `nlp_groupname_N` (e.g., `nlp_catalyst_0`, `nlp_financials_15`)
|
|
56
|
+
- Contain numerical values representing elements of the embedding vectors
|
|
57
|
+
|
|
58
|
+
**Point-in-Time Features**
|
|
59
|
+
- Based on market conditions, fundamental data, or other factors known *at the time the idea was submitted*
|
|
60
|
+
- Obfuscated and named like `fundamental_N`, `market_N`, `categorical_N`, etc.
|
|
61
|
+
- Contain numerical values
|
|
62
|
+
|
|
63
|
+
#### Prediction Target
|
|
64
|
+
Your goal is to predict return values for different time horizons. For each inference data point, you must submit predictions for the following time horizons:
|
|
65
|
+
|
|
66
|
+
- `pred_1M`: Predicted return after 1 month
|
|
67
|
+
- `pred_3M`: Predicted return after 3 months
|
|
68
|
+
- `pred_6M`: Predicted return after 6 months
|
|
69
|
+
- `pred_9M`: Predicted return after 9 months
|
|
70
|
+
- `pred_12M`: Predicted return after 12 months
|
|
71
|
+
|
|
72
|
+
## Submission Format
|
|
73
|
+
|
|
74
|
+
Submissions must be Parquet files with the following columns:
|
|
75
|
+
|
|
76
|
+
| Column | Description |
|
|
77
|
+
|--------|-------------|
|
|
78
|
+
| `id` | Unique identifier matching the inference data |
|
|
79
|
+
| `pred_1M` | Predicted 1-month return |
|
|
80
|
+
| `pred_3M` | Predicted 3-month return |
|
|
81
|
+
| `pred_6M` | Predicted 6-month return |
|
|
82
|
+
| `pred_9M` | Predicted 9-month return |
|
|
83
|
+
| `pred_12M` | Predicted 12-month return |
|
|
84
|
+
|
|
85
|
+
All prediction columns must contain numeric values (float or integer). Missing values are not allowed.
|
|
86
|
+
|
|
87
|
+
## Example Data Snippet
|
|
88
|
+
|
|
89
|
+
The following table shows a small, purely illustrative example of what a few rows of the data might look like. The column names follow the conventions described above, but the values are entirely fictional and intended only to demonstrate the format. The actual number of features and their ranges will vary.
|
|
90
|
+
|
|
91
|
+
### Example Training Data:
|
|
92
|
+
|
|
93
|
+
| id | nlp_catalyst_0 | nlp_catalyst_1 | fundamental_0 | market_0 | market_1 | categorical_0 | target_1M | target_3M | target_6M | target_9M | target_12M |
|
|
94
|
+
| ---: | -------------: | -------------: | ------------: | -------: | -------: | ------------: | --------: | --------: | --------: | --------: | ---------: |
|
|
95
|
+
| 1001 | 0.123456 | -0.987654 | 12.340000 | 105.50 | 250000 | 1 | 0.05 | 0.12 | 0.18 | 0.22 | 0.25 |
|
|
96
|
+
| 1002 | -0.543210 | 0.010101 | 0.987000 | 32.15 | 1500000 | 3 | -0.02 | -0.08 | -0.15 | -0.10 | -0.05 |
|
|
97
|
+
| 1003 | 0.678901 | 1.234567 | -5.670000 | 210.75 | 750000 | 1 | 0.10 | 0.25 | 0.40 | 0.45 | 0.50 |
|
|
98
|
+
| 1004 | 0.314159 | -0.271828 | 55.432100 | 88.90 | 120000 | 2 | 0.07 | 0.14 | 0.20 | 0.18 | 0.15 |
|
|
99
|
+
|
|
100
|
+
### Example Inference Data (for prediction):
|
|
101
|
+
|
|
102
|
+
| id | nlp_catalyst_0 | nlp_catalyst_1 | fundamental_0 | market_0 | market_1 | categorical_0 |
|
|
103
|
+
| ---: | -------------: | -------------: | ------------: | -------: | -------: | ------------: |
|
|
104
|
+
| 2001 | 0.234567 | -0.876543 | 15.430000 | 110.25 | 275000 | 2 |
|
|
105
|
+
| 2002 | -0.432109 | 0.121212 | 1.876000 | 29.75 | 1300000 | 3 |
|
|
106
|
+
| 2003 | 0.567890 | 0.987654 | -4.560000 | 205.50 | 800000 | 1 |
|
|
107
|
+
|
|
108
|
+
### Example Submission (your predictions):
|
|
109
|
+
|
|
110
|
+
| id | pred_1M | pred_3M | pred_6M | pred_9M | pred_12M |
|
|
111
|
+
| ---: | ------: | ------: | ------: | ------: | -------: |
|
|
112
|
+
| 2001 | 0.06 | 0.14 | 0.19 | 0.23 | 0.27 |
|
|
113
|
+
| 2002 | -0.01 | -0.07 | -0.13 | -0.09 | -0.03 |
|
|
114
|
+
| 2003 | 0.11 | 0.27 | 0.42 | 0.48 | 0.53 |
|
|
115
|
+
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
# Disclaimer
|
|
2
|
+
Under no circumstances should any information provided in this software — or on associated distribution outlets — be construed as an offer soliciting the purchase or sale of any security or interest in any pooled investment vehicle sponsored, discussed, or mentioned by CrowdCent LLC or affiliates. Nor should it be construed as an offer to provide investment advisory services; an offer to invest in a CrowdCent investment vehicle will be made separately and only by means of the confidential offering documents of the specific pooled investment vehicles — which should be read in their entirety, and only to those who, among other requirements, meet certain qualifications under federal securities laws. Such investors, defined as accredited investors and qualified purchasers, are generally deemed capable of evaluating the merits and risks of prospective investments and financial matters. There can be no assurances that CrowdCent's investment objectives will be achieved or investment strategies will be successful. Any investment in a vehicle managed by CrowdCent involves a high degree of risk including the risk that the entire amount invested is lost. Any investments or portfolio companies mentioned, referred to, or described are not representative of all investments in vehicles managed by CrowdCent and there can be no assurance that the investments will be profitable or that other investments made in the future will have similar characteristics or results.
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Interactive Examples
|
|
2
|
+
|
|
3
|
+
## Fetching Challenges and Inference Data
|
|
4
|
+
|
|
5
|
+
This example demonstrates how to use the `ChallengeClient` to fetch available challenges and get details about the current inference data period. You can optionally provide your API key below, or leave it blank if you have the `CROWDCENT_API_KEY` environment variable or a `.env` file configured.
|
|
6
|
+
|
|
7
|
+
/// marimo-embed
|
|
8
|
+
height: 750px
|
|
9
|
+
mode: edit
|
|
10
|
+
app_width: full
|
|
11
|
+
|
|
12
|
+
```python
|
|
13
|
+
@app.cell(hide_code=True)
|
|
14
|
+
def _(mo):
|
|
15
|
+
mo.md(r"""## Challenge Information""")
|
|
16
|
+
return
|
|
17
|
+
|
|
18
|
+
# Cell 1: Input for API Key (optional)
|
|
19
|
+
@app.cell
|
|
20
|
+
def __():
|
|
21
|
+
import marimo as mo
|
|
22
|
+
api_key_input = mo.ui.text(
|
|
23
|
+
placeholder="Leave blank to use env/dotenv",
|
|
24
|
+
label="API Key (Optional)",
|
|
25
|
+
kind="password",
|
|
26
|
+
)
|
|
27
|
+
# Display the input field
|
|
28
|
+
api_key_input
|
|
29
|
+
# Return it so other cells can use its value
|
|
30
|
+
return api_key_input, mo
|
|
31
|
+
|
|
32
|
+
# Cell 2: Fetch and display challenges
|
|
33
|
+
@app.cell
|
|
34
|
+
def __(api_key_input, mo):
|
|
35
|
+
from crowdcent_challenge import ChallengeClient, CrowdcentAPIError, AuthenticationError
|
|
36
|
+
|
|
37
|
+
# Initialize placeholder text
|
|
38
|
+
challenge_info = mo.md("Enter your API key above and click 'List Challenges' to begin.")
|
|
39
|
+
|
|
40
|
+
# Create button for listing challenges
|
|
41
|
+
list_challenges_button = mo.ui.button(label="List Challenges")
|
|
42
|
+
|
|
43
|
+
# React to the button click (its value increments each time)
|
|
44
|
+
if list_challenges_button.value > 0:
|
|
45
|
+
# Get API key from input if provided, else None
|
|
46
|
+
api_key = api_key_input.value or None
|
|
47
|
+
try:
|
|
48
|
+
# Initialize client
|
|
49
|
+
client = ChallengeClient(api_key=api_key)
|
|
50
|
+
challenges = client.list_challenges()
|
|
51
|
+
|
|
52
|
+
if not challenges:
|
|
53
|
+
challenge_info = mo.md("No active challenges found.")
|
|
54
|
+
else:
|
|
55
|
+
# Create a dropdown to select a challenge
|
|
56
|
+
challenge_options = {c['name']: c['slug'] for c in challenges}
|
|
57
|
+
challenge_dropdown = mo.ui.dropdown(
|
|
58
|
+
options=challenge_options,
|
|
59
|
+
label="Select a Challenge",
|
|
60
|
+
value=list(challenge_options.values())[0] if challenge_options else None
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
challenge_info = mo.vstack([
|
|
64
|
+
mo.md(f"**Found {len(challenges)} active challenges:**"),
|
|
65
|
+
challenge_dropdown
|
|
66
|
+
])
|
|
67
|
+
except AuthenticationError:
|
|
68
|
+
challenge_info = mo.md(
|
|
69
|
+
f"""
|
|
70
|
+
**Authentication Error!**
|
|
71
|
+
|
|
72
|
+
Please ensure your `CROWDCENT_API_KEY` is set correctly
|
|
73
|
+
in your environment or a `.env` file, or enter it above.
|
|
74
|
+
"""
|
|
75
|
+
)
|
|
76
|
+
except CrowdcentAPIError as e:
|
|
77
|
+
challenge_info = mo.md(f"**API Error:** `{e}`")
|
|
78
|
+
except Exception as e:
|
|
79
|
+
challenge_info = mo.md(f"**Unexpected Error:** `{e}`")
|
|
80
|
+
|
|
81
|
+
# Display the button and results
|
|
82
|
+
mo.vstack([list_challenges_button, challenge_info])
|
|
83
|
+
|
|
84
|
+
# Return values for the next cell
|
|
85
|
+
return mo, AuthenticationError, ChallengeClient, CrowdcentAPIError, list_challenges_button
|
|
86
|
+
|
|
87
|
+
# Cell 3: Get information about selected challenge
|
|
88
|
+
@app.cell
|
|
89
|
+
def __(mo, api_key_input, list_challenges_button, AuthenticationError, ChallengeClient, CrowdcentAPIError):
|
|
90
|
+
# Initialize placeholder for challenge details
|
|
91
|
+
challenge_details = mo.md("Select a challenge above to view details.")
|
|
92
|
+
|
|
93
|
+
# Only proceed if challenges have been loaded
|
|
94
|
+
if list_challenges_button.value > 0 and "_5" in globals():
|
|
95
|
+
challenge_dropdown = globals()["_5"].get("challenge_dropdown")
|
|
96
|
+
|
|
97
|
+
if challenge_dropdown and challenge_dropdown.value:
|
|
98
|
+
get_details_button = mo.ui.button(label="Get Challenge Details")
|
|
99
|
+
|
|
100
|
+
if get_details_button.value > 0:
|
|
101
|
+
# Get API key from input if provided, else None
|
|
102
|
+
api_key = api_key_input.value or None
|
|
103
|
+
try:
|
|
104
|
+
# Initialize client
|
|
105
|
+
client = ChallengeClient(api_key=api_key)
|
|
106
|
+
selected_slug = challenge_dropdown.value
|
|
107
|
+
|
|
108
|
+
# Fetch challenge details
|
|
109
|
+
challenge = client.get_challenge(selected_slug)
|
|
110
|
+
|
|
111
|
+
# Try to get current inference period
|
|
112
|
+
try:
|
|
113
|
+
current_period = client.get_current_inference_data(selected_slug)
|
|
114
|
+
period_info = f"""
|
|
115
|
+
**Current Inference Period:**
|
|
116
|
+
* Release Date: {current_period.get('release_date', 'N/A')}
|
|
117
|
+
* Submission Deadline: {current_period.get('submission_deadline', 'N/A')}
|
|
118
|
+
* Time Remaining: {current_period.get('time_remaining', 'N/A')}
|
|
119
|
+
"""
|
|
120
|
+
except Exception as e:
|
|
121
|
+
period_info = f"""
|
|
122
|
+
**No Active Inference Period**
|
|
123
|
+
{str(e)}
|
|
124
|
+
"""
|
|
125
|
+
|
|
126
|
+
# Try to get latest training data
|
|
127
|
+
try:
|
|
128
|
+
latest_training = client.get_latest_training_dataset(selected_slug)
|
|
129
|
+
training_info = f"""
|
|
130
|
+
**Latest Training Dataset:**
|
|
131
|
+
* Version: {latest_training.get('version', 'N/A')}
|
|
132
|
+
* Upload Date: {latest_training.get('uploaded_at', 'N/A')}
|
|
133
|
+
"""
|
|
134
|
+
except Exception as e:
|
|
135
|
+
training_info = f"""
|
|
136
|
+
**No Training Datasets Available**
|
|
137
|
+
{str(e)}
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
challenge_details = mo.md(
|
|
141
|
+
f"""
|
|
142
|
+
## {challenge.get('name', 'Unknown Challenge')}
|
|
143
|
+
|
|
144
|
+
**Slug:** `{selected_slug}`
|
|
145
|
+
|
|
146
|
+
**Description:** {challenge.get('description', 'No description available.')}
|
|
147
|
+
|
|
148
|
+
**Status:** {'Active' if challenge.get('is_active', False) else 'Inactive'}
|
|
149
|
+
|
|
150
|
+
**Dates:** {challenge.get('start_date', 'N/A')} to {challenge.get('end_date', 'N/A')}
|
|
151
|
+
|
|
152
|
+
{period_info}
|
|
153
|
+
|
|
154
|
+
{training_info}
|
|
155
|
+
"""
|
|
156
|
+
)
|
|
157
|
+
except AuthenticationError:
|
|
158
|
+
challenge_details = mo.md("**Authentication Error!** Please check your API key.")
|
|
159
|
+
except CrowdcentAPIError as e:
|
|
160
|
+
challenge_details = mo.md(f"**API Error:** `{e}`")
|
|
161
|
+
except Exception as e:
|
|
162
|
+
challenge_details = mo.md(f"**Unexpected Error:** `{e}`")
|
|
163
|
+
|
|
164
|
+
result = mo.vstack([get_details_button, challenge_details])
|
|
165
|
+
else:
|
|
166
|
+
result = challenge_details
|
|
167
|
+
else:
|
|
168
|
+
result = challenge_details
|
|
169
|
+
|
|
170
|
+
# Display the result
|
|
171
|
+
result
|
|
172
|
+
return result
|
|
173
|
+
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
///
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# CrowdCent Challenge
|
|
2
|
+
Welcome to the documentation for the `crowdcent-challenge`. Please check back soon for detailed information about the challenge rules and format.
|
|
3
|
+
|
|
4
|
+
Anyone can submit to this documentation or improve the python client and CLI for the `crowdcent-challenge` API. Please see the [contributing guidelines](contributing.md) for more information.
|
|
5
|
+
|
|
6
|
+
Explore the rules, understand the scoring, get started with the python client, or dive into the API reference.
|
|
7
|
+
|
|
8
|
+
<div class="grid cards" markdown>
|
|
9
|
+
|
|
10
|
+
- :material-scale-balance:{ .lg .middle } Challenge Rules
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
Understand the official rules and guidelines for participating in the CrowdCent Challenge.
|
|
15
|
+
|
|
16
|
+
[:octicons-arrow-right-24: Read the Rules](rules.md)
|
|
17
|
+
|
|
18
|
+
- :material-scoreboard:{ .lg .middle } Scoring System
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
Learn how submissions are evaluated and how the leaderboard rankings work.
|
|
23
|
+
|
|
24
|
+
[:octicons-arrow-right-24: View Scoring Details](scoring.md)
|
|
25
|
+
|
|
26
|
+
- :material-language-python:{ .lg .middle } Python Client
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
Install the client library and make your first submission quickly.
|
|
31
|
+
|
|
32
|
+
[:octicons-arrow-right-24: Quick Start Guide](quickstart.md)
|
|
33
|
+
|
|
34
|
+
- :material-api:{ .lg .middle } API Reference
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
Detailed reference for the Python client and the command-line interface.
|
|
39
|
+
|
|
40
|
+
[:octicons-arrow-right-24: Explore the API](python_reference.md)
|
|
41
|
+
|
|
42
|
+
</div>
|
|
43
|
+
## Have Questions?
|
|
44
|
+
If you need immediate assistance, please email us at info@crowdcent.com or join our [Discord server](https://discord.gg/v6ZSGuTbQS).
|