Wednesday, November 4, 2020

The Pylance - Goodbye Kite

Goodbye Kite.

Fast, feature-rich language support for Python in Visual Studio Code

The name Pylance serves as a nod to Monty Python’s Lancelot, who is the first knight to answer the bridge keeper’s questions in the Holy Grail.


(cheers John Cleese et al.)

Expecting Pybrian plugin in the near future :)

The Quntopian has drawn to the close

The Quantopian has been brought to the end but some of their valuable resources have been placed on the github.

[1] Quantopian research 

[2] Community classes 

[3] ... (?)


Saturday, October 3, 2020

Black-Sholes delta


import numpy as np 
from scipy.stats import norm

def delta(flag, s, k, t, r, v): 
  d1 = (np.log(s/k)+(r+v*v/2)*t)/(v*np.sqrt(t)) 
  if flag == “C”:
    return norm.cdf(d1) 
  else: 
    return norm.cdf(-d1) # +signed put delta

Type = ‘C’ # call
S = 97.65 # underlying
K = 100.00 # strike
T = 30/365 # 30 days to expiry (in years)
R = 0.00 # “risk-free” rate
V = 0.12 # 12 vol
delta(Type, S, K, T, R, V)

0.25044822

Type = ‘P’
S = 3000
K = 2900
T = 30/365
R = 0.00
V = 0.20
delta(Type, S, K, T, R, V)

0.27

S = 2950
T = 29/365
delta(Type, S, K, T, R, V)

0.37

Saturday, December 6, 2014

LNK2001: unresolved external symbol __imp__PyObject_IsTrue

Recently I was experiencing following liknking error [1] .
I was checking path VC++ directories settings, upgrading from boost 1.55 to 1.57, still the same issue. After couple of ours, the resolution was so simple, I could not believe I can be so absent minded.

Never try to compile project referencing 32bit of boost, and linking 64bit Python engine.

[1] error LNK2001: unresolved external symbol __imp__PyObject_IsTrue    %PATH%\libboost_python-vc120-mt-gd-1_55.lib(class.obj)   

Thursday, November 20, 2014

Boost::Python callback triggered from Non-Python created threads

Consider  we have virtual/abstract C++ class that's fully implemented in Python. And for some sake of necessity we have a callback method (e.g. as some sort of event) that is being triggered from different thread on C++ side and is handled in Python .
In such case corresponding callback methods have to manage global interpreter lock state with PyGILState_STATE member variable.
So the resulting C++ callback class definition will look like below (notice that Python method calls are wrapped up with GIL state handling code).


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class SessionStatusListenerCallback : public SessionStatusListener
{
public:
 SessionStatusListenerCallback(PyObject *pyObject)
  : self(pyObject) {}

 SessionStatusListenerCallback(PyObject* pyObject, const SessionStatusListener& listener)
  : self(pyObject), SessionStatusListener(listener) {}

 void onSessionStatusChanged(O2GSessionStatus status)
 {
  // GIL state handler
  PyGILState_STATE gstate;
  gstate = PyGILState_Ensure();
  // Python callback
  call_method<void>(self, "onSessionStatusChanged", status);
  // GIL handler release
  PyGILState_Release(gstate);
 }
 
 void onLoginFailed(const char* error)
 {
  // GIL state handler
  PyGILState_STATE gstate;
  gstate = PyGILState_Ensure();
  // Python callback
  call_method<void>(self, "onLoginFailed", error);
  // GIL handler release
  PyGILState_Release(gstate);
 }
private:
 PyObject* const self;
};
 
 

Wednesday, November 12, 2014

Microsoft Visual C++ Compiler for Python 2.7

New tool Microsoft Visual C++ Compiler for Python 2.7 is available. 
I have not tested it yet. But solution for: 
The typical error message you will receive if you need this compiler package is Unable to find vcvarsall.bat. 
 sounds promising :)

Friday, November 7, 2014

Handling "AddressAccessDeniedException: HTTP could not register URL" error

Having self hosting WCF service one can get following exception:

AddressAccessDeniedException: HTTP could not register URL http://+:13025/

By default, listening at a particular HTTP address requires administrator privileges. Since application users does not often have such privileges it's necessary to allow port listening for particular user or group via nesth.

E.g.

netsh http add urlacl url=http://+:13025/applicationsvcs/booking user=DOMAIN\app_account

Proxying WCF service through the Fiddler

Set Fiddler as system wide proxy with preferred port (e.g. 8888).
Change app config of the WCF service host application as follows

<system.net>
  <defaultProxy
            enabled = "true"
            useDefaultCredentials = "true">
   <proxy autoDetect="false" bypassonlocal="false" proxyaddress="http://127.0.0.1:8888"    usesystemdefault="false" />
  </defaultProxy>
</system.net>

That's it.

Wednesday, August 27, 2014

How to handle pure virtuals with optional argumets in Boost::Python

Let's assume we have following C++ snippet:


class A
{
public:
  virtual void Method1(const char* par1, IInterface* p = 0) = 0;
};
How to handle default value for paremeter p? 
My first idea was using BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS as per boost doc.

class AWrap: public A, public wrapper<A>
{
public:
  void Method1(const char* par1, IInterface* p = 0){ this->get_override("Method1")();}
};

BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(method_overload, IInterface::onRequestCompleted, 1, 2)

class_<AWrap>("A")
  .def("Method1", &A::Method1, method_overload())
   ;

This would solve the optionality of the parameter, hovewer how to pass any default value? So I've ended up using args:

class_<AWrap>("A")
  .def("Method1", &A::Method1, (arg("par1"), arg("p") = 0))
   ;