diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml
index 5dc9cc7..d7c6318 100644
--- a/.github/workflows/cicd.yml
+++ b/.github/workflows/cicd.yml
@@ -22,4 +22,5 @@ jobs:
run: |
source venv/bin/activate
mypy optionsmonkey/ --ignore-missing-imports
+ black . --check --diff --color
pytest
diff --git a/README.md b/README.md
index f752ff8..fb02f49 100644
--- a/README.md
+++ b/README.md
@@ -148,7 +148,7 @@ For options, the dictionary should contain up to 7 keys:
Either "buy" or "sell". It is mandatory.
-- "prevpos" : float
+- "prev_pos" : float
Premium effectively paid or received in a previously opened position. If positive, it means that the position remains open and the payoff calculation takes this price into account, not the current price of the option. If negative, it means that the position is closed and the difference between this price and the current price is considered in the payoff calculation.
@@ -174,7 +174,7 @@ For stocks, the dictionary should contain up to 4 keys:
Either "buy" or "sell". It is mandatory.
-- "prevpos" : float
+- "prev_pos" : float
Stock price effectively paid or received in a previously opened position. If positive, it means that the position remains open and the payoff calculation takes this price into account, not thecurrent price of the stock. If negative, it means that the position is closed and the difference between this price and the current price is considered in the payoff calculation.
@@ -188,7 +188,7 @@ For a non-determined previously opened position to be closed, which might consis
It must be "closed". It is mandatory.
-- "prevpos" : float
+- "prev_pos" : float
The total value of the position to be closed, which can be positive if it made a profit or negative if it is a loss. It is mandatory.
diff --git a/examples/.ipynb_checkpoints/strategies-checkpoint.ipynb b/examples/.ipynb_checkpoints/strategies-checkpoint.ipynb
new file mode 100644
index 0000000..069345c
--- /dev/null
+++ b/examples/.ipynb_checkpoints/strategies-checkpoint.ipynb
@@ -0,0 +1,110 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "outputs": [
+ {
+ "data": {
+ "text/plain": "{'language': 'en-US',\n 'region': 'US',\n 'quoteType': 'EQUITY',\n 'typeDisp': 'Equity',\n 'quoteSourceName': 'Delayed Quote',\n 'triggerable': True,\n 'customPriceAlertConfidence': 'HIGH',\n 'currency': 'USD',\n 'marketState': 'CLOSED',\n 'regularMarketChangePercent': -0.6149154,\n 'regularMarketPrice': 404.06,\n 'exchange': 'NMS',\n 'shortName': 'Microsoft Corporation',\n 'longName': 'Microsoft Corporation',\n 'messageBoardId': 'finmb_21835',\n 'exchangeTimezoneName': 'America/New_York',\n 'exchangeTimezoneShortName': 'EST',\n 'gmtOffSetMilliseconds': -18000000,\n 'market': 'us_market',\n 'esgPopulated': False,\n 'firstTradeDateMilliseconds': 511108200000,\n 'priceHint': 2,\n 'postMarketChangePercent': -0.17571436,\n 'postMarketTime': 1708131600,\n 'postMarketPrice': 403.35,\n 'postMarketChange': -0.70999146,\n 'regularMarketChange': -2.5,\n 'regularMarketTime': 1708117201,\n 'regularMarketDayHigh': 408.27,\n 'regularMarketDayRange': '403.53 - 408.27',\n 'regularMarketDayLow': 403.53,\n 'regularMarketVolume': 22296495,\n 'regularMarketPreviousClose': 406.56,\n 'bid': 403.2,\n 'ask': 403.5,\n 'bidSize': 10,\n 'askSize': 9,\n 'fullExchangeName': 'NasdaqGS',\n 'financialCurrency': 'USD',\n 'regularMarketOpen': 407.96,\n 'averageDailyVolume3Month': 25389093,\n 'averageDailyVolume10Day': 22286910,\n 'fiftyTwoWeekLowChange': 158.45,\n 'fiftyTwoWeekLowChangePercent': 0.6451284,\n 'fiftyTwoWeekRange': '245.61 - 420.82',\n 'fiftyTwoWeekHighChange': -16.76001,\n 'fiftyTwoWeekHighChangePercent': -0.039827026,\n 'fiftyTwoWeekLow': 245.61,\n 'fiftyTwoWeekHigh': 420.82,\n 'fiftyTwoWeekChangePercent': 59.916092,\n 'dividendDate': 1710374400,\n 'earningsTimestamp': 1706653800,\n 'earningsTimestampStart': 1713869940,\n 'earningsTimestampEnd': 1714392000,\n 'trailingAnnualDividendRate': 2.86,\n 'trailingPE': 36.500454,\n 'dividendRate': 3.0,\n 'trailingAnnualDividendYield': 0.007034632,\n 'dividendYield': 0.74,\n 'epsTrailingTwelveMonths': 11.07,\n 'epsForward': 12.38,\n 'epsCurrentYear': 10.81,\n 'priceEpsCurrentYear': 37.378353,\n 'sharesOutstanding': 7430439936,\n 'bookValue': 32.06,\n 'fiftyDayAverage': 388.6076,\n 'fiftyDayAverageChange': 15.452393,\n 'fiftyDayAverageChangePercent': 0.039763484,\n 'twoHundredDayAverage': 348.3632,\n 'twoHundredDayAverageChange': 55.696808,\n 'twoHundredDayAverageChangePercent': 0.15988144,\n 'marketCap': 3002343620608,\n 'forwardPE': 32.638126,\n 'priceToBook': 12.603243,\n 'sourceInterval': 15,\n 'exchangeDataDelayedBy': 0,\n 'averageAnalystRating': '1.7 - Buy',\n 'tradeable': False,\n 'cryptoTradeable': False,\n 'displayName': 'Microsoft',\n 'symbol': 'MSFT'}"
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from optionsmonkey.api import get_options_chain\n",
+ "from optionsmonkey.utils import get_fridays_date\n",
+ "from optionsmonkey.strategies import generate_strategies\n",
+ "\n",
+ "\n",
+ "friday_in_3_weeks = get_fridays_date(weeks_until=3)\n",
+ "options = get_options_chain('MSFT', friday_in_3_weeks)\n",
+ "options.underlying"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-02-18T21:51:38.193175Z",
+ "start_time": "2024-02-18T21:51:37.970843Z"
+ }
+ },
+ "id": "83463b241c45c82b",
+ "execution_count": 7
+ },
+ {
+ "cell_type": "code",
+ "outputs": [
+ {
+ "ename": "AttributeError",
+ "evalue": "'dict' object has no attribute 'regular_market_price'",
+ "output_type": "error",
+ "traceback": [
+ "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m",
+ "\u001B[0;31mAttributeError\u001B[0m Traceback (most recent call last)",
+ "Cell \u001B[0;32mIn[6], line 1\u001B[0m\n\u001B[0;32m----> 1\u001B[0m strike \u001B[38;5;241m=\u001B[39m \u001B[43moptions\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43munderlying\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mregular_market_price\u001B[49m \u001B[38;5;241m+\u001B[39m \u001B[38;5;241m10\u001B[39m\n\u001B[1;32m 2\u001B[0m strike\n",
+ "\u001B[0;31mAttributeError\u001B[0m: 'dict' object has no attribute 'regular_market_price'"
+ ]
+ }
+ ],
+ "source": [
+ "strike = options.underlying.regular_market_price + 10\n",
+ "strike"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-02-18T21:51:16.365671Z",
+ "start_time": "2024-02-18T21:51:16.358319Z"
+ }
+ },
+ "id": "9ff9d78568685850",
+ "execution_count": 6
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# covered call"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "7af69ff8acb39e1e"
+ },
+ {
+ "cell_type": "code",
+ "outputs": [],
+ "source": [
+ "\n",
+ "\n",
+ "strategy = generate_strategies('covered-call', )"
+ ],
+ "metadata": {
+ "collapsed": true
+ },
+ "id": "initial_id",
+ "execution_count": 0
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 2
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython2",
+ "version": "2.7.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/examples/call_spread.ipynb b/examples/call_spread.ipynb
index 70d55e9..71ceada 100644
--- a/examples/call_spread.ipynb
+++ b/examples/call_spread.ipynb
@@ -221,7 +221,7 @@
}
],
"source": [
- "s,pl_total=st.getPL()\n",
+ "s,pl_total=st.get_pl()\n",
"zeroline=zeros(s.shape[0])\n",
"plt.xlabel(\"Stock price\")\n",
"plt.ylabel(\"Profit/Loss\")\n",
@@ -381,7 +381,7 @@
}
],
"source": [
- "s,pl_total=st.getPL()\n",
+ "s,pl_total=st.get_pl()\n",
"zeroline=zeros(s.shape[0])\n",
"plt.xlabel(\"Stock price\")\n",
"plt.ylabel(\"Profit/Loss\")\n",
diff --git a/examples/covered_call.ipynb b/examples/covered_call.ipynb
index 23496c6..433f026 100644
--- a/examples/covered_call.ipynb
+++ b/examples/covered_call.ipynb
@@ -113,7 +113,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "Profit/loss profiles for each leg and the overall strategy are obtained by calling the *getPL()* method and plotted at the option's maturity."
+ "Profit/loss profiles for each leg and the overall strategy are obtained by calling the *get_pl()* method and plotted at the option's maturity."
]
},
{
@@ -145,11 +145,11 @@
}
],
"source": [
- "s,pl_total=st.getPL()\n",
+ "s,pl_total=st.get_pl()\n",
"leg=[]\n",
"\n",
"for i in range(len(strategy)):\n",
- " leg.append(st.getPL(i)[1])\n",
+ " leg.append(st.get_pl(i)[1])\n",
" \n",
"zeroline=zeros(s.shape[0])\n",
"plt.xlabel(\"Stock price\")\n",
diff --git a/examples/strategies.ipynb b/examples/strategies.ipynb
new file mode 100644
index 0000000..f8e52ea
--- /dev/null
+++ b/examples/strategies.ipynb
@@ -0,0 +1,159 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "outputs": [
+ {
+ "data": {
+ "text/plain": " contractSymbol lastTradeDate strike lastPrice bid \\\n0 MSFT240315C00140000 2024-02-15 16:07:16+00:00 140.0 265.30 263.55 \n1 MSFT240315C00145000 2023-09-22 15:53:18+00:00 145.0 177.30 182.75 \n2 MSFT240315C00150000 2023-11-28 19:40:41+00:00 150.0 233.30 224.35 \n3 MSFT240315C00160000 2023-11-22 19:26:23+00:00 160.0 220.78 214.05 \n4 MSFT240315C00170000 2024-02-01 15:01:04+00:00 170.0 237.05 233.65 \n.. ... ... ... ... ... \n73 MSFT240315C00520000 2024-02-16 20:34:41+00:00 520.0 0.03 0.02 \n74 MSFT240315C00525000 2024-02-13 20:25:57+00:00 525.0 0.03 0.02 \n75 MSFT240315C00530000 2024-02-15 18:29:57+00:00 530.0 0.02 0.01 \n76 MSFT240315C00535000 2024-02-15 20:41:18+00:00 535.0 0.01 0.02 \n77 MSFT240315C00540000 2024-02-16 20:08:02+00:00 540.0 0.01 0.01 \n\n ask change percentChange volume openInterest impliedVolatility \\\n0 265.55 0.00 0.0 5.0 15 1.744142 \n1 186.00 0.00 0.0 10.0 7 0.000010 \n2 228.80 0.00 0.0 3.0 6 0.000010 \n3 217.20 0.00 0.0 1.0 11 0.000010 \n4 235.70 0.00 0.0 1.0 2 1.491213 \n.. ... ... ... ... ... ... \n73 0.04 -0.01 -25.0 9.0 546 0.339850 \n74 0.04 0.00 0.0 2.0 762 0.350592 \n75 0.04 0.00 0.0 100.0 999 0.361335 \n76 0.03 0.00 0.0 2.0 582 0.363288 \n77 0.03 -0.01 -50.0 10.0 3908 0.373053 \n\n inTheMoney contractSize currency \n0 True REGULAR USD \n1 True REGULAR USD \n2 True REGULAR USD \n3 True REGULAR USD \n4 True REGULAR USD \n.. ... ... ... \n73 False REGULAR USD \n74 False REGULAR USD \n75 False REGULAR USD \n76 False REGULAR USD \n77 False REGULAR USD \n\n[78 rows x 14 columns]",
+ "text/html": "
\n\n
\n \n \n | \n contractSymbol | \n lastTradeDate | \n strike | \n lastPrice | \n bid | \n ask | \n change | \n percentChange | \n volume | \n openInterest | \n impliedVolatility | \n inTheMoney | \n contractSize | \n currency | \n
\n \n \n \n 0 | \n MSFT240315C00140000 | \n 2024-02-15 16:07:16+00:00 | \n 140.0 | \n 265.30 | \n 263.55 | \n 265.55 | \n 0.00 | \n 0.0 | \n 5.0 | \n 15 | \n 1.744142 | \n True | \n REGULAR | \n USD | \n
\n \n 1 | \n MSFT240315C00145000 | \n 2023-09-22 15:53:18+00:00 | \n 145.0 | \n 177.30 | \n 182.75 | \n 186.00 | \n 0.00 | \n 0.0 | \n 10.0 | \n 7 | \n 0.000010 | \n True | \n REGULAR | \n USD | \n
\n \n 2 | \n MSFT240315C00150000 | \n 2023-11-28 19:40:41+00:00 | \n 150.0 | \n 233.30 | \n 224.35 | \n 228.80 | \n 0.00 | \n 0.0 | \n 3.0 | \n 6 | \n 0.000010 | \n True | \n REGULAR | \n USD | \n
\n \n 3 | \n MSFT240315C00160000 | \n 2023-11-22 19:26:23+00:00 | \n 160.0 | \n 220.78 | \n 214.05 | \n 217.20 | \n 0.00 | \n 0.0 | \n 1.0 | \n 11 | \n 0.000010 | \n True | \n REGULAR | \n USD | \n
\n \n 4 | \n MSFT240315C00170000 | \n 2024-02-01 15:01:04+00:00 | \n 170.0 | \n 237.05 | \n 233.65 | \n 235.70 | \n 0.00 | \n 0.0 | \n 1.0 | \n 2 | \n 1.491213 | \n True | \n REGULAR | \n USD | \n
\n \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n ... | \n
\n \n 73 | \n MSFT240315C00520000 | \n 2024-02-16 20:34:41+00:00 | \n 520.0 | \n 0.03 | \n 0.02 | \n 0.04 | \n -0.01 | \n -25.0 | \n 9.0 | \n 546 | \n 0.339850 | \n False | \n REGULAR | \n USD | \n
\n \n 74 | \n MSFT240315C00525000 | \n 2024-02-13 20:25:57+00:00 | \n 525.0 | \n 0.03 | \n 0.02 | \n 0.04 | \n 0.00 | \n 0.0 | \n 2.0 | \n 762 | \n 0.350592 | \n False | \n REGULAR | \n USD | \n
\n \n 75 | \n MSFT240315C00530000 | \n 2024-02-15 18:29:57+00:00 | \n 530.0 | \n 0.02 | \n 0.01 | \n 0.04 | \n 0.00 | \n 0.0 | \n 100.0 | \n 999 | \n 0.361335 | \n False | \n REGULAR | \n USD | \n
\n \n 76 | \n MSFT240315C00535000 | \n 2024-02-15 20:41:18+00:00 | \n 535.0 | \n 0.01 | \n 0.02 | \n 0.03 | \n 0.00 | \n 0.0 | \n 2.0 | \n 582 | \n 0.363288 | \n False | \n REGULAR | \n USD | \n
\n \n 77 | \n MSFT240315C00540000 | \n 2024-02-16 20:08:02+00:00 | \n 540.0 | \n 0.01 | \n 0.01 | \n 0.03 | \n -0.01 | \n -50.0 | \n 10.0 | \n 3908 | \n 0.373053 | \n False | \n REGULAR | \n USD | \n
\n \n
\n
78 rows × 14 columns
\n
"
+ },
+ "execution_count": 1,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from optionsmonkey.api import get_options_chain\n",
+ "from optionsmonkey.utils import get_fridays_date\n",
+ "\n",
+ "\n",
+ "friday_in_3_weeks = get_fridays_date(weeks_until=3)\n",
+ "options = get_options_chain('MSFT', friday_in_3_weeks)\n",
+ "options.calls"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-02-18T22:45:14.530344Z",
+ "start_time": "2024-02-18T22:45:13.636569Z"
+ }
+ },
+ "id": "83463b241c45c82b",
+ "execution_count": 1
+ },
+ {
+ "cell_type": "code",
+ "outputs": [
+ {
+ "data": {
+ "text/plain": " contractSymbol lastTradeDate strike lastPrice bid \\\n53 MSFT240315C00420000 2024-02-16 20:58:23+00:00 420.0 3.65 3.5 \n\n ask change percentChange volume openInterest impliedVolatility \\\n53 3.65 -0.63 -14.719627 4882.0 14688 0.214424 \n\n inTheMoney contractSize currency \n53 False REGULAR USD ",
+ "text/html": "\n\n
\n \n \n | \n contractSymbol | \n lastTradeDate | \n strike | \n lastPrice | \n bid | \n ask | \n change | \n percentChange | \n volume | \n openInterest | \n impliedVolatility | \n inTheMoney | \n contractSize | \n currency | \n
\n \n \n \n 53 | \n MSFT240315C00420000 | \n 2024-02-16 20:58:23+00:00 | \n 420.0 | \n 3.65 | \n 3.5 | \n 3.65 | \n -0.63 | \n -14.719627 | \n 4882.0 | \n 14688 | \n 0.214424 | \n False | \n REGULAR | \n USD | \n
\n \n
\n
"
+ },
+ "execution_count": 2,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from optionsmonkey.utils import coerce_to_multiple\n",
+ "\n",
+ "strike = coerce_to_multiple(options.underlying.regular_market_price + 15)\n",
+ "options_at_strike = options.calls[options.calls['strike'] == strike]\n",
+ "options_at_strike"
+ ],
+ "metadata": {
+ "collapsed": false,
+ "ExecuteTime": {
+ "end_time": "2024-02-18T22:45:16.093407Z",
+ "start_time": "2024-02-18T22:45:16.084652Z"
+ }
+ },
+ "id": "9ff9d78568685850",
+ "execution_count": 2
+ },
+ {
+ "cell_type": "markdown",
+ "source": [
+ "# covered call"
+ ],
+ "metadata": {
+ "collapsed": false
+ },
+ "id": "7af69ff8acb39e1e"
+ },
+ {
+ "cell_type": "code",
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/Users/mnhmbp/PycharmProjects/optionsmonkey/venv/lib/python3.10/site-packages/pydantic/main.py:171: FutureWarning: Calling float on a single element Series is deprecated and will raise a TypeError in the future. Use float(ser.iloc[0]) instead\n",
+ " self.__pydantic_validator__.validate_python(data, self_instance=self)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "P/L profile diagram:\n",
+ "--------------------\n",
+ "The vertical green dashed line corresponds to the position of the stock's spot price. The right and left arrow markers indicate the strike prices of calls and puts, respectively, with blue representing long and red representing short positions.\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": "