{
  "fetched_at": "2026-10-19T12:32:24Z",
  "source_url": "https://www.kaggle.com/competitions/caltech-cs155-2020/data",
  "pages": [
    {
      "name": "rules",
      "content": "# FINALIZE YOUR TEAMS BEFORE YOU MAKE SUBMISSIONS\n\nKaggle will make your life **very difficult** if you attempt to make independent submissions before merging into a team.\n\n# No Additional Data\n\nYou are not allowed to use any data outside that which has been provided on this Kaggle competition. We have made a reasonable effort to obfuscate the data source and time period, but any infractions will be treated as a violation of the honor code.\n\n# One account per participant\n\nYou cannot sign up to Kaggle from multiple accounts and therefore you cannot submit from multiple accounts.\n\n# No private sharing outside teams\n\nPrivately sharing code/data/predictions/model weights/hyperparameters outside of teams is not permitted. It's OK to share code if made available to all participants on the Piazza.\n\n# Team Limits\n\nThe maximum size of a team is 3 participants.\n\n# Submission Limits\n\nYour team may submit a maximum of 12 entries per day. You may select up to 2 final submissions for judging.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "data-description",
      "content": "<h2>File descriptions</h2>\n<ul>\n<li><strong>train.csv</strong> - the training set</li>\n<li><strong>test.csv</strong> - the test set. Note that id's in the test set are not chronologically ordered.</li>\n<li><strong>sample_submission.csv</strong> - a sample submission file in the correct format. The Predicted column should be the probability of class \"1\" in the \"y\" column. This is the (relative) probability that the mid price will go strictly up (>0).</li>\n</ul>\n\n<h2>Terminology</h2>\n<li><strong>order</strong> - An order is a request to buy or sell the contract at a certain price with certain quantity.</li>\n<li><strong>fill</strong> - To fill an existing order is to fulfill it. Example: The order book is currently empty. James sends in an order to buy 100 contracts at $1.00. Jim then sends in an order to sell 100 contracts at $1.00. Jim has \"filled\" James's order.</li> \n<li><strong>order book</strong> - a data structure representing all the unfilled orders. Orders in the book are filled in the priority of price, and then time (whoever submitted the best price first gets filled).</li>\n<li><strong>bid</strong> - you bid when you put in a buy order. \"Bid $X to buy a good\"</li>\n<li><strong>ask</strong> - you ask when you put in a sell order. \"Ask for $X to sell a good\". In an order book, BID IS ALWAYS LESS THAN ASK. Think of why this might be.</li>\n\n<h2>Data fields</h2>\n<ul>\n<li><strong>id</strong> - The timestep ID of the order book features. In the training set, <strong>id</strong> is ordered chronologically. However, in the test set, they are scrambled so that you cannot simply use the order book features of future data to make fake \"predictions\" in previous timesteps. To keep the competition more of a ML problem and less of a math problem, this scrambling also prevents timeseries modelling. If you would like, you could try to unscramble the ordering using some ML.</li>\n<li><strong>last_price</strong> - the price at which the most recent order fill occurred.</li>\n<li><strong>mid</strong> - the \"mid\" price, which is the average of the best bid (bid1) and the best ask (ask1)  prices.</li>\n<li><strong>opened_position_qty</strong> - In the past 500ms, how many buy orders were filled?</li>\n<li><strong>closed_position_qty</strong> - In the past 500ms, how many sell orders were filled?</li>\n<li><strong>transacted_qty</strong> - In the past 500ms, how many buy+sell orders were filled?</li>\n<li><strong>d_open_interest</strong> - In the past 500ms, what is (#buy orders filled)- (#sell orders filled)?</li>\n<li><strong>bid1</strong> - What is the 1st bid price (the best/highest one)?</li>\n<li><strong>bid[2,3,4,5]</strong> - What is the [2nd, 3rd, 4th, 5th] best/highest bid price?</li>\n<li><strong>ask1</strong> - What is the 1st ask price (the best/lowest/cheapest one)?</li>\n<li><strong>ask[2,3,4,5]</strong> - What is the [2nd, 3rd, 4th, 5th] best/lowest/cheapest ask price?</li>\n<li><strong>bid1vol</strong> - What is the quantity of contracts in the order book at the 1st bid price (the best/highest one)?</li>\n<li><strong>bid[2,3,4,5]vol</strong> - What is the quantity of contracts in the order book at the [2,3,4,5]th bid price (the [2,3,4,5]th best/highest one)?</li>\n<li><strong>ask1vol</strong> - What is the quantity of contracts in the order book at the 1st ask price (the best/lowest/cheapest one)?</li>\n<li><strong>ask[2,3,4,5]vol</strong> - What is the quantity of contracts in the order book at the [2,3,4,5]th ask price (the [2,3,4,5]th best/lowest/cheapest one)?</li>\n\n<li><strong>y</strong> (unique to training data) - What is the change in the mid price from now to 2 timesteps (approx. 1 second) in the future? \"1\" means this change is strictly positive, and \"0\" means the change is 0 or negative.</li>\n\n</ul>\n\n### Missing fields\n\nMissing fields are simply empty. It is up to you how you would like to fill them in.\n\n### Arent financial price movements random, unpredictable, and Gaussian?\n\nUsually, you get random and unpredictable, but not quite Gaussian. At this time scale, the order book actually leaks enough information on future prices to make decent predictions. Unfortunately, being speedy enough to make money on them is a much more difficult problem.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Description",
      "content": "<p>For this Kaggle competition, you will be using 500ms aggregate \"high\" frequency order book data of a futures contract to predict future 1-second price changes.</p>\n\n<p>Each row of data represents one snapshot in time. For the label \"y\", an entry of \"1\" means the \"mid\" price will go up (strictly up), and \"0\" means the mid price will either not move or go down. You should predict the relative probability of a \"1\" at each timestep of the test set.</p>\n\n<p>There can be 12 submissions per day per team and submission window will close on Thursday 13 FEB 2020 at 2:00PM PST.</p>\n\n<p>You may not use any additional data sources.</p>\n\n<h2>Acknowledgements</h2>\n<p>We thank Jim for providing this dataset.</p>\n\n### Non-enrolled entries will be aggregated into a TA benchmark (grey) and will not count towards student scores.\n\nThe average student is not expected to reach this aggregate, since non-enrolled people usually have significantly more experience.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Evaluation",
      "content": "<p>The evaluation metric for this competition is the <a href=\"https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve\"> ROC-AUC Score/Metric</a>. This means you can submit probabilities instead of 1's and 0's. More specifically, predict the probability of a \"1\" (mid price strictly increases) occurring.\n\n### The AUC metric\n\nDue to AUC's computation method (vary a decision threshold and calculate an integral), the exact class probability is not important for prediction, only the relative probabilities between the predictions. Unless you are trying to aggregate multiple different model classes, you do not need to worry much about calibrating the exact probability.\n\n<hr />\n<h2>Submission Format</h2>\n<p><strong>For every timestep (id) in the test.csv dataset</strong>, submission files should contain an associated probability of the mid price strictly increasing in the next 2 timesteps. See the sample submission for an example.</p>",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Prizes",
      "content": "#Eternal glory\n\nThe winner(s) will be announced in class on Thursday. This competition and results page will persist for as long as Kaggle (now acquired by Alphabet) does, which means...\n\n#Evidence-backed resume padding\n\nhttps://www.kaggle.com/c/caltech-cs-155-2019-part-1/leaderboard\nhttps://www.kaggle.com/c/caltech-cs-155-2019-final/leaderboard\nhttps://www.kaggle.com/c/caltech-cs-155-2018/leaderboard/\n\nIn the TA's experience, every firm asked about the CS155 Kaggle links and methodology on their resume. If you are interested in similar problems to this Kaggle, contact Jim after the competition.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    },
    {
      "name": "Tips",
      "content": "#Anaconda\n\nIf using Python, pandas is recommended for data manipulation. For prediction, one can start with some typical models in scikit-learn. **pandas, numpy, sklearn are all included in Anaconda.**\n\n#Useful pandas functions\n```\ndf_test = pd.read_csv('filename.csv', index_col=0)\ndf_test['Predicted'] = model.predict_proba(x_test)[:,1]\ndf_test[['Predicted']].to_csv('submission.csv')\n```\n\n#Don't be afraid to try things you haven't heard of before\n\nAfter some basic models, one can progress to some more advanced models in other libraries. Maybe search around a bit for cool or successful models that people have used for classification.\n\n#IDE/Shortcuts\n\nLearn all the shortcuts to your development environment. Spyder and Jupyter are both included in Anaconda, and there are plenty of shortcuts to run specific code sections swiftly.\n\n#Missing data\n\nThink of how to fill in the missing data. Note that the id's for testing data is scrambled, so using the \"previous\" row is not necessarily reasonable.\n\n#Feature engineering\n\nDon't try any timeseries models, but you can certainly engineer a few more features out of the available columns.\n\n#Model blending\n\nWhy use one model when you can take the average of multiple model outputs, or even use another model on top of the model outputs?\n\n#Probability calibration\n\nSome models don't have accurate classification probabilities, but one can calibrate them using various techniques. This doesn't help much for individual models due to the AUC metric, but allows for \"fairer\" model blending if you plan to take a simple average.\n\n#Hyperparameter tuning\n\nTry not to do tuning by hand unless you want to sit at the computer forever. Gain some intuition and then try some automatic tuners! You will likely learn how to save progress to disk.",
      "isPublished": false,
      "hasIsPublished": false,
      "postTitle": "",
      "hasPostTitle": false,
      "mimeType": "",
      "hasMimeType": false
    }
  ]
}